4. Resulting Hash (SHA-256)
@@ -193,18 +267,30 @@ export default function App() {
{/* Mining Controls */}
{!isMining ? (
-
diff --git a/docs/blog/2025-08-28-cpu-core-odd/ProofOfWorkDiagram/styles.module.css b/docs/blog/2025-08-28-cpu-core-odd/ProofOfWorkDiagram/styles.module.css
index 419b4048..157f8402 100644
--- a/docs/blog/2025-08-28-cpu-core-odd/ProofOfWorkDiagram/styles.module.css
+++ b/docs/blog/2025-08-28-cpu-core-odd/ProofOfWorkDiagram/styles.module.css
@@ -48,7 +48,9 @@
background-color: rgb(31 41 55);
padding: 1.5rem;
border-radius: 0.5rem;
- box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
+ box-shadow:
+ 0 10px 15px -3px rgb(0 0 0 / 0.1),
+ 0 4px 6px -4px rgb(0 0 0 / 0.1);
height: 100%;
display: flex;
flex-direction: column;
@@ -158,7 +160,9 @@
.hashContainer {
padding: 1.5rem;
border-radius: 0.5rem;
- box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
+ box-shadow:
+ 0 10px 15px -3px rgb(0 0 0 / 0.1),
+ 0 4px 6px -4px rgb(0 0 0 / 0.1);
transition: all 300ms;
border: 2px solid;
}
diff --git a/docs/docs/admin/_category_.json b/docs/docs/admin/_category_.json
index 4b7ba50a..a5586551 100644
--- a/docs/docs/admin/_category_.json
+++ b/docs/docs/admin/_category_.json
@@ -5,4 +5,4 @@
"type": "generated-index",
"description": "Tradeoffs and considerations you may want to keep in mind when using Anubis."
}
-}
\ No newline at end of file
+}
diff --git a/docs/docs/admin/configuration/_category_.json b/docs/docs/admin/configuration/_category_.json
index e22c7a2f..6b797b2b 100644
--- a/docs/docs/admin/configuration/_category_.json
+++ b/docs/docs/admin/configuration/_category_.json
@@ -5,4 +5,4 @@
"type": "generated-index",
"description": "Detailed information about configuring parts of Anubis."
}
-}
\ No newline at end of file
+}
diff --git a/docs/docs/admin/configuration/challenges/_category_.json b/docs/docs/admin/configuration/challenges/_category_.json
index 96a70d2f..a01e84f1 100644
--- a/docs/docs/admin/configuration/challenges/_category_.json
+++ b/docs/docs/admin/configuration/challenges/_category_.json
@@ -2,4 +2,4 @@
"label": "Challenges",
"position": 10,
"link": null
-}
\ No newline at end of file
+}
diff --git a/docs/docs/admin/configuration/expressions.mdx b/docs/docs/admin/configuration/expressions.mdx
index 762b848b..109b9c0a 100644
--- a/docs/docs/admin/configuration/expressions.mdx
+++ b/docs/docs/admin/configuration/expressions.mdx
@@ -243,16 +243,16 @@ function regexSafe(input: string): string;
`regexSafe` takes a string and escapes it for safe use inside of a regular expression. This is useful when you are creating regular expressions from headers or variables such as `remoteAddress`.
-| Input | Output |
-| :------------------------ | :------------------------------ |
-| `regexSafe("1.2.3.4")` | `1\\.2\\.3\\.4` |
-| `regexSafe("techaro.lol")` | `techaro\\.lol` |
-| `regexSafe("star*")` | `star\\*` |
-| `regexSafe("plus+")` | `plus\\+` |
-| `regexSafe("{braces}")` | `\\{braces\\}` |
-| `regexSafe("start^")` | `start\\^` |
-| `regexSafe("back\\slash")` | `back\\\\slash` |
-| `regexSafe("dash-dash")` | `dash\\-dash` |
+| Input | Output |
+| :------------------------- | :-------------- |
+| `regexSafe("1.2.3.4")` | `1\\.2\\.3\\.4` |
+| `regexSafe("techaro.lol")` | `techaro\\.lol` |
+| `regexSafe("star*")` | `star\\*` |
+| `regexSafe("plus+")` | `plus\\+` |
+| `regexSafe("{braces}")` | `\\{braces\\}` |
+| `regexSafe("start^")` | `start\\^` |
+| `regexSafe("back\\slash")` | `back\\\\slash` |
+| `regexSafe("dash-dash")` | `dash\\-dash` |
### `segments`
@@ -301,9 +301,9 @@ function arpaReverseIP(ip: string): string;
`arpaReverseIP` takes an IP address and returns its value in [ARPA notation](https://www.ietf.org/rfc/rfc2317.html). This can be useful when matching PTR record patterns.
-| Input | Output |
-| :----------------------------- | :------------------------------------------------------------------- |
-| `arpaReverseIP("1.2.3.4")` | `4.3.2.1` |
+| Input | Output |
+| :----------------------------- | :---------------------------------------------------------------- |
+| `arpaReverseIP("1.2.3.4")` | `4.3.2.1` |
| `arpaReverseIP("2001:db8::1")` | `1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2` |
#### `lookupHost`
diff --git a/docs/docs/admin/default-allow-behavior.mdx b/docs/docs/admin/default-allow-behavior.mdx
index 6249e735..1b87183e 100644
--- a/docs/docs/admin/default-allow-behavior.mdx
+++ b/docs/docs/admin/default-allow-behavior.mdx
@@ -89,4 +89,4 @@ If you want to deny all traffic except what you explicitly allow, add a catch-al
- The implicit allow rule is always last and cannot be removed.
- Use your logs to monitor what traffic is being allowed by default.
-See [Policy Definitions](./policies) for more details on writing rules.
\ No newline at end of file
+See [Policy Definitions](./policies) for more details on writing rules.
diff --git a/docs/docs/admin/environments/_category_.json b/docs/docs/admin/environments/_category_.json
index 31522719..a9150a73 100644
--- a/docs/docs/admin/environments/_category_.json
+++ b/docs/docs/admin/environments/_category_.json
@@ -5,4 +5,4 @@
"type": "generated-index",
"description": "Detailed information about individual environments (such as HTTP servers, platforms, etc.) Anubis is known to work with."
}
-}
\ No newline at end of file
+}
diff --git a/docs/docs/admin/environments/kubernetes.mdx b/docs/docs/admin/environments/kubernetes.mdx
index e10f18e2..eac57292 100644
--- a/docs/docs/admin/environments/kubernetes.mdx
+++ b/docs/docs/admin/environments/kubernetes.mdx
@@ -94,10 +94,8 @@ containers:
- ALL
seccompProfile:
type: RuntimeDefault
-
```
-
Then add a Service entry for Anubis:
```yaml
diff --git a/docs/docs/admin/environments/nginx/conf-anubis.inc b/docs/docs/admin/environments/nginx/conf-anubis.inc
index 6e5083ae..bc20e8f4 100644
--- a/docs/docs/admin/environments/nginx/conf-anubis.inc
+++ b/docs/docs/admin/environments/nginx/conf-anubis.inc
@@ -1,8 +1,2 @@
-# /etc/nginx/conf-anubis.inc
-
-# Forward to anubis
-location / {
- proxy_set_header Host $host;
- proxy_set_header X-Real-IP $remote_addr;
- proxy_pass http://anubis;
-}
\ No newline at end of file
+# /etc/nginx/conf-anubis.inc # Forward to anubis location / { proxy_set_header
+Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_pass http://anubis; }
diff --git a/docs/docs/admin/environments/traefik.mdx b/docs/docs/admin/environments/traefik.mdx
index 197ddc19..04df792d 100644
--- a/docs/docs/admin/environments/traefik.mdx
+++ b/docs/docs/admin/environments/traefik.mdx
@@ -75,7 +75,7 @@ services:
# Telling Anubis, where to listen for Traefik
- BIND=:8080
# Telling Anubis to do redirect — ensure there is a space after '='
- - 'TARGET= '
+ - "TARGET= "
# Specifies which domains Anubis is allowed to redirect to.
- REDIRECT_DOMAINS=example.com
# Should be the full external URL for Anubis (including scheme)
diff --git a/docs/docs/admin/frameworks/_category_.json b/docs/docs/admin/frameworks/_category_.json
index 28eefe88..253bf449 100644
--- a/docs/docs/admin/frameworks/_category_.json
+++ b/docs/docs/admin/frameworks/_category_.json
@@ -5,4 +5,4 @@
"type": "generated-index",
"description": "Information about getting specific frameworks or tools working with Anubis."
}
-}
\ No newline at end of file
+}
diff --git a/docs/docs/admin/honeypot/_category_.json b/docs/docs/admin/honeypot/_category_.json
index bc0581e9..90c63375 100644
--- a/docs/docs/admin/honeypot/_category_.json
+++ b/docs/docs/admin/honeypot/_category_.json
@@ -5,4 +5,4 @@
"type": "generated-index",
"description": "Honeypot features in Anubis, allowing Anubis to passively detect malicious crawlers."
}
-}
\ No newline at end of file
+}
diff --git a/docs/docs/admin/installation.mdx b/docs/docs/admin/installation.mdx
index 7642526e..6ecaa5a1 100644
--- a/docs/docs/admin/installation.mdx
+++ b/docs/docs/admin/installation.mdx
@@ -67,7 +67,7 @@ Currently the following settings are configurable via the policy file:
Anubis uses these environment variables for configuration:
| Environment Variable | Default value | Explanation |
-|:-------------------------------|:------------------------|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| :----------------------------- | :---------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `ASSET_LOOKUP_HEADER` | unset |
If set, use the contents of this header in requests when looking up custom assets in `OVERLAY_FOLDER`. See [Header-based overlay dispatch](./botstopper.mdx#header-based-overlay-dispatch) for more details. |
| `BASE_PREFIX` | unset | If set, adds a global prefix to all Anubis endpoints (everything starting with `/.within.website/x/anubis/`). For example, setting this to `/myapp` would make Anubis accessible at `/myapp/` instead of `/`. This is useful when running Anubis behind a reverse proxy that routes based on path prefixes. |
| `BIND` | `:8923` | The network address that Anubis listens on. For `unix`, set this to a path: `/run/anubis/instance.sock` |
@@ -123,7 +123,7 @@ If you don't know or understand what these settings mean, ignore them. These are
| `TARGET_DISABLE_KEEPALIVE` | `false` | If `true`, disables HTTP keep-alive for connections to the target backend. Useful for backends that don't handle keep-alive properly. |
| `TARGET_HOST` | unset | If set, overrides the Host header in requests forwarded to `TARGET`. |
| `TARGET_INSECURE_SKIP_VERIFY` | `false` | If `true`, skip TLS certificate validation for targets that listen over `https`. If your backend does not listen over `https`, ignore this setting. |
-| `TARGET_SNI` | unset | If set, TLS handshake hostname when forwarding requests to the `TARGET`. If set to auto, use Host header. |
+| `TARGET_SNI` | unset | If set, TLS handshake hostname when forwarding requests to the `TARGET`. If set to auto, use Host header. |
diff --git a/docs/docs/admin/roles/_category_.json b/docs/docs/admin/roles/_category_.json
index 2d5af0b3..d087404d 100644
--- a/docs/docs/admin/roles/_category_.json
+++ b/docs/docs/admin/roles/_category_.json
@@ -5,4 +5,4 @@
"type": "generated-index",
"description": "Various server roles you will need to keep in mind with Anubis."
}
-}
\ No newline at end of file
+}
diff --git a/docs/docs/design/_category_.json b/docs/docs/design/_category_.json
index 65764e85..87b1010e 100644
--- a/docs/docs/design/_category_.json
+++ b/docs/docs/design/_category_.json
@@ -5,4 +5,4 @@
"type": "generated-index",
"description": "How Anubis is designed and the tradeoffs it makes."
}
-}
\ No newline at end of file
+}
diff --git a/docs/docs/developer/_category_.json b/docs/docs/developer/_category_.json
index cf3805e0..0b24e3b0 100644
--- a/docs/docs/developer/_category_.json
+++ b/docs/docs/developer/_category_.json
@@ -5,4 +5,4 @@
"type": "generated-index",
"description": "Guides and suggestions to make Anubis development go smoothly for everyone."
}
-}
\ No newline at end of file
+}
diff --git a/docs/docs/user/_category_.json b/docs/docs/user/_category_.json
index ce1dbafe..2e646499 100644
--- a/docs/docs/user/_category_.json
+++ b/docs/docs/user/_category_.json
@@ -5,4 +5,4 @@
"type": "generated-index",
"description": "Information for users on sites that use Anubis."
}
-}
\ No newline at end of file
+}
diff --git a/docs/docusaurus.config.ts b/docs/docusaurus.config.ts
index df12939b..e686522f 100644
--- a/docs/docusaurus.config.ts
+++ b/docs/docusaurus.config.ts
@@ -1,62 +1,62 @@
-import { themes as prismThemes } from 'prism-react-renderer';
-import type { Config } from '@docusaurus/types';
-import type * as Preset from '@docusaurus/preset-classic';
+import { themes as prismThemes } from "prism-react-renderer";
+import type { Config } from "@docusaurus/types";
+import type * as Preset from "@docusaurus/preset-classic";
// This runs in Node.js - Don't use client-side code here (browser APIs, JSX...)
const config: Config = {
- title: 'Anubis',
- tagline: 'Weigh the soul of incoming HTTP requests to protect your website!',
- favicon: 'img/favicon.ico',
+ title: "Anubis",
+ tagline: "Weigh the soul of incoming HTTP requests to protect your website!",
+ favicon: "img/favicon.ico",
// Set the production url of your site here
- url: 'https://anubis.techaro.lol',
+ url: "https://anubis.techaro.lol",
// Set the /
/ pathname under which your site is served
// For GitHub pages deployment, it is often '//'
- baseUrl: '/',
+ baseUrl: "/",
// GitHub pages deployment config.
// If you aren't using GitHub pages, you don't need these.
- organizationName: 'TecharoHQ', // Usually your GitHub org/user name.
- projectName: 'anubis', // Usually your repo name.
+ organizationName: "TecharoHQ", // Usually your GitHub org/user name.
+ projectName: "anubis", // Usually your repo name.
- onBrokenLinks: 'throw',
- onBrokenMarkdownLinks: 'warn',
+ onBrokenLinks: "throw",
+ onBrokenMarkdownLinks: "warn",
// Even if you don't use internationalization, you can use this field to set
// useful metadata like html lang. For example, if your site is Chinese, you
// may want to replace "en" with "zh-Hans".
i18n: {
- defaultLocale: 'en',
- locales: ['en'],
+ defaultLocale: "en",
+ locales: ["en"],
},
markdown: {
mermaid: true,
},
- themes: ['@docusaurus/theme-mermaid'],
+ themes: ["@docusaurus/theme-mermaid"],
presets: [
[
- 'classic',
+ "classic",
{
blog: {
showReadingTime: true,
feedOptions: {
- type: ['rss', 'atom', "json"],
+ type: ["rss", "atom", "json"],
xslt: true,
},
- editUrl: 'https://github.com/TecharoHQ/anubis/tree/main/docs/',
- onInlineTags: 'warn',
- onInlineAuthors: 'warn',
- onUntruncatedBlogPosts: 'throw',
+ editUrl: "https://github.com/TecharoHQ/anubis/tree/main/docs/",
+ onInlineTags: "warn",
+ onInlineAuthors: "warn",
+ onUntruncatedBlogPosts: "throw",
},
docs: {
- sidebarPath: './sidebars.ts',
- editUrl: 'https://github.com/TecharoHQ/anubis/tree/main/docs/',
+ sidebarPath: "./sidebars.ts",
+ editUrl: "https://github.com/TecharoHQ/anubis/tree/main/docs/",
},
theme: {
- customCss: './src/css/custom.css',
+ customCss: "./src/css/custom.css",
},
} satisfies Preset.Options,
],
@@ -67,47 +67,47 @@ const config: Config = {
respectPrefersColorScheme: true,
},
// Replace with your project's social card
- image: 'img/social-card.jpg',
+ image: "img/social-card.jpg",
navbar: {
- title: 'Anubis',
+ title: "Anubis",
logo: {
- alt: 'A happy jackal woman with brown hair and red eyes',
- src: 'img/favicon.webp',
+ alt: "A happy jackal woman with brown hair and red eyes",
+ src: "img/favicon.webp",
},
items: [
- { to: '/blog', label: 'Blog', position: 'left' },
+ { to: "/blog", label: "Blog", position: "left" },
{
- type: 'docSidebar',
- sidebarId: 'tutorialSidebar',
- position: 'left',
- label: 'Docs',
+ type: "docSidebar",
+ sidebarId: "tutorialSidebar",
+ position: "left",
+ label: "Docs",
},
{
- to: '/docs/admin/botstopper',
+ to: "/docs/admin/botstopper",
label: "Unbranded Version",
- position: "left"
+ position: "left",
},
{
- href: 'https://github.com/TecharoHQ/anubis',
- label: 'GitHub',
- position: 'right',
+ href: "https://github.com/TecharoHQ/anubis",
+ label: "GitHub",
+ position: "right",
},
{
- href: 'https://github.com/sponsors/Xe',
+ href: "https://github.com/sponsors/Xe",
label: "Sponsor the Project",
- position: 'right'
+ position: "right",
},
],
},
footer: {
- style: 'dark',
+ style: "dark",
links: [
{
- title: 'Docs',
+ title: "Docs",
items: [
{
- label: 'Intro',
- to: '/docs/',
+ label: "Intro",
+ to: "/docs/",
},
{
label: "Installation",
@@ -116,32 +116,32 @@ const config: Config = {
],
},
{
- title: 'Community',
+ title: "Community",
items: [
{
- label: 'GitHub Discussions',
- href: 'https://github.com/TecharoHQ/anubis/discussions',
+ label: "GitHub Discussions",
+ href: "https://github.com/TecharoHQ/anubis/discussions",
},
{
- label: 'Bluesky',
- href: 'https://bsky.app/profile/techaro.lol',
+ label: "Bluesky",
+ href: "https://bsky.app/profile/techaro.lol",
},
],
},
{
- title: 'More',
+ title: "More",
items: [
{
- label: 'Blog',
- to: '/blog',
+ label: "Blog",
+ to: "/blog",
},
{
- label: 'GitHub',
- href: 'https://github.com/TecharoHQ/anubis',
+ label: "GitHub",
+ href: "https://github.com/TecharoHQ/anubis",
},
{
- label: 'Status',
- href: 'https://techarohq.github.io/status/'
+ label: "Status",
+ href: "https://techarohq.github.io/status/",
},
],
},
@@ -153,13 +153,13 @@ const config: Config = {
darkTheme: prismThemes.dracula,
magicComments: [
{
- className: 'code-block-diff-add-line',
- line: 'diff-add'
+ className: "code-block-diff-add-line",
+ line: "diff-add",
},
{
- className: 'code-block-diff-remove-line',
- line: 'diff-remove'
- }
+ className: "code-block-diff-remove-line",
+ line: "diff-remove",
+ },
],
},
} satisfies Preset.ThemeConfig,
diff --git a/docs/manifest/ingress.yaml b/docs/manifest/ingress.yaml
index 52478361..8ce3b9fc 100644
--- a/docs/manifest/ingress.yaml
+++ b/docs/manifest/ingress.yaml
@@ -21,4 +21,4 @@ spec:
service:
name: anubis-docs
port:
- name: anubis
\ No newline at end of file
+ name: anubis
diff --git a/docs/manifest/onionservice.yaml b/docs/manifest/onionservice.yaml
index 81ab9729..e0584468 100644
--- a/docs/manifest/onionservice.yaml
+++ b/docs/manifest/onionservice.yaml
@@ -5,10 +5,10 @@ metadata:
spec:
version: 3
rules:
- - port:
- number: 80
- backend:
- service:
- name: anubis-docs
- port:
- number: 80
\ No newline at end of file
+ - port:
+ number: 80
+ backend:
+ service:
+ name: anubis-docs
+ port:
+ number: 80
diff --git a/docs/manifest/service.yaml b/docs/manifest/service.yaml
index dadac058..1acdc45d 100644
--- a/docs/manifest/service.yaml
+++ b/docs/manifest/service.yaml
@@ -6,9 +6,9 @@ spec:
selector:
app: anubis-docs
ports:
- - port: 80
- targetPort: 80
- name: http
- - port: 8081
- targetPort: 8081
- name: anubis
+ - port: 80
+ targetPort: 80
+ name: http
+ - port: 8081
+ targetPort: 8081
+ name: anubis
diff --git a/docs/sidebars.ts b/docs/sidebars.ts
index 28971397..574ed394 100644
--- a/docs/sidebars.ts
+++ b/docs/sidebars.ts
@@ -1,4 +1,4 @@
-import type {SidebarsConfig} from '@docusaurus/plugin-content-docs';
+import type { SidebarsConfig } from "@docusaurus/plugin-content-docs";
// This runs in Node.js - Don't use client-side code here (browser APIs, JSX...)
@@ -14,7 +14,7 @@ import type {SidebarsConfig} from '@docusaurus/plugin-content-docs';
*/
const sidebars: SidebarsConfig = {
// By default, Docusaurus generates a sidebar from the docs folder structure
- tutorialSidebar: [{type: 'autogenerated', dirName: '.'}],
+ tutorialSidebar: [{ type: "autogenerated", dirName: "." }],
// But you can create a sidebar manually
/*
diff --git a/docs/src/components/EnterpriseOnly/index.jsx b/docs/src/components/EnterpriseOnly/index.jsx
index bfd9486c..ac6bab1d 100644
--- a/docs/src/components/EnterpriseOnly/index.jsx
+++ b/docs/src/components/EnterpriseOnly/index.jsx
@@ -1,4 +1,4 @@
-import styles from './styles.module.css';
+import styles from "./styles.module.css";
export default function EnterpriseOnly({ link }) {
return (
@@ -8,4 +8,4 @@ export default function EnterpriseOnly({ link }) {
);
-}
\ No newline at end of file
+}
diff --git a/docs/src/components/EnterpriseOnly/styles.module.css b/docs/src/components/EnterpriseOnly/styles.module.css
index f3ac7a15..056cedc0 100644
--- a/docs/src/components/EnterpriseOnly/styles.module.css
+++ b/docs/src/components/EnterpriseOnly/styles.module.css
@@ -8,7 +8,9 @@
font-weight: 700;
padding: 0.5rem 1rem; /* py-2 px-4 */
border-radius: 9999px; /* rounded-full */
- box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05); /* shadow-lg approximation */
+ box-shadow:
+ 0 10px 15px -3px rgba(0, 0, 0, 0.1),
+ 0 4px 6px -2px rgba(0, 0, 0, 0.05); /* shadow-lg approximation */
display: inline-flex; /* flex */
align-items: center; /* items-center */
}
diff --git a/lib/challenge/preact/js/xeact.js b/lib/challenge/preact/js/xeact.js
index cf4a102e..1488f8b8 100644
--- a/lib/challenge/preact/js/xeact.js
+++ b/lib/challenge/preact/js/xeact.js
@@ -5,7 +5,9 @@
*/
const h = (name, data = {}, children = []) => {
const result =
- typeof name == "function" ? name(data) : Object.assign(document.createElement(name), data);
+ typeof name == "function"
+ ? name(data)
+ : Object.assign(document.createElement(name), data);
if (!Array.isArray(children)) {
children = [children];
}
@@ -118,10 +120,10 @@ const d = (ms) => {
/**
* Parse the contents of a given HTML page element as JSON and
* return the results.
- *
+ *
* This is useful when using templ to pass complicated data from
* the server to the client via HTML[1].
- *
+ *
* [1]: https://templ.guide/syntax-and-usage/script-templates/#pass-server-side-data-to-the-client-in-a-html-attribute
*/
const j = (id) => JSON.parse(g(id).textContent);
diff --git a/lib/config/testdata/bad/badregexes.json b/lib/config/testdata/bad/badregexes.json
index db371b0f..436f768d 100644
--- a/lib/config/testdata/bad/badregexes.json
+++ b/lib/config/testdata/bad/badregexes.json
@@ -18,4 +18,4 @@
"action": "DENY"
}
]
-}
\ No newline at end of file
+}
diff --git a/lib/config/testdata/bad/badregexes.yaml b/lib/config/testdata/bad/badregexes.yaml
index 3880e407..c6caedbd 100644
--- a/lib/config/testdata/bad/badregexes.yaml
+++ b/lib/config/testdata/bad/badregexes.yaml
@@ -1,7 +1,7 @@
bots:
-- name: path-bad
- path_regex: "a(b"
- action: DENY
-- name: user-agent-bad
- user_agent_regex: "a(b"
- action: DENY
\ No newline at end of file
+ - name: path-bad
+ path_regex: "a(b"
+ action: DENY
+ - name: user-agent-bad
+ user_agent_regex: "a(b"
+ action: DENY
diff --git a/lib/config/testdata/bad/import_and_bot.json b/lib/config/testdata/bad/import_and_bot.json
index 3d0519bc..ef9778cd 100644
--- a/lib/config/testdata/bad/import_and_bot.json
+++ b/lib/config/testdata/bad/import_and_bot.json
@@ -7,4 +7,4 @@
"action": "CHALLENGE"
}
]
-}
\ No newline at end of file
+}
diff --git a/lib/config/testdata/bad/import_and_bot.yaml b/lib/config/testdata/bad/import_and_bot.yaml
index fdfaa43a..cc9142db 100644
--- a/lib/config/testdata/bad/import_and_bot.yaml
+++ b/lib/config/testdata/bad/import_and_bot.yaml
@@ -1,6 +1,6 @@
bots:
-- import: (data)/bots/ai-catchall.yaml
- name: generic-browser
- user_agent_regex: >
- Mozilla|Opera
- action: CHALLENGE
\ No newline at end of file
+ - import: (data)/bots/ai-catchall.yaml
+ name: generic-browser
+ user_agent_regex: >
+ Mozilla|Opera
+ action: CHALLENGE
diff --git a/lib/config/testdata/bad/import_invalid_file.json b/lib/config/testdata/bad/import_invalid_file.json
index c7546c09..26669635 100644
--- a/lib/config/testdata/bad/import_invalid_file.json
+++ b/lib/config/testdata/bad/import_invalid_file.json
@@ -4,4 +4,4 @@
"import": "(data)/does-not-exist-fake-file.yaml"
}
]
-}
\ No newline at end of file
+}
diff --git a/lib/config/testdata/bad/import_invalid_file.yaml b/lib/config/testdata/bad/import_invalid_file.yaml
index df78c067..c82b4533 100644
--- a/lib/config/testdata/bad/import_invalid_file.yaml
+++ b/lib/config/testdata/bad/import_invalid_file.yaml
@@ -1,2 +1,2 @@
bots:
-- import: (data)/does-not-exist-fake-file.yaml
\ No newline at end of file
+ - import: (data)/does-not-exist-fake-file.yaml
diff --git a/lib/config/testdata/bad/invalid.json b/lib/config/testdata/bad/invalid.json
index c5d1ff6c..334e5db7 100644
--- a/lib/config/testdata/bad/invalid.json
+++ b/lib/config/testdata/bad/invalid.json
@@ -1,5 +1,3 @@
{
- "bots": [
- {}
- ]
-}
\ No newline at end of file
+ "bots": [{}]
+}
diff --git a/lib/config/testdata/bad/invalid.yaml b/lib/config/testdata/bad/invalid.yaml
index 18625b61..b78eb920 100644
--- a/lib/config/testdata/bad/invalid.yaml
+++ b/lib/config/testdata/bad/invalid.yaml
@@ -1 +1 @@
-bots: []
\ No newline at end of file
+bots: []
diff --git a/lib/config/testdata/bad/multiple_expression_types.json b/lib/config/testdata/bad/multiple_expression_types.json
index 8b852768..0bdf5bfc 100644
--- a/lib/config/testdata/bad/multiple_expression_types.json
+++ b/lib/config/testdata/bad/multiple_expression_types.json
@@ -8,10 +8,8 @@
"userAgent.startsWith(\"git/\") || userAgent.contains(\"libgit\")",
"\"Git-Protocol\" in headers && headers[\"Git-Protocol\"] == \"version=2\"\n"
],
- "any": [
- "userAgent.startsWith(\"evilbot/\")"
- ]
+ "any": ["userAgent.startsWith(\"evilbot/\")"]
}
}
]
-}
\ No newline at end of file
+}
diff --git a/lib/config/testdata/bad/multiple_expression_types.yaml b/lib/config/testdata/bad/multiple_expression_types.yaml
index f7aa5463..da97d454 100644
--- a/lib/config/testdata/bad/multiple_expression_types.yaml
+++ b/lib/config/testdata/bad/multiple_expression_types.yaml
@@ -1,10 +1,10 @@
bots:
-- name: multiple-expression-types
- action: ALLOW
- expression:
- all:
- - userAgent.startsWith("git/") || userAgent.contains("libgit")
- - >
- "Git-Protocol" in headers && headers["Git-Protocol"] == "version=2"
- any:
- - userAgent.startsWith("evilbot/")
+ - name: multiple-expression-types
+ action: ALLOW
+ expression:
+ all:
+ - userAgent.startsWith("git/") || userAgent.contains("libgit")
+ - >
+ "Git-Protocol" in headers && headers["Git-Protocol"] == "version=2"
+ any:
+ - userAgent.startsWith("evilbot/")
diff --git a/lib/config/testdata/bad/nobots.json b/lib/config/testdata/bad/nobots.json
index 9e26dfee..0967ef42 100644
--- a/lib/config/testdata/bad/nobots.json
+++ b/lib/config/testdata/bad/nobots.json
@@ -1 +1 @@
-{}
\ No newline at end of file
+{}
diff --git a/lib/config/testdata/bad/nobots.yaml b/lib/config/testdata/bad/nobots.yaml
index 9e26dfee..0967ef42 100644
--- a/lib/config/testdata/bad/nobots.yaml
+++ b/lib/config/testdata/bad/nobots.yaml
@@ -1 +1 @@
-{}
\ No newline at end of file
+{}
diff --git a/lib/config/testdata/bad/regex_ends_newline.yaml b/lib/config/testdata/bad/regex_ends_newline.yaml
index 1f0ae85b..7400016b 100644
--- a/lib/config/testdata/bad/regex_ends_newline.yaml
+++ b/lib/config/testdata/bad/regex_ends_newline.yaml
@@ -1,17 +1,17 @@
bots:
-- name: user-agent-ends-newline
- # Subtle bug: this ends with a newline
- user_agent_regex: >
- Mozilla
- action: CHALLENGE
-- name: path-ends-newline
- # Subtle bug: this ends with a newline
- path_regex: >
- ^/evil/.*$
- action: CHALLENGE
-- name: headers-ends-newline
- # Subtle bug: this ends with a newline
- headers_regex:
- CF-Worker: >
- .*
- action: CHALLENGE
\ No newline at end of file
+ - name: user-agent-ends-newline
+ # Subtle bug: this ends with a newline
+ user_agent_regex: >
+ Mozilla
+ action: CHALLENGE
+ - name: path-ends-newline
+ # Subtle bug: this ends with a newline
+ path_regex: >
+ ^/evil/.*$
+ action: CHALLENGE
+ - name: headers-ends-newline
+ # Subtle bug: this ends with a newline
+ headers_regex:
+ CF-Worker: >
+ .*
+ action: CHALLENGE
diff --git a/lib/config/testdata/bad/status-codes-0.yaml b/lib/config/testdata/bad/status-codes-0.yaml
index 0d08322e..96df3d1d 100644
--- a/lib/config/testdata/bad/status-codes-0.yaml
+++ b/lib/config/testdata/bad/status-codes-0.yaml
@@ -1,8 +1,8 @@
bots:
-- name: everything
- user_agent_regex: .*
- action: DENY
+ - name: everything
+ user_agent_regex: .*
+ action: DENY
status_codes:
CHALLENGE: 0
- DENY: 0
\ No newline at end of file
+ DENY: 0
diff --git a/lib/config/testdata/good/allow_everyone.json b/lib/config/testdata/good/allow_everyone.json
index a7e1af76..de298c6b 100644
--- a/lib/config/testdata/good/allow_everyone.json
+++ b/lib/config/testdata/good/allow_everyone.json
@@ -2,11 +2,8 @@
"bots": [
{
"name": "everyones-invited",
- "remote_addresses": [
- "0.0.0.0/0",
- "::/0"
- ],
+ "remote_addresses": ["0.0.0.0/0", "::/0"],
"action": "ALLOW"
}
]
-}
\ No newline at end of file
+}
diff --git a/lib/config/testdata/good/allow_everyone.yaml b/lib/config/testdata/good/allow_everyone.yaml
index 5c495345..80dae8b2 100644
--- a/lib/config/testdata/good/allow_everyone.yaml
+++ b/lib/config/testdata/good/allow_everyone.yaml
@@ -1,6 +1,6 @@
bots:
-- name: everyones-invited
- remote_addresses:
- - "0.0.0.0/0"
- - "::/0"
- action: ALLOW
\ No newline at end of file
+ - name: everyones-invited
+ remote_addresses:
+ - "0.0.0.0/0"
+ - "::/0"
+ action: ALLOW
diff --git a/lib/config/testdata/good/block_cf_workers.json b/lib/config/testdata/good/block_cf_workers.json
index b84f1e0d..380fdf04 100644
--- a/lib/config/testdata/good/block_cf_workers.json
+++ b/lib/config/testdata/good/block_cf_workers.json
@@ -9,4 +9,4 @@
}
],
"dnsbl": false
-}
\ No newline at end of file
+}
diff --git a/lib/config/testdata/good/block_cf_workers.yaml b/lib/config/testdata/good/block_cf_workers.yaml
index c66badef..353c921a 100644
--- a/lib/config/testdata/good/block_cf_workers.yaml
+++ b/lib/config/testdata/good/block_cf_workers.yaml
@@ -2,4 +2,4 @@ bots:
- name: cloudflare-workers
headers_regex:
CF-Worker: .*
- action: DENY
\ No newline at end of file
+ action: DENY
diff --git a/lib/config/testdata/good/challengemozilla.json b/lib/config/testdata/good/challengemozilla.json
index e9d34eeb..eaee8490 100644
--- a/lib/config/testdata/good/challengemozilla.json
+++ b/lib/config/testdata/good/challengemozilla.json
@@ -6,4 +6,4 @@
"action": "CHALLENGE"
}
]
-}
\ No newline at end of file
+}
diff --git a/lib/config/testdata/good/challengemozilla.yaml b/lib/config/testdata/good/challengemozilla.yaml
index 15922b0a..f6d8e9ac 100644
--- a/lib/config/testdata/good/challengemozilla.yaml
+++ b/lib/config/testdata/good/challengemozilla.yaml
@@ -1,4 +1,4 @@
bots:
-- name: generic-browser
- user_agent_regex: Mozilla
- action: CHALLENGE
\ No newline at end of file
+ - name: generic-browser
+ user_agent_regex: Mozilla
+ action: CHALLENGE
diff --git a/lib/config/testdata/good/everything_blocked.json b/lib/config/testdata/good/everything_blocked.json
index e1763e45..ab694f25 100644
--- a/lib/config/testdata/good/everything_blocked.json
+++ b/lib/config/testdata/good/everything_blocked.json
@@ -7,4 +7,4 @@
}
],
"dnsbl": false
-}
\ No newline at end of file
+}
diff --git a/lib/config/testdata/good/everything_blocked.yaml b/lib/config/testdata/good/everything_blocked.yaml
index 323c5969..1c805581 100644
--- a/lib/config/testdata/good/everything_blocked.yaml
+++ b/lib/config/testdata/good/everything_blocked.yaml
@@ -1,4 +1,4 @@
bots:
-- name: everything
- user_agent_regex: .*
- action: DENY
+ - name: everything
+ user_agent_regex: .*
+ action: DENY
diff --git a/lib/config/testdata/good/git_client.json b/lib/config/testdata/good/git_client.json
index 68a2b3e8..52c5e11f 100644
--- a/lib/config/testdata/good/git_client.json
+++ b/lib/config/testdata/good/git_client.json
@@ -11,4 +11,4 @@
}
}
]
-}
\ No newline at end of file
+}
diff --git a/lib/config/testdata/good/git_client.yaml b/lib/config/testdata/good/git_client.yaml
index 44aa2da3..1c496789 100644
--- a/lib/config/testdata/good/git_client.yaml
+++ b/lib/config/testdata/good/git_client.yaml
@@ -1,8 +1,8 @@
bots:
-- name: allow-git-clients
- action: ALLOW
- expression:
- all:
- - userAgent.startsWith("git/") || userAgent.contains("libgit")
- - >
- "Git-Protocol" in headers && headers["Git-Protocol"] == "version=2"
+ - name: allow-git-clients
+ action: ALLOW
+ expression:
+ all:
+ - userAgent.startsWith("git/") || userAgent.contains("libgit")
+ - >
+ "Git-Protocol" in headers && headers["Git-Protocol"] == "version=2"
diff --git a/lib/config/testdata/good/import_filesystem.json b/lib/config/testdata/good/import_filesystem.json
index 23480c90..ba0228a7 100644
--- a/lib/config/testdata/good/import_filesystem.json
+++ b/lib/config/testdata/good/import_filesystem.json
@@ -4,4 +4,4 @@
"import": "./testdata/hack-test.json"
}
]
-}
\ No newline at end of file
+}
diff --git a/lib/config/testdata/good/import_filesystem.yaml b/lib/config/testdata/good/import_filesystem.yaml
index 422ccc4e..2ea0d54e 100644
--- a/lib/config/testdata/good/import_filesystem.yaml
+++ b/lib/config/testdata/good/import_filesystem.yaml
@@ -1,2 +1,2 @@
bots:
-- import: ./testdata/hack-test.yaml
\ No newline at end of file
+ - import: ./testdata/hack-test.yaml
diff --git a/lib/config/testdata/good/import_keep_internet_working.json b/lib/config/testdata/good/import_keep_internet_working.json
index 68ff2dbc..06b08fe1 100644
--- a/lib/config/testdata/good/import_keep_internet_working.json
+++ b/lib/config/testdata/good/import_keep_internet_working.json
@@ -4,4 +4,4 @@
"import": "(data)/common/keep-internet-working.yaml"
}
]
-}
\ No newline at end of file
+}
diff --git a/lib/config/testdata/good/import_keep_internet_working.yaml b/lib/config/testdata/good/import_keep_internet_working.yaml
index 923ffe32..19ff33eb 100644
--- a/lib/config/testdata/good/import_keep_internet_working.yaml
+++ b/lib/config/testdata/good/import_keep_internet_working.yaml
@@ -1,2 +1,2 @@
bots:
-- import: (data)/common/keep-internet-working.yaml
\ No newline at end of file
+ - import: (data)/common/keep-internet-working.yaml
diff --git a/lib/config/testdata/good/old_xesite.json b/lib/config/testdata/good/old_xesite.json
index 21816bdd..763d6785 100644
--- a/lib/config/testdata/good/old_xesite.json
+++ b/lib/config/testdata/good/old_xesite.json
@@ -76,4 +76,4 @@
"action": "CHALLENGE"
}
]
-}
\ No newline at end of file
+}
diff --git a/lib/config/testdata/good/status-codes-paranoid.yaml b/lib/config/testdata/good/status-codes-paranoid.yaml
index 89655a3d..0310388b 100644
--- a/lib/config/testdata/good/status-codes-paranoid.yaml
+++ b/lib/config/testdata/good/status-codes-paranoid.yaml
@@ -1,8 +1,8 @@
bots:
-- name: everything
- user_agent_regex: .*
- action: DENY
+ - name: everything
+ user_agent_regex: .*
+ action: DENY
status_codes:
CHALLENGE: 200
- DENY: 200
\ No newline at end of file
+ DENY: 200
diff --git a/lib/config/testdata/good/status-codes-rfc.yaml b/lib/config/testdata/good/status-codes-rfc.yaml
index 4e4e6d8d..c70ea126 100644
--- a/lib/config/testdata/good/status-codes-rfc.yaml
+++ b/lib/config/testdata/good/status-codes-rfc.yaml
@@ -1,8 +1,8 @@
bots:
-- name: everything
- user_agent_regex: .*
- action: DENY
+ - name: everything
+ user_agent_regex: .*
+ action: DENY
status_codes:
CHALLENGE: 403
- DENY: 403
\ No newline at end of file
+ DENY: 403
diff --git a/lib/config/testdata/hack-test.json b/lib/config/testdata/hack-test.json
index 652dcd87..a173bb18 100644
--- a/lib/config/testdata/hack-test.json
+++ b/lib/config/testdata/hack-test.json
@@ -2,8 +2,6 @@
{
"name": "ipv6-ula",
"action": "ALLOW",
- "remote_addresses": [
- "fc00::/7"
- ]
+ "remote_addresses": ["fc00::/7"]
}
-]
\ No newline at end of file
+]
diff --git a/lib/config/testdata/hack-test.yaml b/lib/config/testdata/hack-test.yaml
index cd4d7d05..29263e96 100644
--- a/lib/config/testdata/hack-test.yaml
+++ b/lib/config/testdata/hack-test.yaml
@@ -1,3 +1,3 @@
- name: well-known
path_regex: ^/.well-known/.*$
- action: ALLOW
\ No newline at end of file
+ action: ALLOW
diff --git a/lib/localization/locales/cs.json b/lib/localization/locales/cs.json
index db4eded3..967da646 100644
--- a/lib/localization/locales/cs.json
+++ b/lib/localization/locales/cs.json
@@ -63,4 +63,4 @@
"js_calculation_error": "Chyba výpočtu!",
"js_calculation_error_msg": "Nepodařilo se vypočítat výzvu:",
"missing_required_forwarded_headers": "Chybějící požadované hlavičky X-Forwarded-*"
-}
\ No newline at end of file
+}
diff --git a/lib/localization/locales/en.json b/lib/localization/locales/en.json
index 0280b975..4dffb969 100644
--- a/lib/localization/locales/en.json
+++ b/lib/localization/locales/en.json
@@ -63,4 +63,4 @@
"js_finished_reading": "I've finished reading, continue →",
"js_calculation_error": "Calculation error!",
"js_calculation_error_msg": "Failed to calculate challenge:"
-}
\ No newline at end of file
+}
diff --git a/lib/localization/locales/es.json b/lib/localization/locales/es.json
index 8beb3bf8..d4e91418 100644
--- a/lib/localization/locales/es.json
+++ b/lib/localization/locales/es.json
@@ -63,4 +63,4 @@
"js_calculation_error_msg": "Falló al calcular el desafío:",
"missing_required_forwarded_headers": "Faltan los encabezados X-Forwarded-* requeridos",
"simplified_explanation": "Esta es una medida contra bots y solicitudes maliciosas similar a un CAPTCHA. Sin embargo, en lugar de tener que hacer el trabajo usted mismo, a su navegador se le asigna una tarea de cálculo que debe resolver para garantizar que es un cliente válido. Este concepto se llama
Prueba de trabajo. La tarea se calcula en unos segundos y se le concede acceso al sitio web. Gracias por su comprensión y paciencia."
-}
\ No newline at end of file
+}
diff --git a/lib/localization/locales/et.json b/lib/localization/locales/et.json
index 09125b9c..6ecfd2fa 100644
--- a/lib/localization/locales/et.json
+++ b/lib/localization/locales/et.json
@@ -63,4 +63,4 @@
"js_calculation_error_msg": "Ei suutnud kontrolli arvutada:",
"missing_required_forwarded_headers": "Puuduvad nõutud X-Forwarded-* päised",
"simplified_explanation": "See on meede robotite ja pahatahtlike päringute vastu, mis sarnaneb CAPTCHA-le. Kuid selle asemel, et peaksite ise tööd tegema, antakse teie brauserile arvutusülesanne, mille see peab lahendama, et tagada selle kehtivus kliendina. Seda kontseptsiooni nimetatakse
Töötõendiks. Ülesanne arvutatakse mõne sekundiga ja teile antakse juurdepääs veebisaidile. Täname teid mõistva suhtumise ja kannatlikkuse eest."
-}
\ No newline at end of file
+}
diff --git a/lib/localization/locales/fi.json b/lib/localization/locales/fi.json
index bd06d3a7..fb313c25 100644
--- a/lib/localization/locales/fi.json
+++ b/lib/localization/locales/fi.json
@@ -63,4 +63,4 @@
"js_calculation_error_msg": "Haasteen laskenta ei onnistunut:",
"missing_required_forwarded_headers": "Puuttuvat vaaditut X-Forwarded-* otsikot",
"simplified_explanation": "Tämä on toimenpide botteja ja haitallisia pyyntöjä vastaan, joka on samanlainen kuin CAPTCHA. Sen sijaan, että joutuisit tekemään työtä itse, selaimesi saa laskentatehtävän, joka sen on ratkaistava varmistaakseen, että se on kelvollinen asiakas. Tätä käsitettä kutsutaan nimellä
Työtodistus. Tehtävä lasketaan muutamassa sekunnissa ja saat pääsyn verkkosivustolle. Kiitos ymmärryksestäsi ja kärsivällisyydestäsi."
-}
\ No newline at end of file
+}
diff --git a/lib/localization/locales/fr.json b/lib/localization/locales/fr.json
index b696e04c..a113c457 100644
--- a/lib/localization/locales/fr.json
+++ b/lib/localization/locales/fr.json
@@ -63,4 +63,4 @@
"js_calculation_error_msg": "Échec du calcul du défi :",
"missing_required_forwarded_headers": "En-têtes X-Forwarded-* requis manquants",
"simplified_explanation": "Il s'agit d'une mesure contre les robots et les requêtes malveillantes similaire à un CAPTCHA. Cependant, au lieu d'avoir à faire le travail vous-même, votre navigateur se voit confier une tâche de calcul qu'il doit résoudre pour s'assurer qu'il est un client valide. Ce concept s'appelle
Preuve de travail. La tâche est calculée en quelques secondes et vous avez accès au site Web. Merci de votre compréhension et de votre patience."
-}
\ No newline at end of file
+}
diff --git a/lib/localization/locales/it.json b/lib/localization/locales/it.json
index e2ecc11b..4b44c523 100644
--- a/lib/localization/locales/it.json
+++ b/lib/localization/locales/it.json
@@ -63,4 +63,4 @@
"js_calculation_error_msg": "Impossibile superare il test:",
"missing_required_forwarded_headers": "Mancano gli header X-Forwarded-* richiesti",
"simplified_explanation": "Questa è una misura contro bot e richieste dannose simile a un CAPTCHA. Tuttavia, invece di dover lavorare tu stesso, al tuo browser viene assegnato un compito di calcolo che deve risolvere per garantire che sia un client valido. Questo concetto è chiamato
Proof of Work. Il compito viene calcolato in pochi secondi e ti viene concesso l'accesso al sito web. Grazie per la tua comprensione e pazienza."
-}
\ No newline at end of file
+}
diff --git a/lib/localization/locales/ja.json b/lib/localization/locales/ja.json
index 3042173d..369438ed 100644
--- a/lib/localization/locales/ja.json
+++ b/lib/localization/locales/ja.json
@@ -63,4 +63,4 @@
"js_calculation_error_msg": "チャレンジの計算に失敗しました:",
"missing_required_forwarded_headers": "必要な X-Forwarded-* ヘッダーがありません",
"simplified_explanation": "これは、CAPTCHAと同様の、ボットや悪意のあるリクエストに対する対策です。ただし、自分で作業する代わりに、ブラウザに計算タスクが与えられ、それを解決して有効なクライアントであることを確認する必要があります。この概念は
Proof of Workと呼ばれます。タスクは数秒で計算され、ウェブサイトへのアクセスが許可されます。ご理解とご協力をお願いいたします。"
-}
\ No newline at end of file
+}
diff --git a/lib/localization/locales/nb.json b/lib/localization/locales/nb.json
index 0b8b6fcc..ada36f20 100644
--- a/lib/localization/locales/nb.json
+++ b/lib/localization/locales/nb.json
@@ -63,4 +63,4 @@
"js_calculation_error_msg": "Mislyktes i å beregne utfordring:",
"missing_required_forwarded_headers": "Mangler nødvendige X-Forwarded-* header",
"simplified_explanation": "Dette er et tiltak mot roboter og ondsinnede forespørsler som ligner på en CAPTCHA. Men i stedet for å måtte gjøre arbeidet selv, får nettleseren din en beregningsoppgave som den må løse for å sikre at den er en gyldig klient. Dette konseptet kalles
Proof of Work. Oppgaven beregnes på noen få sekunder, og du får tilgang til nettstedet. Takk for din forståelse og tålmodighet."
-}
\ No newline at end of file
+}
diff --git a/lib/localization/locales/pl.json b/lib/localization/locales/pl.json
index 47e84c31..b7e7f6e8 100644
--- a/lib/localization/locales/pl.json
+++ b/lib/localization/locales/pl.json
@@ -1,66 +1,66 @@
{
- "loading": "Ładowanie...",
- "why_am_i_seeing": "Dlaczego to widzę?",
- "protected_by": "Chronione przez",
- "protected_from": "Przed",
- "made_with": "Stworzone z ❤️ w 🇨🇦",
- "mascot_design": "Projekt maskotki:",
- "ai_companies_explanation": "Widzisz to, ponieważ administrator tej strony skonfigurował Anubisa, aby chronić serwer przed masowym skanowaniem treści przez firmy tworzące AI. Powoduje to obciążenie i przestoje, przez co zasoby strony stają się niedostępne dla wszystkich.",
- "anubis_compromise": "Anubis jest kompromisem. Używa mechanizmu Proof-of-Work w stylu Hashcash — proponowanego systemu ograniczania spamu e-mail. Pomysł polega na tym, że dla indywidualnych użytkowników dodatkowe obciążenie jest niezauważalne, ale w skali masowego skanowania koszt szybko rośnie.",
- "hack_purpose": "Docelowo jest to rozwiązanie tymczasowe, aby zyskać czas na ulepszenie metod identyfikacji przeglądarek bez interfejsu graficznego (np. poprzez analizę renderowania czcionek), by w przyszłości nie musieć wyświetlać strony z zadaniem Proof-of-Work użytkownikom, którzy najprawdopodobniej są prawidłowi.",
- "simplified_explanation": "To zabezpieczenie przed botami i złośliwymi żądaniami, podobne do CAPTCHA. Jednak zamiast wykonywać zadanie samodzielnie, przeglądarka otrzymuje obliczenie do wykonania, aby potwierdzić, że jest prawidłowym klientem. Ten mechanizm to
Proof of Work. Zadanie trwa kilka sekund i uzyskujesz dostęp do strony. Dziękujemy za cierpliwość.",
- "jshelter_note": "Uwaga: Anubis wymaga nowoczesnych funkcji JavaScript, które wtyczki typu JShelter mogą blokować. Wyłącz JShelter lub podobne dodatki dla tej domeny.",
- "version_info": "Ta strona działa na Anubis w wersji",
- "try_again": "Spróbuj ponownie",
- "go_home": "Wróć na stronę główną",
- "contact_webmaster": "lub jeśli uważasz, że nie powinieneś być blokowany, skontaktuj się z administratorem pod adresem",
- "connection_security": "Poczekaj chwilę, sprawdzamy bezpieczeństwo Twojego połączenia.",
- "javascript_required": "Niestety, aby przejść tę próbę, musisz włączyć obsługę JavaScript. Jest to konieczne, ponieważ firmy zajmujące się sztuczną inteligencją zmieniły umowę społeczną dotyczącą funkcjonowania hostingu stron internetowych. Rozwiązanie bez obsługi JavaScript jest w trakcie opracowywania.",
- "benchmark_requires_js": "Uruchomienie narzędzia testowego wymaga włączonego JavaScript.",
- "difficulty": "Trudność:",
- "algorithm": "Algorytm:",
- "compare": "Porównaj:",
- "time": "Czas",
- "iters": "Iteracje",
- "time_a": "Czas A",
- "iters_a": "Iteracje A",
- "time_b": "Czas B",
- "iters_b": "Iteracje B",
- "static_check_endpoint": "To jedynie punkt kontrolny do użytku przez Twój reverse proxy.",
- "authorization_required": "Wymagane uwierzytelnienie",
- "cookies_disabled": "Twoja przeglądarka blokuje ciasteczka. Anubis wymaga ich, aby potwierdzić, że jesteś prawidłowym klientem. Włącz ciasteczka dla tej domeny.",
- "access_denied": "Brak dostępu: kod błędu",
- "dronebl_entry": "DroneBL zgłosił wpis",
- "see_dronebl_lookup": "zobacz",
- "internal_server_error": "Błąd wewnętrzny serwera: administrator błędnie skonfigurował Anubis. Skontaktuj się z administratorem i poproś o sprawdzenie logów",
- "invalid_redirect": "Nieprawidłowe przekierowanie",
- "redirect_not_parseable": "Nie można odczytać adresu przekierowania",
- "redirect_domain_not_allowed": "Domena przekierowania niedozwolona",
- "missing_required_forwarded_headers": "Brak wymaganych nagłówków X-Forwarded-*",
- "failed_to_sign_jwt": "Nie udało się podpisać JWT",
- "invalid_invocation": "Nieprawidłowe wywołanie MakeChallenge",
- "client_error_browser": "Błąd klienta: upewnij się, że Twoja przeglądarka jest aktualna i spróbuj ponownie później.",
- "oh_noes": "O nie!",
- "benchmarking_anubis": "Testowanie wydajności Anubis!",
- "you_are_not_a_bot": "Nie jesteś botem!",
- "making_sure_not_bot": "Sprawdzamy, czy nie jesteś botem!",
- "celphase": "CELPHASE",
- "js_web_crypto_error": "Twoja przeglądarka nie obsługuje web.crypto. Czy korzystasz z bezpiecznego połączenia?",
- "js_web_workers_error": "Twoja przeglądarka nie obsługuje web workers (Anubis ich używa, by nie zawieszać przeglądarki). Czy masz zainstalowaną wtyczkę typu JShelter?",
- "js_cookies_error": "Twoja przeglądarka nie zapisuje ciasteczek. Anubis używa ich do przechowywania podpisanego tokenu potwierdzającego przejście zabezpieczenia. Włącz zapis ciasteczek dla tej domeny. Nazwy ciasteczek mogą zmieniać się bez zapowiedzi. Nazwy oraz zawartość ciasteczek nie są cześcią publicznego API.",
- "js_context_not_secure": "Kontekst nie jest bezpieczny!",
- "js_context_not_secure_msg": "Spróbuj połączyć się przez HTTPS lub poinformuj administratora, by skonfigurował HTTPS. Więcej informacji na
MDN.",
- "js_calculating": "Obliczanie...",
- "js_missing_feature": "Brakująca funkcja",
- "js_challenge_error": "Błąd wyzwania!",
- "js_challenge_error_msg": "Nie udało się ustalić algorytmu sprawdzającego. Możesz spróbować odświeżyć stronę.",
- "js_calculating_difficulty": "Obliczanie...
Trudność:",
- "js_speed": "Prędkość:",
- "js_verification_longer": "Weryfikacja trwa dłużej niż zwykle. Proszę nie odświeżać strony.",
- "js_success": "Sukces!",
- "js_done_took": "Gotowe! Zajęło to",
- "js_iterations": "iteracji",
- "js_finished_reading": "Skończyłem czytać, kontynuuj →",
- "js_calculation_error": "Błąd obliczeń!",
- "js_calculation_error_msg": "Nie udało się obliczyć zadania:"
-}
\ No newline at end of file
+ "loading": "Ładowanie...",
+ "why_am_i_seeing": "Dlaczego to widzę?",
+ "protected_by": "Chronione przez",
+ "protected_from": "Przed",
+ "made_with": "Stworzone z ❤️ w 🇨🇦",
+ "mascot_design": "Projekt maskotki:",
+ "ai_companies_explanation": "Widzisz to, ponieważ administrator tej strony skonfigurował Anubisa, aby chronić serwer przed masowym skanowaniem treści przez firmy tworzące AI. Powoduje to obciążenie i przestoje, przez co zasoby strony stają się niedostępne dla wszystkich.",
+ "anubis_compromise": "Anubis jest kompromisem. Używa mechanizmu Proof-of-Work w stylu Hashcash — proponowanego systemu ograniczania spamu e-mail. Pomysł polega na tym, że dla indywidualnych użytkowników dodatkowe obciążenie jest niezauważalne, ale w skali masowego skanowania koszt szybko rośnie.",
+ "hack_purpose": "Docelowo jest to rozwiązanie tymczasowe, aby zyskać czas na ulepszenie metod identyfikacji przeglądarek bez interfejsu graficznego (np. poprzez analizę renderowania czcionek), by w przyszłości nie musieć wyświetlać strony z zadaniem Proof-of-Work użytkownikom, którzy najprawdopodobniej są prawidłowi.",
+ "simplified_explanation": "To zabezpieczenie przed botami i złośliwymi żądaniami, podobne do CAPTCHA. Jednak zamiast wykonywać zadanie samodzielnie, przeglądarka otrzymuje obliczenie do wykonania, aby potwierdzić, że jest prawidłowym klientem. Ten mechanizm to
Proof of Work. Zadanie trwa kilka sekund i uzyskujesz dostęp do strony. Dziękujemy za cierpliwość.",
+ "jshelter_note": "Uwaga: Anubis wymaga nowoczesnych funkcji JavaScript, które wtyczki typu JShelter mogą blokować. Wyłącz JShelter lub podobne dodatki dla tej domeny.",
+ "version_info": "Ta strona działa na Anubis w wersji",
+ "try_again": "Spróbuj ponownie",
+ "go_home": "Wróć na stronę główną",
+ "contact_webmaster": "lub jeśli uważasz, że nie powinieneś być blokowany, skontaktuj się z administratorem pod adresem",
+ "connection_security": "Poczekaj chwilę, sprawdzamy bezpieczeństwo Twojego połączenia.",
+ "javascript_required": "Niestety, aby przejść tę próbę, musisz włączyć obsługę JavaScript. Jest to konieczne, ponieważ firmy zajmujące się sztuczną inteligencją zmieniły umowę społeczną dotyczącą funkcjonowania hostingu stron internetowych. Rozwiązanie bez obsługi JavaScript jest w trakcie opracowywania.",
+ "benchmark_requires_js": "Uruchomienie narzędzia testowego wymaga włączonego JavaScript.",
+ "difficulty": "Trudność:",
+ "algorithm": "Algorytm:",
+ "compare": "Porównaj:",
+ "time": "Czas",
+ "iters": "Iteracje",
+ "time_a": "Czas A",
+ "iters_a": "Iteracje A",
+ "time_b": "Czas B",
+ "iters_b": "Iteracje B",
+ "static_check_endpoint": "To jedynie punkt kontrolny do użytku przez Twój reverse proxy.",
+ "authorization_required": "Wymagane uwierzytelnienie",
+ "cookies_disabled": "Twoja przeglądarka blokuje ciasteczka. Anubis wymaga ich, aby potwierdzić, że jesteś prawidłowym klientem. Włącz ciasteczka dla tej domeny.",
+ "access_denied": "Brak dostępu: kod błędu",
+ "dronebl_entry": "DroneBL zgłosił wpis",
+ "see_dronebl_lookup": "zobacz",
+ "internal_server_error": "Błąd wewnętrzny serwera: administrator błędnie skonfigurował Anubis. Skontaktuj się z administratorem i poproś o sprawdzenie logów",
+ "invalid_redirect": "Nieprawidłowe przekierowanie",
+ "redirect_not_parseable": "Nie można odczytać adresu przekierowania",
+ "redirect_domain_not_allowed": "Domena przekierowania niedozwolona",
+ "missing_required_forwarded_headers": "Brak wymaganych nagłówków X-Forwarded-*",
+ "failed_to_sign_jwt": "Nie udało się podpisać JWT",
+ "invalid_invocation": "Nieprawidłowe wywołanie MakeChallenge",
+ "client_error_browser": "Błąd klienta: upewnij się, że Twoja przeglądarka jest aktualna i spróbuj ponownie później.",
+ "oh_noes": "O nie!",
+ "benchmarking_anubis": "Testowanie wydajności Anubis!",
+ "you_are_not_a_bot": "Nie jesteś botem!",
+ "making_sure_not_bot": "Sprawdzamy, czy nie jesteś botem!",
+ "celphase": "CELPHASE",
+ "js_web_crypto_error": "Twoja przeglądarka nie obsługuje web.crypto. Czy korzystasz z bezpiecznego połączenia?",
+ "js_web_workers_error": "Twoja przeglądarka nie obsługuje web workers (Anubis ich używa, by nie zawieszać przeglądarki). Czy masz zainstalowaną wtyczkę typu JShelter?",
+ "js_cookies_error": "Twoja przeglądarka nie zapisuje ciasteczek. Anubis używa ich do przechowywania podpisanego tokenu potwierdzającego przejście zabezpieczenia. Włącz zapis ciasteczek dla tej domeny. Nazwy ciasteczek mogą zmieniać się bez zapowiedzi. Nazwy oraz zawartość ciasteczek nie są cześcią publicznego API.",
+ "js_context_not_secure": "Kontekst nie jest bezpieczny!",
+ "js_context_not_secure_msg": "Spróbuj połączyć się przez HTTPS lub poinformuj administratora, by skonfigurował HTTPS. Więcej informacji na
MDN.",
+ "js_calculating": "Obliczanie...",
+ "js_missing_feature": "Brakująca funkcja",
+ "js_challenge_error": "Błąd wyzwania!",
+ "js_challenge_error_msg": "Nie udało się ustalić algorytmu sprawdzającego. Możesz spróbować odświeżyć stronę.",
+ "js_calculating_difficulty": "Obliczanie...
Trudność:",
+ "js_speed": "Prędkość:",
+ "js_verification_longer": "Weryfikacja trwa dłużej niż zwykle. Proszę nie odświeżać strony.",
+ "js_success": "Sukces!",
+ "js_done_took": "Gotowe! Zajęło to",
+ "js_iterations": "iteracji",
+ "js_finished_reading": "Skończyłem czytać, kontynuuj →",
+ "js_calculation_error": "Błąd obliczeń!",
+ "js_calculation_error_msg": "Nie udało się obliczyć zadania:"
+}
diff --git a/lib/localization/locales/ru.json b/lib/localization/locales/ru.json
index 632efd3d..f98e8e14 100644
--- a/lib/localization/locales/ru.json
+++ b/lib/localization/locales/ru.json
@@ -63,4 +63,4 @@
"js_calculation_error_msg": "Не удалось рассчитать задачу:",
"missing_required_forwarded_headers": "Отсутствуют требуемые заголовки X-Forwarded-*",
"simplified_explanation": "Это мера против ботов и вредоносных запросов, аналогичная CAPTCHA. Однако вместо того, чтобы вам приходилось работать самостоятельно, вашему браузеру дается задача вычисления, которую он должен решить, чтобы убедиться, что он является действительным клиентом. Эта концепция называется
Доказательство выполнения работы. Задача рассчитывается за несколько секунд, и вам предоставляется доступ к веб-сайту. Спасибо за понимание и терпение."
-}
\ No newline at end of file
+}
diff --git a/lib/localization/locales/sv.json b/lib/localization/locales/sv.json
index dbb18cca..96bff72a 100644
--- a/lib/localization/locales/sv.json
+++ b/lib/localization/locales/sv.json
@@ -63,4 +63,4 @@
"js_calculation_error_msg": "Misslyckades att kalkylera utmaning:",
"missing_required_forwarded_headers": "Saknar nödvändiga X-Forwarded-* headers",
"simplified_explanation": "Detta är en åtgärd mot botar och skadliga förfrågningar som liknar en CAPTCHA. Men i stället för att du själv måste göra jobbet får din webbläsare en beräkningsuppgift som den måste lösa för att säkerställa att den är en giltig klient. Detta koncept kallas
Arbetsbevis. Uppgiften beräknas på några sekunder och du beviljas tillgång till webbplatsen. Tack för din förståelse och ditt tålamod."
-}
\ No newline at end of file
+}
diff --git a/lib/localization/locales/vi.json b/lib/localization/locales/vi.json
index edaf20fa..533212b2 100644
--- a/lib/localization/locales/vi.json
+++ b/lib/localization/locales/vi.json
@@ -63,4 +63,4 @@
"js_finished_reading": "Tôi đã đọc xong, tiếp tục →",
"js_calculation_error": "Lỗi tính toán!",
"js_calculation_error_msg": "Không thể tính toán thử thách:"
-}
\ No newline at end of file
+}
diff --git a/lib/localization/locales/zh-TW.json b/lib/localization/locales/zh-TW.json
index 4e7da25c..9f6403b6 100644
--- a/lib/localization/locales/zh-TW.json
+++ b/lib/localization/locales/zh-TW.json
@@ -63,4 +63,4 @@
"js_calculation_error_msg": "計算挑戰失敗:",
"missing_required_forwarded_headers": "缺少必要的 X-Forwarded-* 標頭",
"simplified_explanation": "這是一種類似於驗證碼的措施,用於防止機器人和惡意請求。但是,您無需自己動手,您的瀏覽器會收到一個計算任務,必須解決該任務以確保它是有效的客戶端。這個概念稱為
工作量證明。該任務在幾秒鐘內計算完畢,您將被授予訪問網站的權限。感謝您的理解和耐心。"
-}
\ No newline at end of file
+}
diff --git a/lib/policy/testdata/hack-test.json b/lib/policy/testdata/hack-test.json
index 652dcd87..a173bb18 100644
--- a/lib/policy/testdata/hack-test.json
+++ b/lib/policy/testdata/hack-test.json
@@ -2,8 +2,6 @@
{
"name": "ipv6-ula",
"action": "ALLOW",
- "remote_addresses": [
- "fc00::/7"
- ]
+ "remote_addresses": ["fc00::/7"]
}
-]
\ No newline at end of file
+]
diff --git a/lib/policy/testdata/hack-test.yaml b/lib/policy/testdata/hack-test.yaml
index cd4d7d05..29263e96 100644
--- a/lib/policy/testdata/hack-test.yaml
+++ b/lib/policy/testdata/hack-test.yaml
@@ -1,3 +1,3 @@
- name: well-known
path_regex: ^/.well-known/.*$
- action: ALLOW
\ No newline at end of file
+ action: ALLOW
diff --git a/lib/testdata/cloudflare-workers-cel.yaml b/lib/testdata/cloudflare-workers-cel.yaml
index b2d6de5a..b165d503 100644
--- a/lib/testdata/cloudflare-workers-cel.yaml
+++ b/lib/testdata/cloudflare-workers-cel.yaml
@@ -1,8 +1,8 @@
bots:
-- name: cloudflare-workers
- expression: '"Cf-Worker" in headers'
- action: DENY
+ - name: cloudflare-workers
+ expression: '"Cf-Worker" in headers'
+ action: DENY
status_codes:
CHALLENGE: 401
- DENY: 403
\ No newline at end of file
+ DENY: 403
diff --git a/lib/testdata/cloudflare-workers-header.yaml b/lib/testdata/cloudflare-workers-header.yaml
index 4fa9671b..20306445 100644
--- a/lib/testdata/cloudflare-workers-header.yaml
+++ b/lib/testdata/cloudflare-workers-header.yaml
@@ -1,9 +1,9 @@
bots:
-- name: cloudflare-workers
- headers_regex:
- CF-Worker: .*
- action: DENY
+ - name: cloudflare-workers
+ headers_regex:
+ CF-Worker: .*
+ action: DENY
status_codes:
CHALLENGE: 401
- DENY: 403
\ No newline at end of file
+ DENY: 403
diff --git a/lib/testdata/hack-test.json b/lib/testdata/hack-test.json
index 652dcd87..a173bb18 100644
--- a/lib/testdata/hack-test.json
+++ b/lib/testdata/hack-test.json
@@ -2,8 +2,6 @@
{
"name": "ipv6-ula",
"action": "ALLOW",
- "remote_addresses": [
- "fc00::/7"
- ]
+ "remote_addresses": ["fc00::/7"]
}
-]
\ No newline at end of file
+]
diff --git a/lib/testdata/hack-test.yaml b/lib/testdata/hack-test.yaml
index cd4d7d05..29263e96 100644
--- a/lib/testdata/hack-test.yaml
+++ b/lib/testdata/hack-test.yaml
@@ -1,3 +1,3 @@
- name: well-known
path_regex: ^/.well-known/.*$
- action: ALLOW
\ No newline at end of file
+ action: ALLOW
diff --git a/lib/testdata/rule_change.yaml b/lib/testdata/rule_change.yaml
index c4fe462d..737500e7 100644
--- a/lib/testdata/rule_change.yaml
+++ b/lib/testdata/rule_change.yaml
@@ -1,12 +1,12 @@
bots:
-- name: old-rule
- path_regex: ^/old$
- action: CHALLENGE
+ - name: old-rule
+ path_regex: ^/old$
+ action: CHALLENGE
-- name: new-rule
- path_regex: ^/new$
- action: CHALLENGE
+ - name: new-rule
+ path_regex: ^/new$
+ action: CHALLENGE
status_codes:
CHALLENGE: 401
- DENY: 403
\ No newline at end of file
+ DENY: 403
diff --git a/package-lock.json b/package-lock.json
index bbcae50c..8a31b1ee 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -13,14 +13,19 @@
"preact": "^10.28.2"
},
"devDependencies": {
+ "@commitlint/cli": "^20.4.1",
+ "@commitlint/config-conventional": "^20.4.1",
+ "baseline-browser-mapping": "^2.9.19",
"cssnano": "^7.1.2",
"cssnano-preset-advanced": "^7.0.10",
"esbuild": "^0.27.2",
+ "husky": "^9.1.7",
"playwright": "^1.52.0",
"postcss-cli": "^11.0.1",
"postcss-import": "^16.1.1",
"postcss-import-url": "^7.2.0",
- "postcss-url": "^10.1.3"
+ "postcss-url": "^10.1.3",
+ "prettier": "^3.8.1"
}
},
"node_modules/@aws-crypto/sha256-js": {
@@ -61,6 +66,300 @@
"node": ">=18.0.0"
}
},
+ "node_modules/@babel/code-frame": {
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz",
+ "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.28.5",
+ "js-tokens": "^4.0.0",
+ "picocolors": "^1.1.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.28.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz",
+ "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@commitlint/cli": {
+ "version": "20.4.1",
+ "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-20.4.1.tgz",
+ "integrity": "sha512-uuFKKpc7OtQM+6SRqT+a4kV818o1pS+uvv/gsRhyX7g4x495jg+Q7P0+O9VNGyLXBYP0syksS7gMRDJKcekr6A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@commitlint/format": "^20.4.0",
+ "@commitlint/lint": "^20.4.1",
+ "@commitlint/load": "^20.4.0",
+ "@commitlint/read": "^20.4.0",
+ "@commitlint/types": "^20.4.0",
+ "tinyexec": "^1.0.0",
+ "yargs": "^17.0.0"
+ },
+ "bin": {
+ "commitlint": "cli.js"
+ },
+ "engines": {
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@commitlint/config-conventional": {
+ "version": "20.4.1",
+ "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-20.4.1.tgz",
+ "integrity": "sha512-0YUvIeBtpi86XriqrR+TCULVFiyYTIOEPjK7tTRMxjcBm1qlzb+kz7IF2WxL6Fq5DaundG8VO37BNgMkMTBwqA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@commitlint/types": "^20.4.0",
+ "conventional-changelog-conventionalcommits": "^9.1.0"
+ },
+ "engines": {
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@commitlint/config-validator": {
+ "version": "20.4.0",
+ "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-20.4.0.tgz",
+ "integrity": "sha512-zShmKTF+sqyNOfAE0vKcqnpvVpG0YX8F9G/ZIQHI2CoKyK+PSdladXMSns400aZ5/QZs+0fN75B//3Q5CHw++w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@commitlint/types": "^20.4.0",
+ "ajv": "^8.11.0"
+ },
+ "engines": {
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@commitlint/ensure": {
+ "version": "20.4.1",
+ "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-20.4.1.tgz",
+ "integrity": "sha512-WLQqaFx1pBooiVvBrA1YfJNFqZF8wS/YGOtr5RzApDbV9tQ52qT5VkTsY65hFTnXhW8PcDfZLaknfJTmPejmlw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@commitlint/types": "^20.4.0",
+ "lodash.camelcase": "^4.3.0",
+ "lodash.kebabcase": "^4.1.1",
+ "lodash.snakecase": "^4.1.1",
+ "lodash.startcase": "^4.4.0",
+ "lodash.upperfirst": "^4.3.1"
+ },
+ "engines": {
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@commitlint/execute-rule": {
+ "version": "20.0.0",
+ "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-20.0.0.tgz",
+ "integrity": "sha512-xyCoOShoPuPL44gVa+5EdZsBVao/pNzpQhkzq3RdtlFdKZtjWcLlUFQHSWBuhk5utKYykeJPSz2i8ABHQA+ZZw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@commitlint/format": {
+ "version": "20.4.0",
+ "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-20.4.0.tgz",
+ "integrity": "sha512-i3ki3WR0rgolFVX6r64poBHXM1t8qlFel1G1eCBvVgntE3fCJitmzSvH5JD/KVJN/snz6TfaX2CLdON7+s4WVQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@commitlint/types": "^20.4.0",
+ "picocolors": "^1.1.1"
+ },
+ "engines": {
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@commitlint/is-ignored": {
+ "version": "20.4.1",
+ "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-20.4.1.tgz",
+ "integrity": "sha512-In5EO4JR1lNsAv1oOBBO24V9ND1IqdAJDKZiEpdfjDl2HMasAcT7oA+5BKONv1pRoLG380DGPE2W2RIcUwdgLA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@commitlint/types": "^20.4.0",
+ "semver": "^7.6.0"
+ },
+ "engines": {
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@commitlint/is-ignored/node_modules/semver": {
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
+ "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@commitlint/lint": {
+ "version": "20.4.1",
+ "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-20.4.1.tgz",
+ "integrity": "sha512-g94LrGl/c6UhuhDQqNqU232aslLEN2vzc7MPfQTHzwzM4GHNnEAwVWWnh0zX8S5YXecuLXDwbCsoGwmpAgPWKA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@commitlint/is-ignored": "^20.4.1",
+ "@commitlint/parse": "^20.4.1",
+ "@commitlint/rules": "^20.4.1",
+ "@commitlint/types": "^20.4.0"
+ },
+ "engines": {
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@commitlint/load": {
+ "version": "20.4.0",
+ "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-20.4.0.tgz",
+ "integrity": "sha512-Dauup/GfjwffBXRJUdlX/YRKfSVXsXZLnINXKz0VZkXdKDcaEILAi9oflHGbfydonJnJAbXEbF3nXPm9rm3G6A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@commitlint/config-validator": "^20.4.0",
+ "@commitlint/execute-rule": "^20.0.0",
+ "@commitlint/resolve-extends": "^20.4.0",
+ "@commitlint/types": "^20.4.0",
+ "cosmiconfig": "^9.0.0",
+ "cosmiconfig-typescript-loader": "^6.1.0",
+ "is-plain-obj": "^4.1.0",
+ "lodash.mergewith": "^4.6.2",
+ "picocolors": "^1.1.1"
+ },
+ "engines": {
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@commitlint/message": {
+ "version": "20.4.0",
+ "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-20.4.0.tgz",
+ "integrity": "sha512-B5lGtvHgiLAIsK5nLINzVW0bN5hXv+EW35sKhYHE8F7V9Uz1fR4tx3wt7mobA5UNhZKUNgB/+ldVMQE6IHZRyA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@commitlint/parse": {
+ "version": "20.4.1",
+ "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-20.4.1.tgz",
+ "integrity": "sha512-XNtZjeRcFuAfUnhYrCY02+mpxwY4OmnvD3ETbVPs25xJFFz1nRo/25nHj+5eM+zTeRFvWFwD4GXWU2JEtoK1/w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@commitlint/types": "^20.4.0",
+ "conventional-changelog-angular": "^8.1.0",
+ "conventional-commits-parser": "^6.2.1"
+ },
+ "engines": {
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@commitlint/read": {
+ "version": "20.4.0",
+ "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-20.4.0.tgz",
+ "integrity": "sha512-QfpFn6/I240ySEGv7YWqho4vxqtPpx40FS7kZZDjUJ+eHxu3azfhy7fFb5XzfTqVNp1hNoI3tEmiEPbDB44+cg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@commitlint/top-level": "^20.4.0",
+ "@commitlint/types": "^20.4.0",
+ "git-raw-commits": "^4.0.0",
+ "minimist": "^1.2.8",
+ "tinyexec": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@commitlint/resolve-extends": {
+ "version": "20.4.0",
+ "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-20.4.0.tgz",
+ "integrity": "sha512-ay1KM8q0t+/OnlpqXJ+7gEFQNlUtSU5Gxr8GEwnVf2TPN3+ywc5DzL3JCxmpucqxfHBTFwfRMXxPRRnR5Ki20g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@commitlint/config-validator": "^20.4.0",
+ "@commitlint/types": "^20.4.0",
+ "global-directory": "^4.0.1",
+ "import-meta-resolve": "^4.0.0",
+ "lodash.mergewith": "^4.6.2",
+ "resolve-from": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@commitlint/rules": {
+ "version": "20.4.1",
+ "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-20.4.1.tgz",
+ "integrity": "sha512-WtqypKEPbQEuJwJS4aKs0OoJRBKz1HXPBC9wRtzVNH68FLhPWzxXlF09hpUXM9zdYTpm4vAdoTGkWiBgQ/vL0g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@commitlint/ensure": "^20.4.1",
+ "@commitlint/message": "^20.4.0",
+ "@commitlint/to-lines": "^20.0.0",
+ "@commitlint/types": "^20.4.0"
+ },
+ "engines": {
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@commitlint/to-lines": {
+ "version": "20.0.0",
+ "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-20.0.0.tgz",
+ "integrity": "sha512-2l9gmwiCRqZNWgV+pX1X7z4yP0b3ex/86UmUFgoRt672Ez6cAM2lOQeHFRUTuE6sPpi8XBCGnd8Kh3bMoyHwJw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@commitlint/top-level": {
+ "version": "20.4.0",
+ "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-20.4.0.tgz",
+ "integrity": "sha512-NDzq8Q6jmFaIIBC/GG6n1OQEaHdmaAAYdrZRlMgW6glYWGZ+IeuXmiymDvQNXPc82mVxq2KiE3RVpcs+1OeDeA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "escalade": "^3.2.0"
+ },
+ "engines": {
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@commitlint/types": {
+ "version": "20.4.0",
+ "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-20.4.0.tgz",
+ "integrity": "sha512-aO5l99BQJ0X34ft8b0h7QFkQlqxC6e7ZPVmBKz13xM9O8obDaM1Cld4sQlJDXXU/VFuUzQ30mVtHjVz74TuStw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "conventional-commits-parser": "^6.2.1",
+ "picocolors": "^1.1.1"
+ },
+ "engines": {
+ "node": ">=v18"
+ }
+ },
"node_modules/@esbuild/aix-ppc64": {
"version": "0.27.2",
"resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz",
@@ -553,6 +852,34 @@
"node": ">=14.0.0"
}
},
+ "node_modules/@types/node": {
+ "version": "25.2.3",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-25.2.3.tgz",
+ "integrity": "sha512-m0jEgYlYz+mDJZ2+F4v8D1AyQb+QzsNqRuI7xg1VQX/KlKS0qT9r1Mo16yo5F/MtifXFgaofIFsdFMox2SxIbQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "undici-types": "~7.16.0"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "8.18.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz",
+ "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3",
+ "fast-uri": "^3.0.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
"node_modules/ansi-regex": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
@@ -593,6 +920,20 @@
"node": ">= 8"
}
},
+ "node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true,
+ "license": "Python-2.0"
+ },
+ "node_modules/array-ify": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz",
+ "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/autoprefixer": {
"version": "10.4.21",
"resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz",
@@ -639,9 +980,9 @@
"license": "MIT"
},
"node_modules/baseline-browser-mapping": {
- "version": "2.8.23",
- "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.23.tgz",
- "integrity": "sha512-616V5YX4bepJFzNyOfce5Fa8fDJMfoxzOIzDCZwaGL8MKVpFrXqfNUoIpRn9YMI5pXf/VKgzjB4htFMsFKKdiQ==",
+ "version": "2.9.19",
+ "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.19.tgz",
+ "integrity": "sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==",
"dev": true,
"license": "Apache-2.0",
"bin": {
@@ -726,6 +1067,16 @@
"node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
}
},
+ "node_modules/callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/caniuse-api": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz",
@@ -837,6 +1188,17 @@
"node": ">=16"
}
},
+ "node_modules/compare-func": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz",
+ "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "array-ify": "^1.0.0",
+ "dot-prop": "^5.1.0"
+ }
+ },
"node_modules/concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
@@ -844,6 +1206,93 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/conventional-changelog-angular": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-8.1.0.tgz",
+ "integrity": "sha512-GGf2Nipn1RUCAktxuVauVr1e3r8QrLP/B0lEUsFktmGqc3ddbQkhoJZHJctVU829U1c6mTSWftrVOCHaL85Q3w==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "compare-func": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/conventional-changelog-conventionalcommits": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-9.1.0.tgz",
+ "integrity": "sha512-MnbEysR8wWa8dAEvbj5xcBgJKQlX/m0lhS8DsyAAWDHdfs2faDJxTgzRYlRYpXSe7UiKrIIlB4TrBKU9q9DgkA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "compare-func": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/conventional-commits-parser": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-6.2.1.tgz",
+ "integrity": "sha512-20pyHgnO40rvfI0NGF/xiEoFMkXDtkF8FwHvk5BokoFoCuTQRI8vrNCNFWUOfuolKJMm1tPCHc8GgYEtr1XRNA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "meow": "^13.0.0"
+ },
+ "bin": {
+ "conventional-commits-parser": "dist/cli/index.js"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/cosmiconfig": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz",
+ "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "env-paths": "^2.2.1",
+ "import-fresh": "^3.3.0",
+ "js-yaml": "^4.1.0",
+ "parse-json": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/d-fischer"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.9.5"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/cosmiconfig-typescript-loader": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-6.2.0.tgz",
+ "integrity": "sha512-GEN39v7TgdxgIoNcdkRE3uiAzQt3UXLyHbRHD6YoL048XAeOomyxaP+Hh/+2C6C2wYjxJ2onhJcsQp+L4YEkVQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "jiti": "^2.6.1"
+ },
+ "engines": {
+ "node": ">=v18"
+ },
+ "peerDependencies": {
+ "@types/node": "*",
+ "cosmiconfig": ">=9",
+ "typescript": ">=5"
+ }
+ },
"node_modules/css-declaration-sorter": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.2.0.tgz",
@@ -1058,6 +1507,19 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/dargs": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/dargs/-/dargs-8.1.0.tgz",
+ "integrity": "sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/dependency-graph": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-1.0.0.tgz",
@@ -1127,6 +1589,19 @@
"url": "https://github.com/fb55/domutils?sponsor=1"
}
},
+ "node_modules/dot-prop": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz",
+ "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-obj": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/electron-to-chromium": {
"version": "1.5.244",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.244.tgz",
@@ -1154,6 +1629,26 @@
"url": "https://github.com/fb55/entities?sponsor=1"
}
},
+ "node_modules/env-paths": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz",
+ "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/error-ex": {
+ "version": "1.3.4",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz",
+ "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-arrayish": "^0.2.1"
+ }
+ },
"node_modules/esbuild": {
"version": "0.27.2",
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.2.tgz",
@@ -1206,6 +1701,30 @@
"node": ">=6"
}
},
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-uri": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz",
+ "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fastify"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/fastify"
+ }
+ ],
+ "license": "BSD-3-Clause"
+ },
"node_modules/fill-range": {
"version": "7.1.1",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
@@ -1283,6 +1802,37 @@
"node": "6.* || 8.* || >= 10.*"
}
},
+ "node_modules/git-raw-commits": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-4.0.0.tgz",
+ "integrity": "sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "dargs": "^8.0.0",
+ "meow": "^12.0.1",
+ "split2": "^4.0.0"
+ },
+ "bin": {
+ "git-raw-commits": "cli.mjs"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/git-raw-commits/node_modules/meow": {
+ "version": "12.1.1",
+ "resolved": "https://registry.npmjs.org/meow/-/meow-12.1.1.tgz",
+ "integrity": "sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=16.10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/glob-parent": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
@@ -1296,6 +1846,22 @@
"node": ">= 6"
}
},
+ "node_modules/global-directory": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/global-directory/-/global-directory-4.0.1.tgz",
+ "integrity": "sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ini": "4.1.1"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/graceful-fs": {
"version": "4.2.11",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
@@ -1323,6 +1889,77 @@
"dev": true,
"license": "ISC"
},
+ "node_modules/husky": {
+ "version": "9.1.7",
+ "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz",
+ "integrity": "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "husky": "bin.js"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/typicode"
+ }
+ },
+ "node_modules/import-fresh": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
+ "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/import-fresh/node_modules/resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/import-meta-resolve": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz",
+ "integrity": "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/ini": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz",
+ "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/is-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/is-binary-path": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
@@ -1395,6 +2032,29 @@
"node": ">=0.12.0"
}
},
+ "node_modules/is-obj": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
+ "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-plain-obj": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
+ "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/is-url": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz",
@@ -1402,6 +2062,50 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/jiti": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz",
+ "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "jiti": "lib/jiti-cli.mjs"
+ }
+ },
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/js-yaml": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz",
+ "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/json-parse-even-better-errors": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/jsonfile": {
"version": "6.2.0",
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz",
@@ -1428,6 +2132,13 @@
"url": "https://github.com/sponsors/antonk52"
}
},
+ "node_modules/lines-and-columns": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
+ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/lodash.assign": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz",
@@ -1435,6 +2146,20 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/lodash.camelcase": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+ "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/lodash.kebabcase": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz",
+ "integrity": "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/lodash.memoize": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
@@ -1442,6 +2167,27 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/lodash.mergewith": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz",
+ "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/lodash.snakecase": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz",
+ "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/lodash.startcase": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz",
+ "integrity": "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/lodash.trim": {
"version": "4.5.1",
"resolved": "https://registry.npmjs.org/lodash.trim/-/lodash.trim-4.5.1.tgz",
@@ -1456,6 +2202,13 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/lodash.upperfirst": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz",
+ "integrity": "sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/make-dir": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
@@ -1479,6 +2232,19 @@
"dev": true,
"license": "CC0-1.0"
},
+ "node_modules/meow": {
+ "version": "13.2.0",
+ "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz",
+ "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/mime": {
"version": "2.5.2",
"resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz",
@@ -1505,6 +2271,16 @@
"node": "*"
}
},
+ "node_modules/minimist": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/nanoid": {
"version": "3.3.11",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
@@ -1565,6 +2341,38 @@
"url": "https://github.com/fb55/nth-check?sponsor=1"
}
},
+ "node_modules/parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "callsites": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/parse-json": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
+ "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.0.0",
+ "error-ex": "^1.3.1",
+ "json-parse-even-better-errors": "^2.3.0",
+ "lines-and-columns": "^1.1.6"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/path-parse": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
@@ -2348,6 +3156,22 @@
"url": "https://opencollective.com/preact"
}
},
+ "node_modules/prettier": {
+ "version": "3.8.1",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz",
+ "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "prettier": "bin/prettier.cjs"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/prettier/prettier?sponsor=1"
+ }
+ },
"node_modules/pretty-hrtime": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz",
@@ -2408,6 +3232,16 @@
"node": ">=0.10.0"
}
},
+ "node_modules/require-from-string": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/resolve": {
"version": "1.22.10",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz",
@@ -2429,6 +3263,16 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/resolve-from": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/resolve-relative-url": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/resolve-relative-url/-/resolve-relative-url-1.0.0.tgz",
@@ -2479,6 +3323,16 @@
"node": ">=0.10.0"
}
},
+ "node_modules/split2": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz",
+ "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">= 10.x"
+ }
+ },
"node_modules/string-width": {
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
@@ -2570,6 +3424,16 @@
"dev": true,
"license": "Apache-2.0"
},
+ "node_modules/tinyexec": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz",
+ "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
"node_modules/tinyglobby": {
"version": "0.2.15",
"resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz",
@@ -2637,6 +3501,29 @@
"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
"license": "0BSD"
},
+ "node_modules/typescript": {
+ "version": "5.9.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
+ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "peer": true,
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
+ "node_modules/undici-types": {
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz",
+ "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
"node_modules/universalify": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
diff --git a/package.json b/package.json
index 08c4d14f..01292e4a 100644
--- a/package.json
+++ b/package.json
@@ -4,7 +4,7 @@
"description": "",
"main": "index.js",
"scripts": {
- "test": "npm run assets && go test ./...",
+ "test": "npm run assets && SKIP_INTEGRATION=1 go test ./...",
"test:integration": "npm run assets && go test -v ./internal/test",
"test:integration:podman": "npm run assets && go test -v ./internal/test --playwright-runner=podman",
"test:integration:docker": "npm run assets && go test -v ./internal/test --playwright-runner=docker",
@@ -12,23 +12,58 @@
"build": "npm run assets && go build -o ./var/anubis ./cmd/anubis",
"dev": "npm run assets && go run ./cmd/anubis --use-remote-address --target http://localhost:3000",
"container": "npm run assets && go run ./cmd/containerbuild",
- "package": "yeet",
- "lint": "make lint"
+ "package": "go tool yeet",
+ "lint": "make lint",
+ "prepare": "husky && go mod download",
+ "format": "prettier -w . 2>&1 >/dev/null && go run goimports -w ."
},
"author": "",
"license": "ISC",
"devDependencies": {
+ "@commitlint/cli": "^20.4.1",
+ "@commitlint/config-conventional": "^20.4.1",
+ "baseline-browser-mapping": "^2.9.19",
"cssnano": "^7.1.2",
"cssnano-preset-advanced": "^7.0.10",
"esbuild": "^0.27.2",
+ "husky": "^9.1.7",
"playwright": "^1.52.0",
"postcss-cli": "^11.0.1",
"postcss-import": "^16.1.1",
"postcss-import-url": "^7.2.0",
- "postcss-url": "^10.1.3"
+ "postcss-url": "^10.1.3",
+ "prettier": "^3.8.1"
},
"dependencies": {
"@aws-crypto/sha256-js": "^5.2.0",
"preact": "^10.28.2"
+ },
+ "commitlint": {
+ "extends": [
+ "@commitlint/config-conventional"
+ ],
+ "rules": {
+ "body-max-line-length": [
+ 2,
+ "always",
+ 99999
+ ],
+ "footer-max-line-length": [
+ 2,
+ "always",
+ 99999
+ ],
+ "signed-off-by": [
+ 2,
+ "always"
+ ]
+ }
+ },
+ "prettier": {
+ "singleQuote": false,
+ "tabWidth": 2,
+ "semi": true,
+ "trailingComma": "all",
+ "printWidth": 80
}
-}
\ No newline at end of file
+}
diff --git a/test/anubis_configs/aggressive_403.yaml b/test/anubis_configs/aggressive_403.yaml
index facafd6f..ff966517 100644
--- a/test/anubis_configs/aggressive_403.yaml
+++ b/test/anubis_configs/aggressive_403.yaml
@@ -1,12 +1,12 @@
bots:
-- name: deny
- user_agent_regex: DENY
- action: DENY
+ - name: deny
+ user_agent_regex: DENY
+ action: DENY
-- name: challenge
- user_agent_regex: CHALLENGE
- action: CHALLENGE
+ - name: challenge
+ user_agent_regex: CHALLENGE
+ action: CHALLENGE
status_codes:
CHALLENGE: 401
- DENY: 403
\ No newline at end of file
+ DENY: 403
diff --git a/test/double_slash/test.mjs b/test/double_slash/test.mjs
index 7ae9c5a8..15a54eb9 100644
--- a/test/double_slash/test.mjs
+++ b/test/double_slash/test.mjs
@@ -3,13 +3,13 @@ import { createInterface } from "readline";
async function getPage(path) {
return fetch(`http://localhost:8923${path}`)
- .then(resp => {
+ .then((resp) => {
if (resp.status !== 200) {
throw new Error(`wanted status 200, got status: ${resp.status}`);
}
return resp;
})
- .then(resp => resp.text());
+ .then((resp) => resp.text());
}
(async () => {
@@ -42,4 +42,4 @@ async function getPage(path) {
}
process.exit(failed ? 1 : 0);
-})();
\ No newline at end of file
+})();
diff --git a/test/forced-language/test.mjs b/test/forced-language/test.mjs
index e64237ef..7fab657e 100644
--- a/test/forced-language/test.mjs
+++ b/test/forced-language/test.mjs
@@ -3,25 +3,25 @@ async function getChallengePage() {
headers: {
"Accept-Language": "en",
"User-Agent": "CHALLENGE",
- }
+ },
})
- .then(resp => {
+ .then((resp) => {
if (resp.status !== 200) {
throw new Error(`wanted status 200, got status: ${resp.status}`);
}
return resp;
})
- .then(resp => resp.text());
+ .then((resp) => resp.text());
}
(async () => {
const page = await getChallengePage();
if (!page.includes(``)) {
- console.log(page)
+ console.log(page);
throw new Error("force language smoke test failed");
}
console.log("FORCED_LANGUAGE=de caused a page to be rendered in german");
process.exit(0);
-})();
\ No newline at end of file
+})();
diff --git a/test/i18n/test.mjs b/test/i18n/test.mjs
index 64b32703..ba48ea28 100644
--- a/test/i18n/test.mjs
+++ b/test/i18n/test.mjs
@@ -1,12 +1,14 @@
async function fetchLanguages() {
- return fetch("http://localhost:8923/.within.website/x/cmd/anubis/static/locales/manifest.json")
- .then(resp => {
+ return fetch(
+ "http://localhost:8923/.within.website/x/cmd/anubis/static/locales/manifest.json",
+ )
+ .then((resp) => {
if (resp.status !== 200) {
throw new Error(`wanted status 200, got status: ${resp.status}`);
}
return resp;
})
- .then(resp => resp.json());
+ .then((resp) => resp.json());
}
async function getChallengePage(lang) {
@@ -14,15 +16,15 @@ async function getChallengePage(lang) {
headers: {
"Accept-Language": lang,
"User-Agent": "CHALLENGE",
- }
+ },
})
- .then(resp => {
+ .then((resp) => {
if (resp.status !== 200) {
throw new Error(`wanted status 200, got status: ${resp.status}`);
}
return resp;
})
- .then(resp => resp.text());
+ .then((resp) => resp.text());
}
(async () => {
@@ -42,7 +44,7 @@ async function getChallengePage(lang) {
console.log(`getting for ${lang}`);
const page = await getChallengePage(lang);
- resultSheet[lang] = page.includes(``)
+ resultSheet[lang] = page.includes(``);
}
for (const [lang, result] of Object.entries(resultSheet)) {
@@ -59,4 +61,4 @@ async function getChallengePage(lang) {
}
process.exit(0);
-})();
\ No newline at end of file
+})();
diff --git a/test/k8s/cert-manager/selfsigned-issuer.yaml b/test/k8s/cert-manager/selfsigned-issuer.yaml
index 07d2b7bc..8120e82a 100644
--- a/test/k8s/cert-manager/selfsigned-issuer.yaml
+++ b/test/k8s/cert-manager/selfsigned-issuer.yaml
@@ -3,4 +3,4 @@ kind: ClusterIssuer
metadata:
name: selfsigned
spec:
- selfSigned: {}
\ No newline at end of file
+ selfSigned: {}
diff --git a/test/k8s/deps/cert-manager.yaml b/test/k8s/deps/cert-manager.yaml
index f3e17fae..1d3fda13 100644
--- a/test/k8s/deps/cert-manager.yaml
+++ b/test/k8s/deps/cert-manager.yaml
@@ -10,4 +10,4 @@ spec:
createNamespace: true
set:
installCRDs: "true"
- "prometheus.enabled": "false"
\ No newline at end of file
+ "prometheus.enabled": "false"
diff --git a/test/log-file/test.mjs b/test/log-file/test.mjs
index 8b036cd3..f9db6454 100644
--- a/test/log-file/test.mjs
+++ b/test/log-file/test.mjs
@@ -3,16 +3,16 @@ import { statSync } from "fs";
async function getPage(path) {
return fetch(`http://localhost:8923${path}`, {
headers: {
- 'User-Agent': 'CHALLENGE'
- }
+ "User-Agent": "CHALLENGE",
+ },
})
- .then(resp => {
+ .then((resp) => {
if (resp.status !== 200) {
throw new Error(`wanted status 200, got status: ${resp.status}`);
}
return resp;
})
- .then(resp => resp.text());
+ .then((resp) => resp.text());
}
async function getFileSize(filePath) {
@@ -63,7 +63,9 @@ async function getFileSize(filePath) {
// Verify that log file size increased
if (finalSize <= initialSize) {
- console.error("ERROR: Log file size did not increase after making requests!");
+ console.error(
+ "ERROR: Log file size did not increase after making requests!",
+ );
failed = true;
}
@@ -79,10 +81,14 @@ async function getFileSize(filePath) {
console.log(`Successful requests: ${successCount}/${requests.length}`);
if (failed) {
- console.error("Test failed: Some requests failed or log file size did not increase");
+ console.error(
+ "Test failed: Some requests failed or log file size did not increase",
+ );
process.exit(1);
} else {
- console.log("Test passed: All requests succeeded and log file size increased");
+ console.log(
+ "Test passed: All requests succeeded and log file size increased",
+ );
process.exit(0);
}
-})();
\ No newline at end of file
+})();
diff --git a/test/nginx/conf/nginx/conf-anubis.inc b/test/nginx/conf/nginx/conf-anubis.inc
index 6e5083ae..1535ec91 100644
--- a/test/nginx/conf/nginx/conf-anubis.inc
+++ b/test/nginx/conf/nginx/conf-anubis.inc
@@ -1,8 +1,7 @@
# /etc/nginx/conf-anubis.inc
-
# Forward to anubis
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://anubis;
-}
\ No newline at end of file
+}
diff --git a/test/robots_txt/test.mjs b/test/robots_txt/test.mjs
index ce62b9f7..faa6d89d 100644
--- a/test/robots_txt/test.mjs
+++ b/test/robots_txt/test.mjs
@@ -3,25 +3,25 @@ async function getRobotsTxt() {
headers: {
"Accept-Language": "en",
"User-Agent": "Mozilla/5.0",
- }
+ },
})
- .then(resp => {
+ .then((resp) => {
if (resp.status !== 200) {
throw new Error(`wanted status 200, got status: ${resp.status}`);
}
return resp;
})
- .then(resp => resp.text());
+ .then((resp) => resp.text());
}
(async () => {
const page = await getRobotsTxt();
if (page.includes(``)) {
- console.log(page)
+ console.log(page);
throw new Error("serve robots.txt smoke test failed");
}
console.log("serve-robots-txt serves robots.txt");
process.exit(0);
-})();
\ No newline at end of file
+})();
diff --git a/test/shared/www/index.html b/test/shared/www/index.html
index 8c55c8cb..f259424f 100644
--- a/test/shared/www/index.html
+++ b/test/shared/www/index.html
@@ -1,9 +1,9 @@
-
+
Anubis works!
-
-
+
+
@@ -11,7 +11,10 @@
If you see this, everything has gone according to keikaku.
-
+
-
\ No newline at end of file
+
diff --git a/test/unix-socket-xff/test.mjs b/test/unix-socket-xff/test.mjs
index 8b8479c0..5c85dba4 100644
--- a/test/unix-socket-xff/test.mjs
+++ b/test/unix-socket-xff/test.mjs
@@ -1,19 +1,20 @@
async function testWithUserAgent(userAgent) {
- const statusCode =
- await fetch("https://relayd.local.cetacean.club:3004/reqmeta", {
+ const statusCode = await fetch(
+ "https://relayd.local.cetacean.club:3004/reqmeta",
+ {
headers: {
"User-Agent": userAgent,
- }
- })
- .then(resp => resp.status);
+ },
+ },
+ ).then((resp) => resp.status);
return statusCode;
}
const codes = {
allow: await testWithUserAgent("ALLOW"),
challenge: await testWithUserAgent("CHALLENGE"),
- deny: await testWithUserAgent("DENY")
-}
+ deny: await testWithUserAgent("DENY"),
+};
const expected = {
allow: 200,
@@ -26,5 +27,7 @@ console.log("CHALLENGE:", codes.challenge);
console.log("DENY: ", codes.deny);
if (JSON.stringify(codes) !== JSON.stringify(expected)) {
- throw new Error(`wanted ${JSON.stringify(expected)}, got: ${JSON.stringify(codes)}`);
-}
\ No newline at end of file
+ throw new Error(
+ `wanted ${JSON.stringify(expected)}, got: ${JSON.stringify(codes)}`,
+ );
+}
diff --git a/web/js/algorithms/fast.ts b/web/js/algorithms/fast.ts
index 6330da56..82a9a778 100644
--- a/web/js/algorithms/fast.ts
+++ b/web/js/algorithms/fast.ts
@@ -6,7 +6,9 @@ interface ProcessOptions {
}
const getHardwareConcurrency = () =>
- navigator.hardwareConcurrency !== undefined ? navigator.hardwareConcurrency : 1;
+ navigator.hardwareConcurrency !== undefined
+ ? navigator.hardwareConcurrency
+ : 1;
export default function process(
options: ProcessOptions,
@@ -25,7 +27,10 @@ export default function process(
workerMethod = "webcrypto";
}
- if (navigator.userAgent.includes("Firefox") || navigator.userAgent.includes("Goanna")) {
+ if (
+ navigator.userAgent.includes("Firefox") ||
+ navigator.userAgent.includes("Goanna")
+ ) {
console.log("Firefox detected, using pure-JS fallback");
workerMethod = "purejs";
}
diff --git a/web/js/algorithms/index.ts b/web/js/algorithms/index.ts
index 5b571837..2781aef0 100644
--- a/web/js/algorithms/index.ts
+++ b/web/js/algorithms/index.ts
@@ -3,4 +3,4 @@ import fast from "./fast";
export default {
fast: fast,
slow: fast, // XXX(Xe): slow is deprecated, but keep this around in case anything goes bad
-}
\ No newline at end of file
+};
diff --git a/web/js/bench.ts b/web/js/bench.ts
index 719b1675..1dd7805c 100644
--- a/web/js/bench.ts
+++ b/web/js/bench.ts
@@ -2,13 +2,27 @@ import algorithms from "./algorithms";
const defaultDifficulty = 4;
-const status: HTMLParagraphElement = document.getElementById("status") as HTMLParagraphElement;
-const difficultyInput: HTMLInputElement = document.getElementById("difficulty-input") as HTMLInputElement;
-const algorithmSelect: HTMLSelectElement = document.getElementById("algorithm-select") as HTMLSelectElement;
-const compareSelect: HTMLSelectElement = document.getElementById("compare-select") as HTMLSelectElement;
-const header: HTMLTableRowElement = document.getElementById("table-header") as HTMLTableRowElement;
-const headerCompare: HTMLTableSectionElement = document.getElementById("table-header-compare") as HTMLTableSectionElement;
-const results: HTMLTableRowElement = document.getElementById("results") as HTMLTableRowElement;
+const status: HTMLParagraphElement = document.getElementById(
+ "status",
+) as HTMLParagraphElement;
+const difficultyInput: HTMLInputElement = document.getElementById(
+ "difficulty-input",
+) as HTMLInputElement;
+const algorithmSelect: HTMLSelectElement = document.getElementById(
+ "algorithm-select",
+) as HTMLSelectElement;
+const compareSelect: HTMLSelectElement = document.getElementById(
+ "compare-select",
+) as HTMLSelectElement;
+const header: HTMLTableRowElement = document.getElementById(
+ "table-header",
+) as HTMLTableRowElement;
+const headerCompare: HTMLTableSectionElement = document.getElementById(
+ "table-header-compare",
+) as HTMLTableSectionElement;
+const results: HTMLTableRowElement = document.getElementById(
+ "results",
+) as HTMLTableRowElement;
const setupControls = () => {
if (defaultDifficulty == null) {
@@ -41,7 +55,12 @@ const benchmarkTrial = async (stats, difficulty, algorithm, signal) => {
.join("");
const t0 = performance.now();
- const { hash, nonce } = await process({ basePrefix: "/", version: "devel" }, challenge, Number(difficulty), signal);
+ const { hash, nonce } = await process(
+ { basePrefix: "/", version: "devel" },
+ challenge,
+ Number(difficulty),
+ signal,
+ );
const t1 = performance.now();
console.log({ hash, nonce });
diff --git a/web/js/main.ts b/web/js/main.ts
index fbedb3a6..b07d52d9 100644
--- a/web/js/main.ts
+++ b/web/js/main.ts
@@ -29,22 +29,25 @@ const getAvailableLanguages = async () => {
}
try {
- const response = await fetch(`${basePrefix}/.within.website/x/cmd/anubis/static/locales/manifest.json`);
+ const response = await fetch(
+ `${basePrefix}/.within.website/x/cmd/anubis/static/locales/manifest.json`,
+ );
if (response.ok) {
const manifest = await response.json();
- return manifest.supportedLanguages || ['en'];
+ return manifest.supportedLanguages || ["en"];
}
} catch (error) {
- console.warn('Failed to load language manifest, falling back to default languages');
+ console.warn(
+ "Failed to load language manifest, falling back to default languages",
+ );
}
// Fallback to default languages if manifest loading fails
- return ['en'];
+ return ["en"];
};
// Use the browser language from the HTML lang attribute which is set by the server settings or request headers
-const getBrowserLanguage = async () =>
- document.documentElement.lang;
+const getBrowserLanguage = async () => document.documentElement.lang;
// Load translations from JSON files
const loadTranslations = async (lang) => {
@@ -54,12 +57,16 @@ const loadTranslations = async (lang) => {
}
try {
- const response = await fetch(`${basePrefix}/.within.website/x/cmd/anubis/static/locales/${lang}.json`);
+ const response = await fetch(
+ `${basePrefix}/.within.website/x/cmd/anubis/static/locales/${lang}.json`,
+ );
return await response.json();
} catch (error) {
- console.warn(`Failed to load translations for ${lang}, falling back to English`);
- if (lang !== 'en') {
- return await loadTranslations('en');
+ console.warn(
+ `Failed to load translations for ${lang}, falling back to English`,
+ );
+ if (lang !== "en") {
+ return await loadTranslations("en");
}
throw error;
}
@@ -72,10 +79,10 @@ const getRedirectUrl = () => {
}
if (publicUrl && window.location.href.startsWith(publicUrl)) {
const urlParams = new URLSearchParams(window.location.search);
- return urlParams.get('redir');
+ return urlParams.get("redir");
}
return window.location.href;
-}
+};
let translations = {};
let currentLang;
@@ -95,20 +102,28 @@ const t = (key) => translations[`js_${key}`] || translations[key] || key;
const dependencies = [
{
name: "Web Workers",
- msg: t('web_workers_error'),
+ msg: t("web_workers_error"),
value: window.Worker,
},
{
name: "Cookies",
- msg: t('cookies_error'),
+ msg: t("cookies_error"),
value: navigator.cookieEnabled,
},
];
- const status: HTMLParagraphElement = document.getElementById("status") as HTMLParagraphElement;
- const image: HTMLImageElement = document.getElementById("image") as HTMLImageElement;
- const title: HTMLHeadingElement = document.getElementById("title") as HTMLHeadingElement;
- const progress: HTMLDivElement = document.getElementById("progress") as HTMLDivElement;
+ const status: HTMLParagraphElement = document.getElementById(
+ "status",
+ ) as HTMLParagraphElement;
+ const image: HTMLImageElement = document.getElementById(
+ "image",
+ ) as HTMLImageElement;
+ const title: HTMLHeadingElement = document.getElementById(
+ "title",
+ ) as HTMLHeadingElement;
+ const progress: HTMLDivElement = document.getElementById(
+ "progress",
+ ) as HTMLDivElement;
const anubisVersion = j("anubis_version");
const basePrefix = j("anubis_base_prefix");
@@ -130,12 +145,12 @@ const t = (key) => translations[`js_${key}`] || translations[key] || key;
progress.style.display = "none";
};
- status.innerHTML = t('calculating');
+ status.innerHTML = t("calculating");
for (const { value, name, msg } of dependencies) {
if (!value) {
ohNoes({
- titleMsg: `${t('missing_feature')} ${name}`,
+ titleMsg: `${t("missing_feature")} ${name}`,
statusMsg: msg,
imageSrc: imageURL("reject", anubisVersion, basePrefix),
});
@@ -148,20 +163,20 @@ const t = (key) => translations[`js_${key}`] || translations[key] || key;
const process = algorithms[rules.algorithm];
if (!process) {
ohNoes({
- titleMsg: t('challenge_error'),
- statusMsg: t('challenge_error_msg'),
+ titleMsg: t("challenge_error"),
+ statusMsg: t("challenge_error_msg"),
imageSrc: imageURL("reject", anubisVersion, basePrefix),
});
return;
}
- status.innerHTML = `${t('calculating_difficulty')} ${rules.difficulty}, `;
+ status.innerHTML = `${t("calculating_difficulty")} ${rules.difficulty}, `;
progress.style.display = "inline-block";
// the whole text, including "Speed:", as a single node, because some browsers
// (Firefox mobile) present screen readers with each node as a separate piece
// of text.
- const rateText = document.createTextNode(`${t('speed')} 0kH/s`);
+ const rateText = document.createTextNode(`${t("speed")} 0kH/s`);
status.appendChild(rateText);
let lastSpeedUpdate = 0;
@@ -180,7 +195,7 @@ const t = (key) => translations[`js_${key}`] || translations[key] || key;
// only update the speed every second so it's less visually distracting
if (delta - lastSpeedUpdate > 1000) {
lastSpeedUpdate = delta;
- rateText.data = `${t('speed')} ${(iters / delta).toFixed(3)}kH/s`;
+ rateText.data = `${t("speed")} ${(iters / delta).toFixed(3)}kH/s`;
}
// the probability of still being on the page is (1 - likelihood) ^ iters.
// by definition, half of the time the progress bar only gets to half, so
@@ -192,13 +207,14 @@ const t = (key) => translations[`js_${key}`] || translations[key] || key;
const distance = (1 - Math.pow(probability, 2)) * 100;
progress["aria-valuenow"] = distance;
if (progress.firstElementChild !== null) {
- (progress.firstElementChild as HTMLElement).style.width = `${distance}%`;
+ (progress.firstElementChild as HTMLElement).style.width =
+ `${distance}%`;
}
if (probability < 0.1 && !showingApology) {
status.append(
document.createElement("br"),
- document.createTextNode(t('verification_longer')),
+ document.createTextNode(t("verification_longer")),
);
showingApology = true;
}
@@ -208,7 +224,9 @@ const t = (key) => translations[`js_${key}`] || translations[key] || key;
console.log({ hash, nonce });
if (userReadDetails) {
- const container: HTMLDivElement = document.getElementById("progress") as HTMLDivElement;
+ const container: HTMLDivElement = document.getElementById(
+ "progress",
+ ) as HTMLDivElement;
// Style progress bar as a continue button
container.style.display = "flex";
@@ -224,7 +242,7 @@ const t = (key) => translations[`js_${key}`] || translations[key] || key;
container.style.outlineOffset = "2px";
container.style.width = "min(20rem, 90%)";
container.style.margin = "1rem auto 2rem";
- container.innerHTML = t('finished_reading');
+ container.innerHTML = t("finished_reading");
function onDetailsExpand() {
const redir = getRedirectUrl();
@@ -255,8 +273,8 @@ const t = (key) => translations[`js_${key}`] || translations[key] || key;
}
} catch (err) {
ohNoes({
- titleMsg: t('calculation_error'),
- statusMsg: `${t('calculation_error_msg')} ${err.message}`,
+ titleMsg: t("calculation_error"),
+ statusMsg: `${t("calculation_error_msg")} ${err.message}`,
imageSrc: imageURL("reject", anubisVersion, basePrefix),
});
}
diff --git a/web/js/worker/sha256-purejs.ts b/web/js/worker/sha256-purejs.ts
index 69060615..52ee1cda 100644
--- a/web/js/worker/sha256-purejs.ts
+++ b/web/js/worker/sha256-purejs.ts
@@ -1,4 +1,4 @@
-import { Sha256 } from '@aws-crypto/sha256-js';
+import { Sha256 } from "@aws-crypto/sha256-js";
const calculateSHA256 = (text) => {
const hash = new Sha256();
@@ -12,7 +12,7 @@ function toHexString(arr: Uint8Array): string {
.join("");
}
-addEventListener('message', async ({ data: eventData }) => {
+addEventListener("message", async ({ data: eventData }) => {
const { data, difficulty, threads } = eventData;
let nonce = eventData.nonce;
const isMainThread = nonce === 0;
@@ -21,7 +21,7 @@ addEventListener('message', async ({ data: eventData }) => {
const requiredZeroBytes = Math.floor(difficulty / 2);
const isDifficultyOdd = difficulty % 2 !== 0;
- for (; ;) {
+ for (;;) {
const hashBuffer = await calculateSHA256(data + nonce);
const hashArray = new Uint8Array(hashBuffer);
@@ -34,7 +34,7 @@ addEventListener('message', async ({ data: eventData }) => {
}
if (isValid && isDifficultyOdd) {
- if ((hashArray[requiredZeroBytes] >> 4) !== 0) {
+ if (hashArray[requiredZeroBytes] >> 4 !== 0) {
isValid = false;
}
}
@@ -55,7 +55,7 @@ addEventListener('message', async ({ data: eventData }) => {
/* Truncate the decimal portion of the nonce. This is a bit of an evil bit
* hack, but it works reliably enough. The core of why this works is:
- *
+ *
* > 13.4 % 1 !== 0
* true
* > 13 % 1 !== 0
@@ -70,4 +70,4 @@ addEventListener('message', async ({ data: eventData }) => {
postMessage(nonce);
}
}
-});
\ No newline at end of file
+});
diff --git a/web/js/worker/sha256-webcrypto.ts b/web/js/worker/sha256-webcrypto.ts
index c83f4665..d3cdeca2 100644
--- a/web/js/worker/sha256-webcrypto.ts
+++ b/web/js/worker/sha256-webcrypto.ts
@@ -6,7 +6,10 @@ const calculateSHA256 = async (input: string) => {
};
const toHexString = (byteArray: Uint8Array) => {
- return byteArray.reduce((str, byte) => str + byte.toString(16).padStart(2, "0"), "");
+ return byteArray.reduce(
+ (str, byte) => str + byte.toString(16).padStart(2, "0"),
+ "",
+ );
};
addEventListener("message", async ({ data: eventData }) => {
@@ -18,7 +21,7 @@ addEventListener("message", async ({ data: eventData }) => {
const requiredZeroBytes = Math.floor(difficulty / 2);
const isDifficultyOdd = difficulty % 2 !== 0;
- for (; ;) {
+ for (;;) {
const hashBuffer = await calculateSHA256(data + nonce);
const hashArray = new Uint8Array(hashBuffer);
@@ -31,7 +34,7 @@ addEventListener("message", async ({ data: eventData }) => {
}
if (isValid && isDifficultyOdd) {
- if ((hashArray[requiredZeroBytes] >> 4) !== 0) {
+ if (hashArray[requiredZeroBytes] >> 4 !== 0) {
isValid = false;
}
}
@@ -52,7 +55,7 @@ addEventListener("message", async ({ data: eventData }) => {
/* Truncate the decimal portion of the nonce. This is a bit of an evil bit
* hack, but it works reliably enough. The core of why this works is:
- *
+ *
* > 13.4 % 1 !== 0
* true
* > 13 % 1 !== 0
@@ -67,4 +70,4 @@ addEventListener("message", async ({ data: eventData }) => {
postMessage(nonce);
}
}
-});
\ No newline at end of file
+});
diff --git a/xess/postcss.config.js b/xess/postcss.config.js
index 7084661d..13c708c6 100644
--- a/xess/postcss.config.js
+++ b/xess/postcss.config.js
@@ -5,4 +5,4 @@ module.exports = {
}),
require("postcss-url")({ url: "inline" }),
],
-};
\ No newline at end of file
+};
diff --git a/yeetfile.js b/yeetfile.js
index 47749aff..caab0a5e 100644
--- a/yeetfile.js
+++ b/yeetfile.js
@@ -1,43 +1,41 @@
$`npm run assets`;
-[
- "amd64",
- "arm64",
- "ppc64le",
- "riscv64",
-].forEach(goarch => {
- [deb, rpm, tarball].forEach(method => method.build({
- name: "anubis",
- description: "Anubis weighs the souls of incoming HTTP requests and uses a sha256 proof-of-work challenge in order to protect upstream resources from scraper bots.",
- homepage: "https://anubis.techaro.lol",
- license: "MIT",
- goarch,
+["amd64", "arm64", "ppc64le", "riscv64"].forEach((goarch) => {
+ [deb, rpm, tarball].forEach((method) =>
+ method.build({
+ name: "anubis",
+ description:
+ "Anubis weighs the souls of incoming HTTP requests and uses a sha256 proof-of-work challenge in order to protect upstream resources from scraper bots.",
+ homepage: "https://anubis.techaro.lol",
+ license: "MIT",
+ goarch,
- documentation: {
- "./README.md": "README.md",
- "./LICENSE": "LICENSE",
- "./data/botPolicies.yaml": "botPolicies.yaml",
- },
+ documentation: {
+ "./README.md": "README.md",
+ "./LICENSE": "LICENSE",
+ "./data/botPolicies.yaml": "botPolicies.yaml",
+ },
- build: ({ bin, etc, systemd, doc }) => {
- $`go build -o ${bin}/anubis -ldflags '-s -w -extldflags "-static" -X "github.com/TecharoHQ/anubis.Version=${git.tag()}"' ./cmd/anubis`;
- $`go build -o ${bin}/anubis-robots2policy -ldflags '-s -w -extldflags "-static" -X "github.com/TecharoHQ/anubis.Version=${git.tag()}"' ./cmd/robots2policy`;
+ build: ({ bin, etc, systemd, doc }) => {
+ $`go build -o ${bin}/anubis -ldflags '-s -w -extldflags "-static" -X "github.com/TecharoHQ/anubis.Version=${git.tag()}"' ./cmd/anubis`;
+ $`go build -o ${bin}/anubis-robots2policy -ldflags '-s -w -extldflags "-static" -X "github.com/TecharoHQ/anubis.Version=${git.tag()}"' ./cmd/robots2policy`;
- file.install("./run/anubis@.service", `${systemd}/anubis@.service`);
- file.install("./run/default.env", `${etc}/default.env`);
+ file.install("./run/anubis@.service", `${systemd}/anubis@.service`);
+ file.install("./run/default.env", `${etc}/default.env`);
- $`mkdir -p ${doc}/docs`
- $`cp -a docs/docs ${doc}`;
- $`find ${doc} -name _category_.json -delete`;
- $`mkdir -p ${doc}/data`;
- $`cp -a data/apps ${doc}/data/apps`;
- $`cp -a data/bots ${doc}/data/bots`;
- $`cp -a data/clients ${doc}/data/clients`;
- $`cp -a data/common ${doc}/data/common`;
- $`cp -a data/crawlers ${doc}/data/crawlers`;
- $`cp -a data/meta ${doc}/data/meta`;
- },
- }));
+ $`mkdir -p ${doc}/docs`;
+ $`cp -a docs/docs ${doc}`;
+ $`find ${doc} -name _category_.json -delete`;
+ $`mkdir -p ${doc}/data`;
+ $`cp -a data/apps ${doc}/data/apps`;
+ $`cp -a data/bots ${doc}/data/bots`;
+ $`cp -a data/clients ${doc}/data/clients`;
+ $`cp -a data/common ${doc}/data/common`;
+ $`cp -a data/crawlers ${doc}/data/crawlers`;
+ $`cp -a data/meta ${doc}/data/meta`;
+ },
+ }),
+ );
});
// NOTE(Xe): Fixes #217. This is a "half baked" tarball that includes the harder
@@ -46,41 +44,41 @@ $`npm run assets`;
// model into the bazaar of round holes that various modern languages use. Needless
// to say, this makes adoption easier.
tarball.build({
- name: "anubis-src-vendor",
- license: "MIT",
- // XXX(Xe): This is needed otherwise go will be very sad.
- platform: yeet.goos,
- goarch: yeet.goarch,
+ name: "anubis-src-vendor",
+ license: "MIT",
+ // XXX(Xe): This is needed otherwise go will be very sad.
+ platform: yeet.goos,
+ goarch: yeet.goarch,
- build: ({ out }) => {
- // prepare clean checkout in $out
- $`git archive --format=tar HEAD | tar xC ${out}`;
- // vendor Go dependencies
- $`cd ${out} && go mod vendor`;
- // write VERSION file
- $`echo ${git.tag()} > ${out}/VERSION`;
- },
+ build: ({ out }) => {
+ // prepare clean checkout in $out
+ $`git archive --format=tar HEAD | tar xC ${out}`;
+ // vendor Go dependencies
+ $`cd ${out} && go mod vendor`;
+ // write VERSION file
+ $`echo ${git.tag()} > ${out}/VERSION`;
+ },
- mkFilename: ({ name, version }) => `${name}-${version}`,
+ mkFilename: ({ name, version }) => `${name}-${version}`,
});
tarball.build({
- name: "anubis-src-vendor-npm",
- license: "MIT",
- // XXX(Xe): This is needed otherwise go will be very sad.
- platform: yeet.goos,
- goarch: yeet.goarch,
+ name: "anubis-src-vendor-npm",
+ license: "MIT",
+ // XXX(Xe): This is needed otherwise go will be very sad.
+ platform: yeet.goos,
+ goarch: yeet.goarch,
- build: ({ out }) => {
- // prepare clean checkout in $out
- $`git archive --format=tar HEAD | tar xC ${out}`;
- // vendor Go dependencies
- $`cd ${out} && go mod vendor`;
- // build NPM-bound dependencies
- $`cd ${out} && npm ci && npm run assets && rm -rf node_modules`
- // write VERSION file
- $`echo ${git.tag()} > ${out}/VERSION`;
- },
+ build: ({ out }) => {
+ // prepare clean checkout in $out
+ $`git archive --format=tar HEAD | tar xC ${out}`;
+ // vendor Go dependencies
+ $`cd ${out} && go mod vendor`;
+ // build NPM-bound dependencies
+ $`cd ${out} && npm ci && npm run assets && rm -rf node_modules`;
+ // write VERSION file
+ $`echo ${git.tag()} > ${out}/VERSION`;
+ },
- mkFilename: ({ name, version }) => `${name}-${version}`,
-});
\ No newline at end of file
+ mkFilename: ({ name, version }) => `${name}-${version}`,
+});