From edbb1aca1137f0c90327749d9cf466889f7b2a2a Mon Sep 17 00:00:00 2001 From: PierreDemailly <39910767+PierreDemailly@users.noreply.github.com> Date: Fri, 3 Jan 2025 21:34:50 +0100 Subject: [PATCH] chore: update repository (#334) --- .eslintignore | 1 - .eslintrc | 7 - .github/workflows/agent.yml | 4 +- .github/workflows/codeql.yml | 6 +- .github/workflows/config.yml | 2 +- .github/workflows/discord.yml | 2 +- .github/workflows/logql.yml | 2 +- .github/workflows/morphix.yml | 2 +- .github/workflows/notifiers.yml | 2 +- .github/workflows/pattern.yml | 2 +- .github/workflows/scorecard.yml | 4 +- .github/workflows/slack.yml | 2 +- .github/workflows/teams.yml | 2 +- LICENSE | 2 +- eslint.config.mjs | 7 + package-lock.json | 2549 ++++++++--------- package.json | 20 +- src/agent/README.md | 2 +- src/agent/docs/installation.md | 2 +- src/agent/package.json | 35 +- src/agent/src/alert.ts | 12 +- src/agent/src/compositeRules.ts | 33 +- src/agent/src/database.ts | 6 +- src/agent/src/datasource.ts | 2 +- src/agent/src/index.ts | 8 +- .../src/notifiers/agentFailure.notifier.ts | 14 +- .../src/notifiers/compositeRules.notifier.ts | 12 +- src/agent/src/notifiers/notifier.ts | 15 +- src/agent/src/notifiers/notifierQueue.ts | 4 +- src/agent/src/notifiers/rules.notifier.ts | 16 +- src/agent/src/rules.ts | 71 +- src/agent/src/tasks/asyncTask.ts | 12 +- src/agent/src/utils/getLokiUrl.ts | 8 +- src/agent/src/utils/index.ts | 6 +- src/agent/src/utils/rules.ts | 4 +- src/agent/src/utils/selfMonitoring.ts | 24 +- src/agent/test/FT/compositeRules.spec.ts | 10 +- .../FT/compositeRulesLocalNotifier.spec.ts | 10 +- .../FT/compositeRulesSeverityFilter.spec.ts | 10 +- .../test/FT/compositeRulesUntriggered.spec.ts | 10 +- src/agent/test/FT/database.spec.ts | 4 +- src/agent/test/FT/helpers.ts | 6 +- src/agent/test/FT/rule.walkOnLogs.spec.ts | 11 +- src/agent/test/FT/rules.spec.ts | 8 +- src/agent/test/FT/selfMonitoring.spec.ts | 14 +- src/agent/test/e2e/logs-count.e2e-spec.ts | 8 +- src/agent/test/e2e/setup.ts | 4 +- src/agent/test/utils.spec.ts | 4 +- src/agent/tsconfig.json | 24 +- src/config/package.json | 23 +- src/config/src/index.ts | 8 +- src/config/src/types.ts | 14 +- src/config/src/utils/compositeRules.ts | 6 +- src/config/src/utils/defaultValues.ts | 8 +- src/config/src/utils/index.ts | 10 +- src/config/src/utils/rules.ts | 4 +- src/config/src/utils/severity.ts | 2 +- src/config/src/utils/templates.ts | 2 +- src/config/src/validate.ts | 15 +- .../test/compositeRules.validation.spec.ts | 8 +- src/config/test/extendsConfig.spec.ts | 3 + src/config/test/extendsTemplate.spec.ts | 3 + src/config/test/rule.alert.validation.spec.ts | 6 +- .../test/rule.common.validation.spec.ts | 2 +- .../test/rule.template.validation.spec.ts | 2 +- .../test/selfMonitoring.validation.spec.ts | 4 +- src/config/test/validation.spec.ts | 4 +- src/config/tsconfig.json | 20 +- src/discord/README.md | 2 +- src/discord/package.json | 19 +- src/discord/src/index.ts | 6 +- src/discord/test/execute.spec.ts | 2 +- src/discord/tsconfig.json | 20 +- src/logql/README.md | 2 +- src/logql/package.json | 17 +- src/logql/src/index.ts | 8 +- src/logql/src/labelFilters.ts | 4 +- src/logql/src/lineFilters.ts | 2 +- src/logql/src/streamSelector.ts | 4 +- src/logql/test/labelFilters.spec.ts | 2 +- src/logql/test/lineFilters.spec.ts | 2 +- src/logql/test/logql.spec.ts | 6 +- src/logql/test/parserExpression.spec.ts | 2 +- src/logql/test/streamSelector.spec.ts | 2 +- src/logql/tsconfig.json | 20 +- src/morphix/package.json | 16 +- src/morphix/src/functions/index.ts | 4 +- src/morphix/src/index.ts | 6 +- .../test/{index.spec.mts => index.spec.ts} | 24 +- src/morphix/tsconfig.json | 20 +- src/notifiers/package.json | 17 +- src/notifiers/src/webhook.ts | 6 +- src/notifiers/test/webhook.spec.ts | 4 +- src/notifiers/tsconfig.json | 24 +- src/pattern/README.md | 2 +- src/pattern/package.json | 21 +- src/pattern/src/pattern.ts | 4 +- src/pattern/src/types.ts | 15 +- src/pattern/test/types/index.test-d.ts | 4 +- src/pattern/tsconfig.json | 20 +- src/slack/package.json | 21 +- src/slack/src/index.ts | 8 +- src/slack/test/execute.spec.ts | 2 +- src/slack/tsconfig.json | 20 +- src/teams/package.json | 19 +- src/teams/src/index.ts | 10 +- src/teams/test/execute.spec.ts | 2 +- src/teams/tsconfig.json | 20 +- tsconfig.base.json | 3 + 109 files changed, 1739 insertions(+), 1842 deletions(-) delete mode 100644 .eslintignore delete mode 100644 .eslintrc create mode 100644 eslint.config.mjs rename src/morphix/test/{index.spec.mts => index.spec.ts} (86%) create mode 100644 tsconfig.base.json diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index 581edad3..00000000 --- a/.eslintignore +++ /dev/null @@ -1 +0,0 @@ -**/dist diff --git a/.eslintrc b/.eslintrc deleted file mode 100644 index 56f9dc3b..00000000 --- a/.eslintrc +++ /dev/null @@ -1,7 +0,0 @@ -{ - "extends": "@nodesecure/eslint-config", - "parserOptions": { - "sourceType": "module", - "requireConfigFile": false - } -} diff --git a/.github/workflows/agent.yml b/.github/workflows/agent.yml index 83c14cb1..49a43957 100644 --- a/.github/workflows/agent.yml +++ b/.github/workflows/agent.yml @@ -3,7 +3,7 @@ name: Sigyn Agent on: push: branches: [main] - + pull_request: paths: - "package-lock.json" @@ -19,7 +19,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - node-version: [20.x] + node-version: [22.x] fail-fast: false steps: - name: Harden Runner diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 8e71ed63..64718568 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -54,7 +54,7 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@f09c1c0a94de965c15400f5634aa42fac8fb8f88 # v3.27.5 + uses: github/codeql-action/init@48ab28a6f5dbc2a99bf1e0131198dd8f1df78169 # v3.28.0 with: languages: ${{ matrix.language }} # If you wish to specify custom queries, you can do so here or in a config file. @@ -68,7 +68,7 @@ jobs: # Autobuild attempts to build any compiled languages (C/C++, C#, Go, or Java). # If this step fails, then you should remove it and run the build manually (see below) - name: Autobuild - uses: github/codeql-action/autobuild@f09c1c0a94de965c15400f5634aa42fac8fb8f88 # v3.27.5 + uses: github/codeql-action/autobuild@48ab28a6f5dbc2a99bf1e0131198dd8f1df78169 # v3.28.0 # ℹī¸ Command-line programs to run using the OS shell. # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun @@ -81,6 +81,6 @@ jobs: # ./location_of_script_within_repo/buildscript.sh - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@f09c1c0a94de965c15400f5634aa42fac8fb8f88 # v3.27.5 + uses: github/codeql-action/analyze@48ab28a6f5dbc2a99bf1e0131198dd8f1df78169 # v3.28.0 with: category: "/language:${{matrix.language}}" diff --git a/.github/workflows/config.yml b/.github/workflows/config.yml index 720d7136..05ee494b 100644 --- a/.github/workflows/config.yml +++ b/.github/workflows/config.yml @@ -17,7 +17,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - node-version: [18.x, 20.x] + node-version: [20.x, 22.x] fail-fast: false steps: - name: Harden Runner diff --git a/.github/workflows/discord.yml b/.github/workflows/discord.yml index 0f1f9aff..433b023a 100644 --- a/.github/workflows/discord.yml +++ b/.github/workflows/discord.yml @@ -17,7 +17,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - node-version: [18.x, 20.x] + node-version: [20.x, 22.x] fail-fast: false steps: - name: Harden Runner diff --git a/.github/workflows/logql.yml b/.github/workflows/logql.yml index 1cc3b6d9..f50064a1 100644 --- a/.github/workflows/logql.yml +++ b/.github/workflows/logql.yml @@ -17,7 +17,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - node-version: [18.x, 20.x] + node-version: [20.x, 22.x] fail-fast: false steps: - name: Harden Runner diff --git a/.github/workflows/morphix.yml b/.github/workflows/morphix.yml index d54af9c9..3c4a45bf 100644 --- a/.github/workflows/morphix.yml +++ b/.github/workflows/morphix.yml @@ -17,7 +17,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - node-version: [18.x, 20.x] + node-version: [22.x] fail-fast: false steps: - name: Harden Runner diff --git a/.github/workflows/notifiers.yml b/.github/workflows/notifiers.yml index fea0123f..5e273cef 100644 --- a/.github/workflows/notifiers.yml +++ b/.github/workflows/notifiers.yml @@ -17,7 +17,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - node-version: [18.x, 20.x] + node-version: [20.x, 22.x] fail-fast: false steps: - name: Harden Runner diff --git a/.github/workflows/pattern.yml b/.github/workflows/pattern.yml index a309c281..54efac94 100644 --- a/.github/workflows/pattern.yml +++ b/.github/workflows/pattern.yml @@ -17,7 +17,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - node-version: [18.x, 20.x] + node-version: [20.x, 22.x] fail-fast: false steps: - name: Harden Runner diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index 208bc9e3..ce07713f 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -65,7 +65,7 @@ jobs: # Upload the results as artifacts (optional). Commenting out will disable uploads of run results in SARIF # format to the repository Actions tab. - name: "Upload artifact" - uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 + uses: actions/upload-artifact@6f51ac03b9356f520e9adb1b1b7802705f340c2b # v4.5.0 with: name: SARIF file path: results.sarif @@ -73,6 +73,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@f09c1c0a94de965c15400f5634aa42fac8fb8f88 # v3.27.5 + uses: github/codeql-action/upload-sarif@48ab28a6f5dbc2a99bf1e0131198dd8f1df78169 # v3.28.0 with: sarif_file: results.sarif diff --git a/.github/workflows/slack.yml b/.github/workflows/slack.yml index 54528f73..957fbfbe 100644 --- a/.github/workflows/slack.yml +++ b/.github/workflows/slack.yml @@ -17,7 +17,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - node-version: [18.x, 20.x] + node-version: [20.x, 22.x] fail-fast: false steps: - name: Harden Runner diff --git a/.github/workflows/teams.yml b/.github/workflows/teams.yml index 390110cd..b602b847 100644 --- a/.github/workflows/teams.yml +++ b/.github/workflows/teams.yml @@ -17,7 +17,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - node-version: [18.x, 20.x] + node-version: [20.x, 22.x] fail-fast: false steps: - name: Harden Runner diff --git a/LICENSE b/LICENSE index cfe7ba4b..492690a2 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2023-2024 MyUnisoft +Copyright (c) 2023-2025 MyUnisoft Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 00000000..81698994 --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,7 @@ +import { typescriptConfig } from "@openally/config.eslint"; + +export default typescriptConfig({ + ignores: [ + "workspaces/**/coverage", + ] +}); diff --git a/package-lock.json b/package-lock.json index bd5416f5..5fc4a7eb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,17 +20,18 @@ "src/pattern" ], "devDependencies": { - "@nodesecure/eslint-config": "^1.9.0", - "@types/node": "^22.0.0", - "c8": "^10.1.2", + "@openally/config.eslint": "^1.1.0", + "@openally/config.typescript": "^1.0.3", + "@types/node": "^22.10.5", + "c8": "^10.1.3", "cross-env": "^7.0.3", - "fastify": "^5.0.0", + "fastify": "^5.2.0", "glob": "^11.0.0", - "pino-loki": "^2.3.0", - "tsup": "^8.1.0", - "tsx": "^4.16.2", - "typescript": "^5.5.3", - "vitepress": "^1.3.1" + "pino-loki": "^2.4.0", + "tsup": "^8.3.5", + "tsx": "^4.19.2", + "typescript": "^5.7.2", + "vitepress": "^1.5.0" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -267,19 +268,6 @@ "node": ">= 14.0.0" } }, - "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@babel/code-frame": { "version": "7.23.5", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", @@ -293,183 +281,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/compat-data": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", - "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.7.tgz", - "integrity": "sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.23.7", - "@babel/parser": "^7.23.6", - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.7", - "@babel/types": "^7.23.6", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/eslint-parser": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.23.3.tgz", - "integrity": "sha512-9bTuNlyx7oSstodm1cR1bECj4fkiknsDa1YniISkJemMY3DGhJNYBECbe6QD/q54mp2J8VO66jW3/7uP//iFCw==", - "dev": true, - "dependencies": { - "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", - "eslint-visitor-keys": "^2.1.0", - "semver": "^6.3.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || >=14.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.11.0", - "eslint": "^7.5.0 || ^8.0.0" - } - }, - "node_modules/@babel/generator": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", - "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.23.6", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", - "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-validator-option": "^7.23.5", - "browserslist": "^4.22.2", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-string-parser": { "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", @@ -488,29 +299,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-validator-option": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", - "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.7.tgz", - "integrity": "sha512-6AMnjCoC8wjqBzDHkuqpa7jAKwvMo4dC+lr/TFBz+ucfulO1XMpDnwWPGBNwClOKZ8h6xn5N81W/R5OrcKtCbQ==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.7", - "@babel/types": "^7.23.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/highlight": { "version": "7.23.4", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", @@ -540,41 +328,6 @@ "node": ">=6.0.0" } }, - "node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.7.tgz", - "integrity": "sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.6", - "@babel/types": "^7.23.6", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/types": { "version": "7.26.3", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz", @@ -1063,24 +816,78 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", "dev": true, + "license": "MIT", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, + "node_modules/@eslint/config-array": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.1.tgz", + "integrity": "sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.5", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/core": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.9.1.tgz", + "integrity": "sha512-GuUdqkyyzQI5RMIWkHhvTWLCyLo1jNK3vzkSyaExH5kHPDHcuL2VOpHjmMY+y3+NC69qAKToBqldTBgYeLSr9Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.2.0.tgz", + "integrity": "sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==", "dev": true, + "license": "MIT", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", + "espree": "^10.0.1", + "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -1088,7 +895,7 @@ "strip-json-comments": "^3.1.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -1099,6 +906,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -1115,37 +923,25 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@eslint/eslintrc/node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -1154,12 +950,36 @@ } }, "node_modules/@eslint/js": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", - "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", + "version": "9.17.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.17.0.tgz", + "integrity": "sha512-Sxc4hqcs1kTu0iID3kcZDW3JHq2a77HO9P8CP6YEA/FpH3Ll8UXE2r/86Rz9YJLKme39S9vU5OWNjC6Xl0Cr3w==", "dev": true, + "license": "MIT", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.5.tgz", + "integrity": "sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.4.tgz", + "integrity": "sha512-zSkKow6H5Kdm0ZUQUB2kV5JIXqoG0+uH5YADhaEHswm664N9Db8dXSi0nMJpacpMf+MyyglF1vnZohpEg5yUtg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/@fastify/ajv-compiler": { @@ -1205,40 +1025,42 @@ "fast-deep-equal": "^3.1.3" } }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.13", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", - "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" - }, + "license": "Apache-2.0", "engines": { - "node": ">=10.10.0" + "node": ">=18.18.0" } }, - "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/@humanfs/node": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", + "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.3.0" + }, + "engines": { + "node": ">=18.18.0" } }, - "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, + "license": "Apache-2.0", "engines": { - "node": "*" + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, "node_modules/@humanwhocodes/module-importer": { @@ -1254,11 +1076,19 @@ "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", - "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", - "dev": true + "node_modules/@humanwhocodes/retry": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.1.tgz", + "integrity": "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } }, "node_modules/@iconify-json/simple-icons": { "version": "1.2.16", @@ -1457,15 +1287,6 @@ "node": ">=18.17" } }, - "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": { - "version": "5.1.1-v1", - "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", - "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==", - "dev": true, - "dependencies": { - "eslint-scope": "5.1.1" - } - }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -1501,46 +1322,655 @@ "node": ">= 8" } }, - "node_modules/@nodesecure/eslint-config": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@nodesecure/eslint-config/-/eslint-config-1.9.0.tgz", - "integrity": "sha512-OzPsejWVSfdACHGBxLbg/jeKzTfDpvyasxkWdeLvDXiA0x0RxvWPm55kPH6QISa2e5SoILM8E8HEDsSWIJiOlg==", - "dev": true, - "dependencies": { - "@babel/core": "^7.23.5", - "@babel/eslint-parser": "^7.23.3", - "@typescript-eslint/eslint-plugin": "^6.13.1", - "@typescript-eslint/parser": "^6.13.1", - "eslint": "^8.55.0" - }, - "engines": { - "node": ">=18.0.0" - } - }, "node_modules/@openally/auto-url": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@openally/auto-url/-/auto-url-1.0.1.tgz", "integrity": "sha512-0o+C0mZGDts+ToAxXPg3KGa1PHnVNHGRn4p5SCHGn8GLxSPK1w6T5+eGa6JQa+ddyW46KvcV0jvZ2MhyoGB1pA==" }, - "node_modules/@openally/result": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@openally/result/-/result-1.3.0.tgz", - "integrity": "sha512-4S/bXxD04aKwKPte7gDkyvbyEF8rP7fTQkzwoHMC7C8mu+XUnn2L+YIq2aGtW3GNo3O+3n51SoqiMTcmkKiC7Q==", - "engines": { - "node": ">=16.9.x" + "node_modules/@openally/config.eslint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@openally/config.eslint/-/config.eslint-1.1.0.tgz", + "integrity": "sha512-orReDG8B63elnrlOK5wwrf8cLR3ztmC9WPE6UkuSPNAsO6O9Eoi+mW3sDl2/S46o7h4unSymhh5KGcAC9LkMOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@stylistic/eslint-plugin": "^2.6.2", + "@typescript-eslint/parser": "8.2.0", + "eslint": "^9.9.0", + "globals": "^15.9.0", + "typescript-eslint": "^8.1.0" } }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "node_modules/@openally/config.eslint/node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.19.0.tgz", + "integrity": "sha512-NggSaEZCdSrFddbctrVjkVZvFC6KGfKfNK0CU7mNK/iKHGKbzT4Wmgm08dKpcZECBu9f5FypndoMyRHkdqfT1Q==", "dev": true, - "optional": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.19.0", + "@typescript-eslint/type-utils": "8.19.0", + "@typescript-eslint/utils": "8.19.0", + "@typescript-eslint/visitor-keys": "8.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^1.3.0" + }, "engines": { - "node": ">=14" - } - }, - "node_modules/@rollup/rollup-android-arm-eabi": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" + } + }, + "node_modules/@openally/config.eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.19.0.tgz", + "integrity": "sha512-hkoJiKQS3GQ13TSMEiuNmSCvhz7ujyqD1x3ShbaETATHrck+9RaDdUbt+osXaUuns9OFwrDTTrjtwsU8gJyyRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.19.0", + "@typescript-eslint/visitor-keys": "8.19.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@openally/config.eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.19.0.tgz", + "integrity": "sha512-8XQ4Ss7G9WX8oaYvD4OOLCjIQYgRQxO+qCiR2V2s2GxI9AUpo7riNwo6jDhKtTcaJjT8PY54j2Yb33kWtSJsmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@openally/config.eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.19.0.tgz", + "integrity": "sha512-mCFtBbFBJDCNCWUl5y6sZSCHXw1DEFEk3c/M3nRK2a4XUB8StGFtmcEMizdjKuBzB6e/smJAAWYug3VrdLMr1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.19.0", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@openally/config.eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@openally/config.eslint/node_modules/@typescript-eslint/parser": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.2.0.tgz", + "integrity": "sha512-j3Di+o0lHgPrb7FxL3fdEy6LJ/j2NE8u+AP/5cQ9SKb+JLH6V6UHDqJ+e0hXBkHP1wn1YDFjYCS9LBQsZDlDEg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/scope-manager": "8.2.0", + "@typescript-eslint/types": "8.2.0", + "@typescript-eslint/typescript-estree": "8.2.0", + "@typescript-eslint/visitor-keys": "8.2.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@openally/config.eslint/node_modules/@typescript-eslint/scope-manager": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.2.0.tgz", + "integrity": "sha512-OFn80B38yD6WwpoHU2Tz/fTz7CgFqInllBoC3WP+/jLbTb4gGPTy9HBSTsbDWkMdN55XlVU0mMDYAtgvlUspGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.2.0", + "@typescript-eslint/visitor-keys": "8.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@openally/config.eslint/node_modules/@typescript-eslint/type-utils": { + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.19.0.tgz", + "integrity": "sha512-TZs0I0OSbd5Aza4qAMpp1cdCYVnER94IziudE3JU328YUHgWu9gwiwhag+fuLeJ2LkWLXI+F/182TbG+JaBdTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "8.19.0", + "@typescript-eslint/utils": "8.19.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" + } + }, + "node_modules/@openally/config.eslint/node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.19.0.tgz", + "integrity": "sha512-8XQ4Ss7G9WX8oaYvD4OOLCjIQYgRQxO+qCiR2V2s2GxI9AUpo7riNwo6jDhKtTcaJjT8PY54j2Yb33kWtSJsmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@openally/config.eslint/node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.19.0.tgz", + "integrity": "sha512-WW9PpDaLIFW9LCbucMSdYUuGeFUz1OkWYS/5fwZwTA+l2RwlWFdJvReQqMUMBw4yJWJOfqd7An9uwut2Oj8sLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.19.0", + "@typescript-eslint/visitor-keys": "8.19.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.8.0" + } + }, + "node_modules/@openally/config.eslint/node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.19.0.tgz", + "integrity": "sha512-mCFtBbFBJDCNCWUl5y6sZSCHXw1DEFEk3c/M3nRK2a4XUB8StGFtmcEMizdjKuBzB6e/smJAAWYug3VrdLMr1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.19.0", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@openally/config.eslint/node_modules/@typescript-eslint/type-utils/node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@openally/config.eslint/node_modules/@typescript-eslint/types": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.2.0.tgz", + "integrity": "sha512-6a9QSK396YqmiBKPkJtxsgZZZVjYQ6wQ/TlI0C65z7vInaETuC6HAHD98AGLC8DyIPqHytvNuS8bBVvNLKyqvQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@openally/config.eslint/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.2.0.tgz", + "integrity": "sha512-kiG4EDUT4dImplOsbh47B1QnNmXSoUqOjWDvCJw/o8LgfD0yr7k2uy54D5Wm0j4t71Ge1NkynGhpWdS0dEIAUA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "8.2.0", + "@typescript-eslint/visitor-keys": "8.2.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@openally/config.eslint/node_modules/@typescript-eslint/utils": { + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.19.0.tgz", + "integrity": "sha512-PTBG+0oEMPH9jCZlfg07LCB2nYI0I317yyvXGfxnvGvw4SHIOuRnQ3kadyyXY6tGdChusIHIbM5zfIbp4M6tCg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.19.0", + "@typescript-eslint/types": "8.19.0", + "@typescript-eslint/typescript-estree": "8.19.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" + } + }, + "node_modules/@openally/config.eslint/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.19.0.tgz", + "integrity": "sha512-hkoJiKQS3GQ13TSMEiuNmSCvhz7ujyqD1x3ShbaETATHrck+9RaDdUbt+osXaUuns9OFwrDTTrjtwsU8gJyyRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.19.0", + "@typescript-eslint/visitor-keys": "8.19.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@openally/config.eslint/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.19.0.tgz", + "integrity": "sha512-8XQ4Ss7G9WX8oaYvD4OOLCjIQYgRQxO+qCiR2V2s2GxI9AUpo7riNwo6jDhKtTcaJjT8PY54j2Yb33kWtSJsmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@openally/config.eslint/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.19.0.tgz", + "integrity": "sha512-WW9PpDaLIFW9LCbucMSdYUuGeFUz1OkWYS/5fwZwTA+l2RwlWFdJvReQqMUMBw4yJWJOfqd7An9uwut2Oj8sLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.19.0", + "@typescript-eslint/visitor-keys": "8.19.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.8.0" + } + }, + "node_modules/@openally/config.eslint/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.19.0.tgz", + "integrity": "sha512-mCFtBbFBJDCNCWUl5y6sZSCHXw1DEFEk3c/M3nRK2a4XUB8StGFtmcEMizdjKuBzB6e/smJAAWYug3VrdLMr1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.19.0", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@openally/config.eslint/node_modules/@typescript-eslint/utils/node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@openally/config.eslint/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.2.0.tgz", + "integrity": "sha512-sbgsPMW9yLvS7IhCi8IpuK1oBmtbWUNP+hBdwl/I9nzqVsszGnNGti5r9dUtF5RLivHUFFIdRvLiTsPhzSyJ3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.2.0", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@openally/config.eslint/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@openally/config.eslint/node_modules/globals": { + "version": "15.14.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.14.0.tgz", + "integrity": "sha512-OkToC372DtlQeje9/zHIo5CT8lRP/FUgEOKBEhU4e0abL7J7CD24fD9ohiLN5hagG/kWCYj4K5oaxxtj2Z0Dig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@openally/config.eslint/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@openally/config.eslint/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@openally/config.eslint/node_modules/typescript-eslint": { + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.19.0.tgz", + "integrity": "sha512-Ni8sUkVWYK4KAcTtPjQ/UTiRk6jcsuDhPpxULapUDi8A/l8TSBk+t1GtJA1RsCzIJg0q6+J7bf35AwQigENWRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.19.0", + "@typescript-eslint/parser": "8.19.0", + "@typescript-eslint/utils": "8.19.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" + } + }, + "node_modules/@openally/config.eslint/node_modules/typescript-eslint/node_modules/@typescript-eslint/parser": { + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.19.0.tgz", + "integrity": "sha512-6M8taKyOETY1TKHp0x8ndycipTVgmp4xtg5QpEZzXxDhNvvHOJi5rLRkLr8SK3jTgD5l4fTlvBiRdfsuWydxBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.19.0", + "@typescript-eslint/types": "8.19.0", + "@typescript-eslint/typescript-estree": "8.19.0", + "@typescript-eslint/visitor-keys": "8.19.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" + } + }, + "node_modules/@openally/config.eslint/node_modules/typescript-eslint/node_modules/@typescript-eslint/scope-manager": { + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.19.0.tgz", + "integrity": "sha512-hkoJiKQS3GQ13TSMEiuNmSCvhz7ujyqD1x3ShbaETATHrck+9RaDdUbt+osXaUuns9OFwrDTTrjtwsU8gJyyRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.19.0", + "@typescript-eslint/visitor-keys": "8.19.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@openally/config.eslint/node_modules/typescript-eslint/node_modules/@typescript-eslint/types": { + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.19.0.tgz", + "integrity": "sha512-8XQ4Ss7G9WX8oaYvD4OOLCjIQYgRQxO+qCiR2V2s2GxI9AUpo7riNwo6jDhKtTcaJjT8PY54j2Yb33kWtSJsmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@openally/config.eslint/node_modules/typescript-eslint/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.19.0.tgz", + "integrity": "sha512-WW9PpDaLIFW9LCbucMSdYUuGeFUz1OkWYS/5fwZwTA+l2RwlWFdJvReQqMUMBw4yJWJOfqd7An9uwut2Oj8sLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.19.0", + "@typescript-eslint/visitor-keys": "8.19.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.8.0" + } + }, + "node_modules/@openally/config.eslint/node_modules/typescript-eslint/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.19.0.tgz", + "integrity": "sha512-mCFtBbFBJDCNCWUl5y6sZSCHXw1DEFEk3c/M3nRK2a4XUB8StGFtmcEMizdjKuBzB6e/smJAAWYug3VrdLMr1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.19.0", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@openally/config.eslint/node_modules/typescript-eslint/node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@openally/config.typescript": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@openally/config.typescript/-/config.typescript-1.0.3.tgz", + "integrity": "sha512-qJ85Zil/pR1/eR2/4j6jsqRoAAjH+1D+0A7+FhvbLv4TcjvgYmjzDt5bl9/AK2wzPP5Ci+KetVR0tbc22Hdmqw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@openally/result": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@openally/result/-/result-1.3.0.tgz", + "integrity": "sha512-4S/bXxD04aKwKPte7gDkyvbyEF8rP7fTQkzwoHMC7C8mu+XUnn2L+YIq2aGtW3GNo3O+3n51SoqiMTcmkKiC7Q==", + "engines": { + "node": ">=16.9.x" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.28.1", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.28.1.tgz", "integrity": "sha512-2aZp8AES04KI2dy3Ss6/MDjXbwBzj+i0GqKtWXgw2/Ma6E4jJvujryO6gJAghIRVz7Vwr9Gtl/8na3nDUKpraQ==", @@ -1781,618 +2211,461 @@ "cpu": [ "x64" ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@shikijs/core": { - "version": "1.24.2", - "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.24.2.tgz", - "integrity": "sha512-BpbNUSKIwbKrRRA+BQj0BEWSw+8kOPKDJevWeSE/xIqGX7K0xrCZQ9kK0nnEQyrzsUoka1l81ZtJ2mGaCA32HQ==", - "dev": true, - "dependencies": { - "@shikijs/engine-javascript": "1.24.2", - "@shikijs/engine-oniguruma": "1.24.2", - "@shikijs/types": "1.24.2", - "@shikijs/vscode-textmate": "^9.3.0", - "@types/hast": "^3.0.4", - "hast-util-to-html": "^9.0.3" - } - }, - "node_modules/@shikijs/engine-javascript": { - "version": "1.24.2", - "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-1.24.2.tgz", - "integrity": "sha512-EqsmYBJdLEwEiO4H+oExz34a5GhhnVp+jH9Q/XjPjmBPc6TE/x4/gD0X3i0EbkKKNqXYHHJTJUpOLRQNkEzS9Q==", - "dev": true, - "dependencies": { - "@shikijs/types": "1.24.2", - "@shikijs/vscode-textmate": "^9.3.0", - "oniguruma-to-es": "0.7.0" - } - }, - "node_modules/@shikijs/engine-oniguruma": { - "version": "1.24.2", - "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-1.24.2.tgz", - "integrity": "sha512-ZN6k//aDNWRJs1uKB12pturKHh7GejKugowOFGAuG7TxDRLod1Bd5JhpOikOiFqPmKjKEPtEA6mRCf7q3ulDyQ==", - "dev": true, - "dependencies": { - "@shikijs/types": "1.24.2", - "@shikijs/vscode-textmate": "^9.3.0" - } - }, - "node_modules/@shikijs/transformers": { - "version": "1.24.2", - "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-1.24.2.tgz", - "integrity": "sha512-cIwn8YSwO3bsWKJ+pezcXY1Vq0BVwvuLes1TZSC5+Awi6Tsfqhf3vBahOIqZK1rraMKOti2VEAEF/95oXMig1w==", - "dev": true, - "dependencies": { - "shiki": "1.24.2" - } - }, - "node_modules/@shikijs/types": { - "version": "1.24.2", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-1.24.2.tgz", - "integrity": "sha512-bdeWZiDtajGLG9BudI0AHet0b6e7FbR0EsE4jpGaI0YwHm/XJunI9+3uZnzFtX65gsyJ6ngCIWUfA4NWRPnBkQ==", - "dev": true, - "dependencies": { - "@shikijs/vscode-textmate": "^9.3.0", - "@types/hast": "^3.0.4" - } - }, - "node_modules/@shikijs/vscode-textmate": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-9.3.1.tgz", - "integrity": "sha512-79QfK1393x9Ho60QFyLti+QfdJzRQCVLFb97kOIV7Eo9vQU/roINgk7m24uv0a7AUvN//RDH36FLjjK48v0s9g==", - "dev": true - }, - "node_modules/@sigyn/agent": { - "resolved": "src/agent", - "link": true - }, - "node_modules/@sigyn/config": { - "resolved": "src/config", - "link": true - }, - "node_modules/@sigyn/discord": { - "resolved": "src/discord", - "link": true - }, - "node_modules/@sigyn/logql": { - "resolved": "src/logql", - "link": true - }, - "node_modules/@sigyn/morphix": { - "resolved": "src/morphix", - "link": true - }, - "node_modules/@sigyn/notifiers": { - "resolved": "src/notifiers", - "link": true - }, - "node_modules/@sigyn/pattern": { - "resolved": "src/pattern", - "link": true - }, - "node_modules/@sigyn/slack": { - "resolved": "src/slack", - "link": true - }, - "node_modules/@sigyn/teams": { - "resolved": "src/teams", - "link": true - }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true - }, - "node_modules/@slack/types": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/@slack/types/-/types-2.14.0.tgz", - "integrity": "sha512-n0EGm7ENQRxlXbgKSrQZL69grzg1gHLAVd+GlRVQJ1NSORo0FrApR7wql/gaKdu2n4TO83Sq/AmeUOqD60aXUA==", - "engines": { - "node": ">= 12.13.0", - "npm": ">= 6.12.0" - } - }, - "node_modules/@tsd/typescript": { - "version": "5.4.4", - "resolved": "https://registry.npmjs.org/@tsd/typescript/-/typescript-5.4.4.tgz", - "integrity": "sha512-sqE6Rz9UNHBuCtuREo/PwsuUaegP1KDSfxMd+9K1qPpt7XO8BmkIImUp7zAqyvwXWUHs+sj6osEkkpyE0tFgfA==", - "dev": true, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/@types/better-sqlite3": { - "version": "7.6.11", - "resolved": "https://registry.npmjs.org/@types/better-sqlite3/-/better-sqlite3-7.6.11.tgz", - "integrity": "sha512-i8KcD3PgGtGBLl3+mMYA8PdKkButvPyARxA7IQAd6qeslht13qxb1zzO8dRCtE7U3IoJS782zDBAeoKiM695kg==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/docker-modem": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/docker-modem/-/docker-modem-3.0.6.tgz", - "integrity": "sha512-yKpAGEuKRSS8wwx0joknWxsmLha78wNMe9R2S3UNsVOkZded8UqOrV8KoeDXoXsjndxwyF3eIhyClGbO1SEhEg==", - "dev": true, - "dependencies": { - "@types/node": "*", - "@types/ssh2": "*" - } - }, - "node_modules/@types/dockerode": { - "version": "3.3.29", - "resolved": "https://registry.npmjs.org/@types/dockerode/-/dockerode-3.3.29.tgz", - "integrity": "sha512-5PRRq/yt5OT/Jf77ltIdz4EiR9+VLnPF+HpU4xGFwUqmV24Co2HKBNW3w+slqZ1CYchbcDeqJASHDYWzZCcMiQ==", - "dev": true, - "dependencies": { - "@types/docker-modem": "*", - "@types/node": "*", - "@types/ssh2": "*" - } - }, - "node_modules/@types/eslint": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.29.0.tgz", - "integrity": "sha512-VNcvioYDH8/FxaeTKkM4/TiTwt6pBV9E3OfGmvaw8tPl0rrHCJ4Ll15HRT+pMiFAf/MLQvAzC+6RzUMEL9Ceng==", - "dev": true, - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", - "dev": true - }, - "node_modules/@types/hast": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", - "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", - "dev": true, - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", - "dev": true - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true - }, - "node_modules/@types/linkify-it": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", - "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", - "dev": true - }, - "node_modules/@types/markdown-it": { - "version": "14.1.2", - "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz", - "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==", - "dev": true, - "dependencies": { - "@types/linkify-it": "^5", - "@types/mdurl": "^2" - } + "dev": true, + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/@types/mdast": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", - "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "node_modules/@shikijs/core": { + "version": "1.24.2", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.24.2.tgz", + "integrity": "sha512-BpbNUSKIwbKrRRA+BQj0BEWSw+8kOPKDJevWeSE/xIqGX7K0xrCZQ9kK0nnEQyrzsUoka1l81ZtJ2mGaCA32HQ==", "dev": true, "dependencies": { - "@types/unist": "*" + "@shikijs/engine-javascript": "1.24.2", + "@shikijs/engine-oniguruma": "1.24.2", + "@shikijs/types": "1.24.2", + "@shikijs/vscode-textmate": "^9.3.0", + "@types/hast": "^3.0.4", + "hast-util-to-html": "^9.0.3" } }, - "node_modules/@types/mdurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", - "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", - "dev": true - }, - "node_modules/@types/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", - "dev": true - }, - "node_modules/@types/node": { - "version": "22.10.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.2.tgz", - "integrity": "sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ==", + "node_modules/@shikijs/engine-javascript": { + "version": "1.24.2", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-1.24.2.tgz", + "integrity": "sha512-EqsmYBJdLEwEiO4H+oExz34a5GhhnVp+jH9Q/XjPjmBPc6TE/x4/gD0X3i0EbkKKNqXYHHJTJUpOLRQNkEzS9Q==", "dev": true, "dependencies": { - "undici-types": "~6.20.0" + "@shikijs/types": "1.24.2", + "@shikijs/vscode-textmate": "^9.3.0", + "oniguruma-to-es": "0.7.0" } }, - "node_modules/@types/node/node_modules/undici-types": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", - "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", - "dev": true - }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", - "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", - "dev": true - }, - "node_modules/@types/semver": { - "version": "7.5.6", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", - "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==", - "dev": true - }, - "node_modules/@types/ssh2": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/@types/ssh2/-/ssh2-1.15.0.tgz", - "integrity": "sha512-YcT8jP5F8NzWeevWvcyrrLB3zcneVjzYY9ZDSMAMboI+2zR1qYWFhwsyOFVzT7Jorn67vqxC0FRiw8YyG9P1ww==", + "node_modules/@shikijs/engine-oniguruma": { + "version": "1.24.2", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-1.24.2.tgz", + "integrity": "sha512-ZN6k//aDNWRJs1uKB12pturKHh7GejKugowOFGAuG7TxDRLod1Bd5JhpOikOiFqPmKjKEPtEA6mRCf7q3ulDyQ==", "dev": true, "dependencies": { - "@types/node": "^18.11.18" + "@shikijs/types": "1.24.2", + "@shikijs/vscode-textmate": "^9.3.0" } }, - "node_modules/@types/ssh2-streams": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/@types/ssh2-streams/-/ssh2-streams-0.1.12.tgz", - "integrity": "sha512-Sy8tpEmCce4Tq0oSOYdfqaBpA3hDM8SoxoFh5vzFsu2oL+znzGz8oVWW7xb4K920yYMUY+PIG31qZnFMfPWNCg==", + "node_modules/@shikijs/transformers": { + "version": "1.24.2", + "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-1.24.2.tgz", + "integrity": "sha512-cIwn8YSwO3bsWKJ+pezcXY1Vq0BVwvuLes1TZSC5+Awi6Tsfqhf3vBahOIqZK1rraMKOti2VEAEF/95oXMig1w==", "dev": true, "dependencies": { - "@types/node": "*" + "shiki": "1.24.2" } }, - "node_modules/@types/ssh2/node_modules/@types/node": { - "version": "18.19.39", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.39.tgz", - "integrity": "sha512-nPwTRDKUctxw3di5b4TfT3I0sWDiWoPQCZjXhvdkINntwr8lcoVCKsTgnXeRubKIlfnV+eN/HYk6Jb40tbcEAQ==", + "node_modules/@shikijs/types": { + "version": "1.24.2", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-1.24.2.tgz", + "integrity": "sha512-bdeWZiDtajGLG9BudI0AHet0b6e7FbR0EsE4jpGaI0YwHm/XJunI9+3uZnzFtX65gsyJ6ngCIWUfA4NWRPnBkQ==", "dev": true, "dependencies": { - "undici-types": "~5.26.4" + "@shikijs/vscode-textmate": "^9.3.0", + "@types/hast": "^3.0.4" } }, - "node_modules/@types/unist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", - "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "node_modules/@shikijs/vscode-textmate": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-9.3.1.tgz", + "integrity": "sha512-79QfK1393x9Ho60QFyLti+QfdJzRQCVLFb97kOIV7Eo9vQU/roINgk7m24uv0a7AUvN//RDH36FLjjK48v0s9g==", "dev": true }, - "node_modules/@types/web-bluetooth": { - "version": "0.0.20", - "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz", - "integrity": "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==", + "node_modules/@sigyn/agent": { + "resolved": "src/agent", + "link": true + }, + "node_modules/@sigyn/config": { + "resolved": "src/config", + "link": true + }, + "node_modules/@sigyn/discord": { + "resolved": "src/discord", + "link": true + }, + "node_modules/@sigyn/logql": { + "resolved": "src/logql", + "link": true + }, + "node_modules/@sigyn/morphix": { + "resolved": "src/morphix", + "link": true + }, + "node_modules/@sigyn/notifiers": { + "resolved": "src/notifiers", + "link": true + }, + "node_modules/@sigyn/pattern": { + "resolved": "src/pattern", + "link": true + }, + "node_modules/@sigyn/slack": { + "resolved": "src/slack", + "link": true + }, + "node_modules/@sigyn/teams": { + "resolved": "src/teams", + "link": true + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", "dev": true }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.18.0.tgz", - "integrity": "sha512-3lqEvQUdCozi6d1mddWqd+kf8KxmGq2Plzx36BlkjuQe3rSTm/O98cLf0A4uDO+a5N1KD2SeEEl6fW97YHY+6w==", + "node_modules/@slack/types": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/@slack/types/-/types-2.14.0.tgz", + "integrity": "sha512-n0EGm7ENQRxlXbgKSrQZL69grzg1gHLAVd+GlRVQJ1NSORo0FrApR7wql/gaKdu2n4TO83Sq/AmeUOqD60aXUA==", + "engines": { + "node": ">= 12.13.0", + "npm": ">= 6.12.0" + } + }, + "node_modules/@stylistic/eslint-plugin": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-2.12.1.tgz", + "integrity": "sha512-fubZKIHSPuo07FgRTn6S4Nl0uXPRPYVNpyZzIDGfp7Fny6JjNus6kReLD7NI380JXi4HtUTSOZ34LBuNPO1XLQ==", "dev": true, + "license": "MIT", "dependencies": { - "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.18.0", - "@typescript-eslint/type-utils": "6.18.0", - "@typescript-eslint/utils": "6.18.0", - "@typescript-eslint/visitor-keys": "6.18.0", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.2.4", - "natural-compare": "^1.4.0", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" + "@typescript-eslint/utils": "^8.13.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", + "estraverse": "^5.3.0", + "picomatch": "^4.0.2" }, "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "peerDependencies": { - "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "eslint": ">=8.40.0" } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/@stylistic/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.19.0.tgz", + "integrity": "sha512-hkoJiKQS3GQ13TSMEiuNmSCvhz7ujyqD1x3ShbaETATHrck+9RaDdUbt+osXaUuns9OFwrDTTrjtwsU8gJyyRA==", "dev": true, + "license": "MIT", "dependencies": { - "yallist": "^4.0.0" + "@typescript-eslint/types": "8.19.0", + "@typescript-eslint/visitor-keys": "8.19.0" }, "engines": { - "node": ">=10" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "node_modules/@stylistic/eslint-plugin/node_modules/@typescript-eslint/types": { + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.19.0.tgz", + "integrity": "sha512-8XQ4Ss7G9WX8oaYvD4OOLCjIQYgRQxO+qCiR2V2s2GxI9AUpo7riNwo6jDhKtTcaJjT8PY54j2Yb33kWtSJsmA==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, + "license": "MIT", "engines": { - "node": ">=10" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/@typescript-eslint/parser": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.18.0.tgz", - "integrity": "sha512-v6uR68SFvqhNQT41frCMCQpsP+5vySy6IdgjlzUWoo7ALCnpaWYcz/Ij2k4L8cEsL0wkvOviCMpjmtRtHNOKzA==", + "node_modules/@stylistic/eslint-plugin/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.19.0.tgz", + "integrity": "sha512-WW9PpDaLIFW9LCbucMSdYUuGeFUz1OkWYS/5fwZwTA+l2RwlWFdJvReQqMUMBw4yJWJOfqd7An9uwut2Oj8sLw==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "6.18.0", - "@typescript-eslint/types": "6.18.0", - "@typescript-eslint/typescript-estree": "6.18.0", - "@typescript-eslint/visitor-keys": "6.18.0", - "debug": "^4.3.4" + "@typescript-eslint/types": "8.19.0", + "@typescript-eslint/visitor-keys": "8.19.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "typescript": ">=4.8.4 <5.8.0" } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.18.0.tgz", - "integrity": "sha512-o/UoDT2NgOJ2VfHpfr+KBY2ErWvCySNUIX/X7O9g8Zzt/tXdpfEU43qbNk8LVuWUT2E0ptzTWXh79i74PP0twA==", + "node_modules/@stylistic/eslint-plugin/node_modules/@typescript-eslint/utils": { + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.19.0.tgz", + "integrity": "sha512-PTBG+0oEMPH9jCZlfg07LCB2nYI0I317yyvXGfxnvGvw4SHIOuRnQ3kadyyXY6tGdChusIHIbM5zfIbp4M6tCg==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "6.18.0", - "@typescript-eslint/visitor-keys": "6.18.0" + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.19.0", + "@typescript-eslint/types": "8.19.0", + "@typescript-eslint/typescript-estree": "8.19.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" } }, - "node_modules/@typescript-eslint/type-utils": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.18.0.tgz", - "integrity": "sha512-ZeMtrXnGmTcHciJN1+u2CigWEEXgy1ufoxtWcHORt5kGvpjjIlK9MUhzHm4RM8iVy6dqSaZA/6PVkX6+r+ChjQ==", + "node_modules/@stylistic/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.19.0.tgz", + "integrity": "sha512-mCFtBbFBJDCNCWUl5y6sZSCHXw1DEFEk3c/M3nRK2a4XUB8StGFtmcEMizdjKuBzB6e/smJAAWYug3VrdLMr1w==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "6.18.0", - "@typescript-eslint/utils": "6.18.0", - "debug": "^4.3.4", - "ts-api-utils": "^1.0.1" + "@typescript-eslint/types": "8.19.0", + "eslint-visitor-keys": "^4.2.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@stylistic/eslint-plugin/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" + "engines": { + "node": ">=16 || 14 >=14.17" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@typescript-eslint/types": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.18.0.tgz", - "integrity": "sha512-/RFVIccwkwSdW/1zeMx3hADShWbgBxBnV/qSrex6607isYjj05t36P6LyONgqdUrNLl5TYU8NIKdHUYpFvExkA==", + "node_modules/@stylistic/eslint-plugin/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", "dev": true, + "license": "MIT", "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": ">=12" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@stylistic/eslint-plugin/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@tsd/typescript": { + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/@tsd/typescript/-/typescript-5.4.4.tgz", + "integrity": "sha512-sqE6Rz9UNHBuCtuREo/PwsuUaegP1KDSfxMd+9K1qPpt7XO8BmkIImUp7zAqyvwXWUHs+sj6osEkkpyE0tFgfA==", + "dev": true, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/@types/better-sqlite3": { + "version": "7.6.12", + "resolved": "https://registry.npmjs.org/@types/better-sqlite3/-/better-sqlite3-7.6.12.tgz", + "integrity": "sha512-fnQmj8lELIj7BSrZQAdBMHEHX8OZLYIHXqAKT1O7tDfLxaINzf00PMjw22r3N/xXh0w/sGHlO6SVaCQ2mj78lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" } }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.18.0.tgz", - "integrity": "sha512-klNvl+Ql4NsBNGB4W9TZ2Od03lm7aGvTbs0wYaFYsplVPhr+oeXjlPZCDI4U9jgJIDK38W1FKhacCFzCC+nbIg==", + "node_modules/@types/docker-modem": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/docker-modem/-/docker-modem-3.0.6.tgz", + "integrity": "sha512-yKpAGEuKRSS8wwx0joknWxsmLha78wNMe9R2S3UNsVOkZded8UqOrV8KoeDXoXsjndxwyF3eIhyClGbO1SEhEg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.18.0", - "@typescript-eslint/visitor-keys": "6.18.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "@types/node": "*", + "@types/ssh2": "*" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/@types/dockerode": { + "version": "3.3.29", + "resolved": "https://registry.npmjs.org/@types/dockerode/-/dockerode-3.3.29.tgz", + "integrity": "sha512-5PRRq/yt5OT/Jf77ltIdz4EiR9+VLnPF+HpU4xGFwUqmV24Co2HKBNW3w+slqZ1CYchbcDeqJASHDYWzZCcMiQ==", "dev": true, "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" + "@types/docker-modem": "*", + "@types/node": "*", + "@types/ssh2": "*" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "node_modules/@types/eslint": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.29.0.tgz", + "integrity": "sha512-VNcvioYDH8/FxaeTKkM4/TiTwt6pBV9E3OfGmvaw8tPl0rrHCJ4Ll15HRT+pMiFAf/MLQvAzC+6RzUMEL9Ceng==", "dev": true, "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "@types/estree": "*", + "@types/json-schema": "*" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", "dev": true, "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" + "@types/unist": "*" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true + }, + "node_modules/@types/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", "dev": true }, - "node_modules/@typescript-eslint/utils": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.18.0.tgz", - "integrity": "sha512-wiKKCbUeDPGaYEYQh1S580dGxJ/V9HI7K5sbGAVklyf+o5g3O+adnS4UNJajplF4e7z2q0uVBaTdT/yLb4XAVA==", + "node_modules/@types/markdown-it": { + "version": "14.1.2", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz", + "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==", "dev": true, "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.18.0", - "@typescript-eslint/types": "6.18.0", - "@typescript-eslint/typescript-estree": "6.18.0", - "semver": "^7.5.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" + "@types/linkify-it": "^5", + "@types/mdurl": "^2" } }, - "node_modules/@typescript-eslint/utils/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", "dev": true, "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" + "@types/unist": "*" } }, - "node_modules/@typescript-eslint/utils/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "node_modules/@types/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", + "dev": true + }, + "node_modules/@types/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", + "dev": true + }, + "node_modules/@types/node": { + "version": "22.10.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.5.tgz", + "integrity": "sha512-F8Q+SeGimwOo86fiovQh8qiXfFEh2/ocYv7tU5pJ3EXMSSxk1Joj5wefpFK2fHTf/N6HKGSxIDBT9f3gCxXPkQ==", "dev": true, + "license": "MIT", "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" + "undici-types": "~6.20.0" } }, - "node_modules/@typescript-eslint/utils/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "node_modules/@types/node/node_modules/undici-types": { + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", + "dev": true + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", "dev": true }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.18.0.tgz", - "integrity": "sha512-1wetAlSZpewRDb2h9p/Q8kRjdGuqdTAQbkJIOUMLug2LBLG+QOjiWoSj6/3B/hA9/tVTFFdtiKvAYoYnSRW/RA==", + "node_modules/@types/ssh2": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@types/ssh2/-/ssh2-1.15.0.tgz", + "integrity": "sha512-YcT8jP5F8NzWeevWvcyrrLB3zcneVjzYY9ZDSMAMboI+2zR1qYWFhwsyOFVzT7Jorn67vqxC0FRiw8YyG9P1ww==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.18.0", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "@types/node": "^18.11.18" } }, - "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "node_modules/@types/ssh2-streams": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/@types/ssh2-streams/-/ssh2-streams-0.1.12.tgz", + "integrity": "sha512-Sy8tpEmCce4Tq0oSOYdfqaBpA3hDM8SoxoFh5vzFsu2oL+znzGz8oVWW7xb4K920yYMUY+PIG31qZnFMfPWNCg==", "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/ssh2/node_modules/@types/node": { + "version": "18.19.39", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.39.tgz", + "integrity": "sha512-nPwTRDKUctxw3di5b4TfT3I0sWDiWoPQCZjXhvdkINntwr8lcoVCKsTgnXeRubKIlfnV+eN/HYk6Jb40tbcEAQ==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" } }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "dev": true + }, + "node_modules/@types/web-bluetooth": { + "version": "0.0.20", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz", + "integrity": "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==", + "dev": true + }, "node_modules/@ungap/structured-clone": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", @@ -2744,10 +3017,11 @@ "dev": true }, "node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", "dev": true, + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -3008,7 +3282,8 @@ "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 + "dev": true, + "license": "Python-2.0" }, "node_modules/array-union": { "version": "2.1.0", @@ -3246,38 +3521,6 @@ "node": ">=8" } }, - "node_modules/browserslist": { - "version": "4.22.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", - "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001565", - "electron-to-chromium": "^1.4.601", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, "node_modules/buffer": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", @@ -3392,6 +3635,7 @@ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -3422,26 +3666,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/caniuse-lite": { - "version": "1.0.30001576", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001576.tgz", - "integrity": "sha512-ff5BdakGe2P3SQsMsiqmt1Lc8221NR1VzHj5jXN5vBny9A6fpze94HiVV/n7XRosOlsShJcvMv5mdnpjOGCEgg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, "node_modules/ccount": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", @@ -3798,10 +4022,11 @@ } }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -4028,18 +4253,6 @@ "tar-stream": "^2.0.0" } }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/dotenv": { "version": "16.4.7", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", @@ -4057,12 +4270,6 @@ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "dev": true }, - "node_modules/electron-to-chromium": { - "version": "1.4.623", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.623.tgz", - "integrity": "sha512-lKoz10iCYlP1WtRYdh5MvocQPWVRoI7ysp6qf18bmeBgR8abE6+I2CsfyNKztRDZvhdWc+krKT6wS7Neg8sw3A==", - "dev": true - }, "node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", @@ -4161,58 +4368,63 @@ } }, "node_modules/eslint": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", - "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", + "version": "9.17.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.17.0.tgz", + "integrity": "sha512-evtlNcpJg+cZLcnVKwsai8fExnqjGPicK7gnUtlNuzu+Fv9bI0aLpND5T44VLQtoMEnI57LoXO9XAkIXwohKrA==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.56.0", - "@humanwhocodes/config-array": "^0.11.13", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.19.0", + "@eslint/core": "^0.9.0", + "@eslint/eslintrc": "^3.2.0", + "@eslint/js": "9.17.0", + "@eslint/plugin-kit": "^0.2.3", + "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", + "@humanwhocodes/retry": "^0.4.1", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", + "cross-spawn": "^7.0.6", "debug": "^4.3.2", - "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", + "eslint-scope": "^8.2.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", + "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", + "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" + "optionator": "^0.9.3" }, "bin": { "eslint": "bin/eslint.js" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } } }, "node_modules/eslint-formatter-pretty": { @@ -4334,25 +4546,33 @@ "dev": true }, "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz", + "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" + "estraverse": "^5.2.0" }, "engines": { - "node": ">=8.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">=10" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint/node_modules/ajv": { @@ -4442,58 +4662,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/eslint/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/eslint/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -4543,29 +4711,18 @@ } }, "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", + "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "acorn": "^8.9.0", + "acorn": "^8.14.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "eslint-visitor-keys": "^4.2.0" }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -4583,20 +4740,12 @@ "node": ">=0.10" } }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" }, @@ -4604,20 +4753,12 @@ "node": ">=4.0" } }, - "node_modules/esrecurse/node_modules/estraverse": { + "node_modules/estraverse": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -4857,15 +4998,16 @@ } }, "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dev": true, + "license": "MIT", "dependencies": { - "flat-cache": "^3.0.4" + "flat-cache": "^4.0.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=16.0.0" } }, "node_modules/file-uri-to-path": { @@ -4917,24 +5059,25 @@ } }, "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, + "license": "MIT", "dependencies": { "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" + "keyv": "^4.5.4" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=16" } }, "node_modules/flatted": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", - "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", - "dev": true + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", + "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", + "dev": true, + "license": "ISC" }, "node_modules/focus-trap": { "version": "7.6.2", @@ -4975,12 +5118,6 @@ "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -5004,15 +5141,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -5087,12 +5215,16 @@ } }, "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", "dev": true, + "license": "MIT", "engines": { - "node": ">=4" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/globby": { @@ -5271,10 +5403,11 @@ ] }, "node_modules/ignore": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", - "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4" } @@ -5284,6 +5417,7 @@ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, + "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -5313,16 +5447,6 @@ "node": ">=8" } }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", @@ -5427,15 +5551,6 @@ "node": ">=0.12.0" } }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/is-plain-obj": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", @@ -5682,6 +5797,7 @@ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, + "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -5689,23 +5805,12 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", @@ -5733,23 +5838,12 @@ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, + "license": "MIT", "dependencies": { "json-buffer": "3.0.1" } @@ -5975,15 +6069,6 @@ "node": ">=8" } }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "dependencies": { - "yallist": "^3.0.2" - } - }, "node_modules/luxon": { "version": "3.4.4", "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.4.4.tgz", @@ -6440,12 +6525,6 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, - "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", - "dev": true - }, "node_modules/normalize-package-data": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", @@ -6606,6 +6685,7 @@ "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" }, @@ -6640,15 +6720,6 @@ "node": ">=8" } }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -6743,16 +6814,6 @@ "pino": "bin.js" } }, - "node_modules/pino-abstract-transport": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-1.2.0.tgz", - "integrity": "sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q==", - "dev": true, - "dependencies": { - "readable-stream": "^4.0.0", - "split2": "^4.0.0" - } - }, "node_modules/pino-loki": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/pino-loki/-/pino-loki-2.4.0.tgz", @@ -7423,6 +7484,7 @@ "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" } @@ -7470,63 +7532,6 @@ "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", "dev": true }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/rimraf/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/rollup": { "version": "4.28.1", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.28.1.tgz", @@ -7643,15 +7648,6 @@ "integrity": "sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==", "dev": true }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/set-cookie-parser": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.0.tgz", @@ -8399,12 +8395,6 @@ "b4a": "^1.6.4" } }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, "node_modules/thenify": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", @@ -8564,12 +8554,13 @@ } }, "node_modules/ts-api-utils": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", - "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz", + "integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==", "dev": true, + "license": "MIT", "engines": { - "node": ">=16.13.0" + "node": ">=16" }, "peerDependencies": { "typescript": ">=4.2.0" @@ -9540,18 +9531,6 @@ "node": ">= 0.8.0" } }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/typescript": { "version": "5.7.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", @@ -9650,36 +9629,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -10040,12 +9989,6 @@ "node": ">=10" } }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, "node_modules/yaml": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.0.tgz", @@ -10146,24 +10089,24 @@ "version": "4.1.0", "license": "MIT", "dependencies": { - "@myunisoft/httpie": "^5.0.0", - "@myunisoft/loki": "^5.0.0", - "@openally/result": "^1.2.1", - "better-sqlite3": "^11.1.2", + "@myunisoft/httpie": "^5.0.1", + "@myunisoft/loki": "^5.1.0", + "@openally/result": "^1.3.0", + "better-sqlite3": "^11.7.0", "cron-parser": "^4.9.0", "croner": "^9.0.0", - "dayjs": "^1.11.11", - "dotenv": "^16.4.5", + "dayjs": "^1.11.13", + "dotenv": "^16.4.7", "ms": "^2.1.3", - "pino": "^9.2.0", + "pino": "^9.6.0", "toad-scheduler": "^3.0.1" }, "devDependencies": { - "@types/better-sqlite3": "^7.6.11", + "@types/better-sqlite3": "^7.6.12", "is-ci": "^4.1.0", "mockdate": "^3.0.5", "pino-pretty": "^13.0.0", - "testcontainers": "^10.10.3" + "testcontainers": "^10.16.0" }, "engines": { "node": ">=18" @@ -10205,14 +10148,14 @@ "version": "4.0.0", "license": "MIT", "dependencies": { - "@myunisoft/loki": "^5.0.0", + "@myunisoft/loki": "^5.1.0", "ajv": "^8.17.1", "ajv-keywords": "^5.1.0", "minimatch": "^10.0.1" }, "devDependencies": { - "@myunisoft/httpie": "^5.0.0", - "dotenv": "^16.4.5" + "@myunisoft/httpie": "^5.0.1", + "dotenv": "^16.4.7" }, "engines": { "node": ">=18" @@ -10257,7 +10200,7 @@ "version": "2.0.0", "license": "MIT", "dependencies": { - "@myunisoft/httpie": "^5.0.0" + "@myunisoft/httpie": "^5.0.1" }, "engines": { "node": ">=18" @@ -10307,7 +10250,7 @@ "version": "1.1.0", "license": "MIT", "devDependencies": { - "esmock": "^2.6.6" + "esmock": "^2.6.9" }, "engines": { "node": ">=18" @@ -10329,7 +10272,7 @@ "version": "1.1.0", "license": "MIT", "devDependencies": { - "tsd": "^0.31.1" + "tsd": "^0.31.2" }, "engines": { "node": ">=18" @@ -10340,8 +10283,8 @@ "version": "2.0.0", "license": "MIT", "dependencies": { - "@myunisoft/httpie": "^5.0.0", - "@slack/types": "^2.12.0" + "@myunisoft/httpie": "^5.0.1", + "@slack/types": "^2.14.0" }, "engines": { "node": ">=18" @@ -10383,7 +10326,7 @@ "version": "2.0.0", "license": "MIT", "dependencies": { - "@myunisoft/httpie": "^5.0.0" + "@myunisoft/httpie": "^5.0.1" }, "engines": { "node": ">=18" diff --git a/package.json b/package.json index 48f91c1b..23414b51 100644 --- a/package.json +++ b/package.json @@ -5,6 +5,7 @@ "scripts": { "build": "npm run build --ws --if-present", "test": "npm run test --ws --if-present", + "lint": "npm run lint --ws --if-present", "docs:dev": "vitepress dev docs", "docs:build": "vitepress build docs", "docs:preview": "vitepress preview docs" @@ -24,17 +25,18 @@ "src/pattern" ], "devDependencies": { - "@nodesecure/eslint-config": "^1.9.0", - "@types/node": "^22.0.0", - "c8": "^10.1.2", + "@openally/config.eslint": "^1.1.0", + "@openally/config.typescript": "^1.0.3", + "@types/node": "^22.10.5", + "c8": "^10.1.3", "cross-env": "^7.0.3", - "fastify": "^5.0.0", + "fastify": "^5.2.0", "glob": "^11.0.0", - "pino-loki": "^2.3.0", - "tsup": "^8.1.0", - "tsx": "^4.16.2", - "typescript": "^5.5.3", - "vitepress": "^1.3.1" + "pino-loki": "^2.4.0", + "tsup": "^8.3.5", + "tsx": "^4.19.2", + "typescript": "^5.7.2", + "vitepress": "^1.5.0" }, "type": "module" } diff --git a/src/agent/README.md b/src/agent/README.md index 206f857e..e3dfb76e 100644 --- a/src/agent/README.md +++ b/src/agent/README.md @@ -26,7 +26,7 @@ ## 🚧 Requirements -- [Node.js](https://nodejs.org/en/) version 18 or higher +- [Node.js](https://nodejs.org/en/) version 20 or higher ## 🚀 Getting Started diff --git a/src/agent/docs/installation.md b/src/agent/docs/installation.md index 0c6922bf..60809c17 100644 --- a/src/agent/docs/installation.md +++ b/src/agent/docs/installation.md @@ -2,7 +2,7 @@ ## Requirements -- [Node.js](https://nodejs.org/en/) version 18 or higher. +- [Node.js](https://nodejs.org/en/) version 20 or higher. ## Install locally diff --git a/src/agent/package.json b/src/agent/package.json index c079fd8e..d580adc2 100644 --- a/src/agent/package.json +++ b/src/agent/package.json @@ -2,18 +2,18 @@ "name": "@sigyn/agent", "version": "4.1.0", "description": "Loki alerting agent", - "main": "./dist/index.js", - "module": "./dist/index.mjs", + "main": "./dist/index.cjs", + "module": "./dist/index.js", "types": "./dist/index.d.ts", "exports": { ".": { - "require": "./dist/index.js", - "import": "./dist/index.mjs", - "types": "./dist/index.d.ts" + "types": "./dist/index.d.ts", + "require": "./dist/index.cjs", + "import": "./dist/index.js" } }, "engines": { - "node": ">=18" + "node": ">=20" }, "scripts": { "build": "tsup src/index.ts --format cjs,esm --dts --clean", @@ -22,7 +22,7 @@ "test": "glob -c \"tsx -r dotenv/config --test-concurrency 1 --test\" \"./test/**/*.spec.ts\"", "test:e2e": "glob -c \"tsx -r dotenv/config --test-concurrency 1 --test\" \"./test/e2e/*.e2e-spec.ts\"", "coverage": "c8 -r html npm test", - "lint": "cross-env eslint src/**/*.ts" + "lint": "eslint src test" }, "repository": { "type": "git", @@ -41,23 +41,24 @@ "author": "GENTILHOMME Thomas ", "license": "MIT", "dependencies": { - "@myunisoft/httpie": "^5.0.0", - "@myunisoft/loki": "^5.0.0", - "@openally/result": "^1.2.1", - "better-sqlite3": "^11.1.2", + "@myunisoft/httpie": "^5.0.1", + "@myunisoft/loki": "^5.1.0", + "@openally/result": "^1.3.0", + "better-sqlite3": "^11.7.0", "cron-parser": "^4.9.0", "croner": "^9.0.0", - "dayjs": "^1.11.11", - "dotenv": "^16.4.5", + "dayjs": "^1.11.13", + "dotenv": "^16.4.7", "ms": "^2.1.3", - "pino": "^9.2.0", + "pino": "^9.6.0", "toad-scheduler": "^3.0.1" }, "devDependencies": { - "@types/better-sqlite3": "^7.6.11", + "@types/better-sqlite3": "^7.6.12", "is-ci": "^4.1.0", "mockdate": "^3.0.5", "pino-pretty": "^13.0.0", - "testcontainers": "^10.10.3" - } + "testcontainers": "^10.16.0" + }, + "type": "module" } diff --git a/src/agent/src/alert.ts b/src/agent/src/alert.ts index 2a15079d..6d187286 100644 --- a/src/agent/src/alert.ts +++ b/src/agent/src/alert.ts @@ -1,12 +1,12 @@ // Import Third-party Dependencies -import { SigynRule, SigynSelfMonitoring, getConfig } from "@sigyn/config"; +import { type SigynRule, type SigynSelfMonitoring, getConfig } from "@sigyn/config"; // Import Internal Dependencies -import { DbAgentFailure, getDB } from "./database"; -import { Logger } from "."; -import { handleCompositeRules } from "./compositeRules"; -import { RuleNotifier, RuleNotifierAlert } from "./notifiers/rules.notifier"; -import { AgentFailureNotifier } from "./notifiers/agentFailure.notifier"; +import { type DbAgentFailure, getDB } from "./database.js"; +import { type Logger } from "./index.js"; +import { handleCompositeRules } from "./compositeRules.js"; +import { RuleNotifier, type RuleNotifierAlert } from "./notifiers/rules.notifier.js"; +import { AgentFailureNotifier } from "./notifiers/agentFailure.notifier.js"; export function createRuleAlert( rule: RuleNotifierAlert["rule"], diff --git a/src/agent/src/compositeRules.ts b/src/agent/src/compositeRules.ts index f307ba64..b55b03f3 100644 --- a/src/agent/src/compositeRules.ts +++ b/src/agent/src/compositeRules.ts @@ -1,11 +1,11 @@ // Import Third-party Dependencies -import { getConfig, SigynInitializedCompositeRule } from "@sigyn/config"; +import { getConfig, type SigynInitializedCompositeRule } from "@sigyn/config"; // Import Internal Dependencies -import { getDB } from "./database"; -import { Logger } from "."; -import * as utils from "./utils"; -import { CompositeRuleNotifier } from "./notifiers/compositeRules.notifier"; +import { getDB } from "./database.js"; +import { type Logger } from "./index.js"; +import * as utils from "./utils/index.js"; +import { CompositeRuleNotifier } from "./notifiers/compositeRules.notifier.js"; function compositeRuleHasThrottle( compositeRule: SigynInitializedCompositeRule, @@ -23,15 +23,15 @@ function compositeRuleHasThrottle( const intervalDate = utils.cron.durationOrCronToDate(interval, "subtract").valueOf(); const { count: compositeRuleAlertsCount } = getDB() .prepare("SELECT COUNT(id) as count FROM compositeRuleAlerts WHERE name = ? AND createdAt >= ?") - .get(compositeRule.name, intervalDate) as { count: number }; + .get(compositeRule.name, intervalDate) as { count: number; }; if (compositeRuleAlertsCount > 0) { const { createdAt } = getDB() .prepare("SELECT createdAt FROM compositeRuleAlerts WHERE name = ? AND createdAt >= ? ORDER BY createdAt DESC") - .get(compositeRule.name, intervalDate) as { createdAt: number }; + .get(compositeRule.name, intervalDate) as { createdAt: number; }; if (intervalDate < createdAt && alertsCount / compositeRule.notifCount < count) { - // eslint-disable-next-line max-len + // eslint-disable-next-line @stylistic/max-len logger.info(`[${compositeRule.name}](throttle:on|intervalDate:${intervalDate}|olderAlertTimestamp|${createdAt}|alertsCount:${alertsCount}|notifCount:${compositeRule.notifCount}|throttleCount:${count})`); return true; @@ -44,14 +44,15 @@ function compositeRuleHasThrottle( return false; } else if (compositeRuleAlertsCount <= activationThreshold) { - // eslint-disable-next-line max-len + // eslint-disable-next-line @stylistic/max-len logger.info(`[${compositeRule.name}](throttle:off|compositeRuleAlertsCount:${compositeRuleAlertsCount}|activationThreshold:${activationThreshold})`); return false; } const hasThrottle = compositeRuleAlertsCount === 1 ? false : compositeRuleAlertsCount - activationThreshold <= count; - // eslint-disable-next-line max-len + + // eslint-disable-next-line @stylistic/max-len logger.info(`[${compositeRule.name}](throttle:${hasThrottle ? "on" : "off"}|compositeRuleAlertsCount:${compositeRuleAlertsCount}|activationThreshold:${activationThreshold}|thresholdCount:${count})`); return hasThrottle; @@ -66,19 +67,19 @@ export function handleCompositeRules(logger: Logger) { for (const compositeRule of compositeRules) { const rulesObj = getDB().prepare( `SELECT id, name FROM rules WHERE name IN (${compositeRule.rules.map(() => "?").join(",")})` - ).all(compositeRule.rules) as { id: number, name: string }[]; + ).all(compositeRule.rules) as { id: number; name: string; }[]; const ruleIds = rulesObj.map(({ id }) => id); const subtractedInterval = utils.cron.durationOrCronToDate(compositeRule.interval, "subtract").valueOf(); const { count } = getDB() - // eslint-disable-next-line max-len + // eslint-disable-next-line @stylistic/max-len .prepare(`SELECT COUNT(id) as count FROM alerts WHERE processed = 0 AND createdAt >= ? AND ruleId IN (${ruleIds.map(() => "?").join(",")})`) .get( subtractedInterval, ...ruleIds - ) as { count: number }; + ) as { count: number; }; const processedRules = getDB() .prepare(`SELECT ruleId FROM alerts WHERE createdAt >= ? AND ruleId IN (${ruleIds.map(() => "?").join(",")})`) - .all(subtractedInterval, ...ruleIds) as { ruleId: number }[]; + .all(subtractedInterval, ...ruleIds) as { ruleId: number; }[]; const processedRulesIds = processedRules.map(({ ruleId }) => ruleId); const processedRulesNames = rulesObj.filter(({ id }) => processedRulesIds.includes(id)).map(({ name }) => name); @@ -90,12 +91,12 @@ export function handleCompositeRules(logger: Logger) { const ruleIdsPlaceholder = ruleIds.map(() => "?").join(","); if (compositeRule.ruleCountThreshold) { const { distinctCount } = getDB() - // eslint-disable-next-line max-len + // eslint-disable-next-line @stylistic/max-len .prepare(`SELECT COUNT(DISTINCT ruleId) as distinctCount FROM alerts WHERE compositeProcessed = 0 AND createdAt >= ? AND ruleId IN (${ruleIdsPlaceholder})`) .get( utils.cron.durationOrCronToDate(compositeRule.interval, "subtract").valueOf(), ...ruleIds - ) as { distinctCount: number }; + ) as { distinctCount: number; }; if (distinctCount < compositeRule.ruleCountThreshold) { logger.info( diff --git a/src/agent/src/database.ts b/src/agent/src/database.ts index 29ae1dc8..a6a2a9e2 100644 --- a/src/agent/src/database.ts +++ b/src/agent/src/database.ts @@ -1,15 +1,17 @@ // Import Node.js Dependencies import path from "node:path"; import fs from "node:fs"; +import url from "node:url"; // Import Third-party Dependencies import SQLite3 from "better-sqlite3"; -import { SigynRule } from "@sigyn/config"; +import { type SigynRule } from "@sigyn/config"; // Import Internal Dependencies -import { Logger } from "."; +import { type Logger } from "./index.js"; // CONSTANTS +const __dirname = path.dirname(url.fileURLToPath(import.meta.url)); const kDefaultDatabaseFilename = process.env.SIGYN_DB ?? "sigyn.sqlite3"; const kDatabaseInitPath = path.join(__dirname, "../data/init-db.sql"); diff --git a/src/agent/src/datasource.ts b/src/agent/src/datasource.ts index 755582d9..74935346 100644 --- a/src/agent/src/datasource.ts +++ b/src/agent/src/datasource.ts @@ -1,5 +1,5 @@ // Import Third-party Dependencies -import { GrafanaApi, Datasource as GrafanaDatasource } from "@myunisoft/loki"; +import { GrafanaApi, type Datasource as GrafanaDatasource } from "@myunisoft/loki"; export class Datasource { #grafanaApi: GrafanaApi; diff --git a/src/agent/src/index.ts b/src/agent/src/index.ts index 0dfb69fe..72e3627f 100644 --- a/src/agent/src/index.ts +++ b/src/agent/src/index.ts @@ -11,10 +11,10 @@ import { pino } from "pino"; import ms from "ms"; // Import Internal Dependencies -import { initDB, cleanRulesInDb } from "./database"; -import { asyncTask } from "./tasks/asyncTask"; -import { Rule } from "./rules"; -import * as utils from "./utils/index"; +import { initDB, cleanRulesInDb } from "./database.js"; +import { asyncTask } from "./tasks/asyncTask.js"; +import { Rule } from "./rules.js"; +import * as utils from "./utils/index.js"; // CONSTANTS const kScheduler = new ToadScheduler(); diff --git a/src/agent/src/notifiers/agentFailure.notifier.ts b/src/agent/src/notifiers/agentFailure.notifier.ts index d764fb3b..729f6ea4 100644 --- a/src/agent/src/notifiers/agentFailure.notifier.ts +++ b/src/agent/src/notifiers/agentFailure.notifier.ts @@ -2,10 +2,10 @@ import { isDeepStrictEqual } from "node:util"; // Import Internal Dependencies -import { Logger } from ".."; -import { DbAgentFailure } from "../database"; -import { getAgentFailureRules } from "../utils/selfMonitoring"; -import { Alert, Notifier } from "./notifier"; +import { type Logger } from "../index.js"; +import { type DbAgentFailure } from "../database.js"; +import { getAgentFailureRules } from "../utils/selfMonitoring.js"; +import { type Alert, Notifier } from "./notifier.js"; // CONSTANTS const kIdentifier = Symbol("agentFailureNotifier"); @@ -32,11 +32,11 @@ export class AgentFailureNotifier extends Notifier { return this.shared; } - nonUniqueMatcher(notification: AgentFailureAlert, newNotifications: AgentFailureAlert) { + override nonUniqueMatcher(notification: AgentFailureAlert, newNotifications: AgentFailureAlert) { return isDeepStrictEqual(notification.failures, newNotifications.failures); } - async sendNotification(alert: AgentFailureAlert) { + override async sendNotification(alert: AgentFailureAlert) { try { const { notifierConfig } = alert; const notifierOptions = { @@ -49,7 +49,7 @@ export class AgentFailureNotifier extends Notifier { this.logger.info(`[SELF-MONITORING](notify: success|notifier: ${notifierConfig.notifier})`); } - catch (error) { + catch (error: any) { this.logger.error(`[SELF-MONITORING](notify: error|notifier: ${alert.notifierConfig.notifier}|message: ${error.message})`); this.logger.debug(error); } diff --git a/src/agent/src/notifiers/compositeRules.notifier.ts b/src/agent/src/notifiers/compositeRules.notifier.ts index 9d4edf96..27f7e29a 100644 --- a/src/agent/src/notifiers/compositeRules.notifier.ts +++ b/src/agent/src/notifiers/compositeRules.notifier.ts @@ -1,7 +1,7 @@ // Import Internal Dependencies -import { Logger } from ".."; -import { Rule } from "../rules"; -import { Alert, Notifier } from "./notifier"; +import { type Logger } from "../index.js"; +import { Rule } from "../rules.js"; +import { type Alert, Notifier } from "./notifier.js"; // CONSTANTS const kIdentifier = Symbol("compositeRuleNotifier"); @@ -29,11 +29,11 @@ export class CompositeRuleNotifier extends Notifier { return this.shared; } - nonUniqueMatcher(notification: CompositeRuleAlert, newNotifications: CompositeRuleAlert) { + override nonUniqueMatcher(notification: CompositeRuleAlert, newNotifications: CompositeRuleAlert) { return notification.compositeRuleName === newNotifications.compositeRuleName; } - async sendNotification(alert: CompositeRuleAlert) { + override async sendNotification(alert: CompositeRuleAlert) { const { notifierConfig, compositeRuleName } = alert; const notifierOptions = { ...notifierConfig, @@ -46,7 +46,7 @@ export class CompositeRuleNotifier extends Notifier { this.logger.info(`[${compositeRuleName}](notify: success|notifier: ${notifierConfig.notifier})`); } - catch (error) { + catch (error: any) { this.logger.error(`[${compositeRuleName}](notify: error|notifier: ${notifierConfig.notifier}|message: ${error.message})`); this.logger.debug(error); } diff --git a/src/agent/src/notifiers/notifier.ts b/src/agent/src/notifiers/notifier.ts index 72d3216d..6471e787 100644 --- a/src/agent/src/notifiers/notifier.ts +++ b/src/agent/src/notifiers/notifier.ts @@ -1,11 +1,11 @@ -// Import Internal Dependencies -import { Logger } from ".."; -import { getDB } from "../database"; -import { NotifierQueue } from "./notifierQueue"; - // Import Third-party Dependencies import SQLite3 from "better-sqlite3"; -import { SigynInitializedConfig, getConfig } from "@sigyn/config"; +import { type SigynInitializedConfig, getConfig } from "@sigyn/config"; + +// Import Internal Dependencies +import { type Logger } from "../index.js"; +import { getDB } from "../database.js"; +import { NotifierQueue } from "./notifierQueue.js"; export interface Alert { notifierConfig: { @@ -59,17 +59,14 @@ export class Notifier { ); } - // eslint-disable-next-line @typescript-eslint/no-unused-vars protected sendNotification(alert: T): void { throw new Error("sendNotification must be implemented"); } - // eslint-disable-next-line @typescript-eslint/no-unused-vars protected nonUniqueMatcher(notification: T, newNotifications: T): boolean { throw new Error("nonUniqueMatcher must be implemented"); } - protected async execute(options: Alert["notifierConfig"]) { try { const notifierLib = options.notifier; diff --git a/src/agent/src/notifiers/notifierQueue.ts b/src/agent/src/notifiers/notifierQueue.ts index e45112e5..721bb118 100644 --- a/src/agent/src/notifiers/notifierQueue.ts +++ b/src/agent/src/notifiers/notifierQueue.ts @@ -10,8 +10,8 @@ type NotifierQueueAlert = T & { _nonUniqueMatcher: (notification: T, newNotifications: T) => boolean; notifierConfig: { notifier: string; - } -} + }; +}; export class NotifierQueue extends EventEmitter { /** diff --git a/src/agent/src/notifiers/rules.notifier.ts b/src/agent/src/notifiers/rules.notifier.ts index 95d95ed3..7e08e1a3 100644 --- a/src/agent/src/notifiers/rules.notifier.ts +++ b/src/agent/src/notifiers/rules.notifier.ts @@ -6,10 +6,10 @@ import { getConfig } from "@sigyn/config"; import { StreamSelector } from "@sigyn/logql"; // Import Internal Dependencies -import { Logger } from ".."; -import { DbRule, DbAlertNotif, DbAlert, DbNotifier } from "../database"; -import { Alert, Notifier } from "./notifier"; -import * as utils from "../utils"; +import { type Logger } from "../index.js"; +import type { DbRule, DbAlertNotif, DbAlert, DbNotifier } from "../database.js"; +import { type Alert, Notifier } from "./notifier.js"; +import * as utils from "../utils/index.js"; // CONSTANTS const kIdentifier = Symbol("ruleNotifier"); @@ -45,7 +45,7 @@ export class RuleNotifier extends Notifier { return this.shared; } - sendAlerts(alerts: Omit[]) { + override sendAlerts(alerts: Omit[]) { const notificationAlerts: RuleNotifierAlert[] = []; for (const alert of alerts) { @@ -67,12 +67,12 @@ export class RuleNotifier extends Notifier { this.push(notificationAlerts); } - nonUniqueMatcher(notification: RuleNotifierAlert, newNotifications: RuleNotifierAlert) { + override nonUniqueMatcher(notification: RuleNotifierAlert, newNotifications: RuleNotifierAlert) { return notification.rule.name === newNotifications.rule.name && isDeepStrictEqual(notification.rule.labels, newNotifications.rule.labels); } - async sendNotification(alert: RuleNotifierAlert) { + override async sendNotification(alert: RuleNotifierAlert) { const { notifierConfig, rule } = alert; const ruleConfig = this.config.rules.find((configRule) => configRule.name === rule.name)!; @@ -91,7 +91,7 @@ export class RuleNotifier extends Notifier { .prepare("UPDATE alertNotifs SET status = ? WHERE alertId = ?") .run("success", alert.notif.alertId); } - catch (error) { + catch (error: any) { this.db .prepare("UPDATE alertNotifs SET status = ? WHERE alertId = ?") .run("failed", alert.notif.alertId); diff --git a/src/agent/src/rules.ts b/src/agent/src/rules.ts index c37c1e1a..baab2b9b 100644 --- a/src/agent/src/rules.ts +++ b/src/agent/src/rules.ts @@ -1,18 +1,18 @@ -/* eslint-disable max-len */ + // Import Third-party Dependencies -import { SigynInitializedRule } from "@sigyn/config"; -import { LokiCombined } from "@myunisoft/loki"; +import { type SigynInitializedRule } from "@sigyn/config"; +import { type LokiCombined } from "@myunisoft/loki"; import dayjs from "dayjs"; import ms from "ms"; import cronParser from "cron-parser"; -import { Database } from "better-sqlite3"; +import { type Database } from "better-sqlite3"; import { Result, Ok, Err } from "@openally/result"; // Import Internal Dependencies -import { DbRule, DbRuleLabel, getDB, getOldestLabelTimestamp } from "./database"; -import * as utils from "./utils/index"; -import { Logger } from "."; -import { RuleNotifierAlert } from "./notifiers/rules.notifier"; +import { type DbRule, type DbRuleLabel, getDB, getOldestLabelTimestamp } from "./database.js"; +import * as utils from "./utils/index.js"; +import { type Logger } from "./index.js"; +import { type RuleNotifierAlert } from "./notifiers/rules.notifier.js"; export interface RuleOptions { logger: Logger; @@ -50,7 +50,11 @@ export class Rule { if (wantedValue) { const rangeValueMatch = utils.rules.OPERATOR_VALUE_REGEXP.exec(wantedValue); - if (rangeValueMatch && !utils.rules.countMatchOperator(rangeValueMatch[1] as utils.rules.RuleOperators, Number(value), Number(rangeValueMatch[2]))) { + if (rangeValueMatch && !utils.rules.countMatchOperator( + rangeValueMatch[1] as utils.rules.RuleOperators, + Number(value), + Number(rangeValueMatch[2]) + )) { continue; } else if (value !== wantedValue) { @@ -122,7 +126,9 @@ export class Rule { .valueOf(); if (rule.lastIntervalReset === null || rule.lastIntervalReset - timeThreshold < 0) { - db.prepare("UPDATE rules SET lastIntervalReset = ?, firstReset = ? WHERE id = ?").run(this.#now, rule.lastIntervalReset === null ? 1 : 0, rule.id); + db + .prepare("UPDATE rules SET lastIntervalReset = ?, firstReset = ? WHERE id = ?") + .run(this.#now, rule.lastIntervalReset === null ? 1 : 0, rule.id); rule.firstReset = rule.lastIntervalReset === null ? 1 : 0; rule.lastIntervalReset = this.#now; } @@ -130,12 +136,13 @@ export class Rule { const previousCounter = rule.counter; rule.counter = ( db.prepare("SELECT COUNT(id) as counter FROM ruleLogs WHERE ruleId = ? AND processed = 0 AND timestamp >= ?") - .get(rule.id, timeThreshold) as { counter: null | number } + .get(rule.id, timeThreshold) as { counter: null | number; } ).counter ?? 0; db.prepare("UPDATE rules SET counter = ? WHERE id = ?").run(rule.counter, rule.id); const alertThreshold = this.config.alert.on.count!; + // eslint-disable-next-line @stylistic/max-len this.#logger.info(`[${rule.name}](state: handle|polling: ${this.#getCurrentPolling()[1]}|previous: ${previousCounter}|new: ${rule.counter - previousCounter}|next: ${rule.counter}|alertThreshold: ${alertThreshold}|timeThreshold: ${timeThreshold})`); const [operator, value] = utils.rules.countThresholdOperator(alertThreshold); @@ -156,7 +163,9 @@ export class Rule { this.#logger.error(`[${rule.name}](state: alert|threshold: ${alertThreshold}|actual: ${rule.counter})`); db.transaction(() => { - db.prepare("UPDATE rules SET counter = 0, threshold = ?, lastIntervalReset = ? WHERE id = ?").run(rule.counter, this.#now, rule.id); + db + .prepare("UPDATE rules SET counter = 0, threshold = ?, lastIntervalReset = ? WHERE id = ?") + .run(rule.counter, this.#now, rule.id); db.prepare("UPDATE ruleLogs SET processed = 1 WHERE ruleId = ?").run(rule.id); })(); @@ -207,9 +216,19 @@ export class Rule { } #checkLabelThreshold(rule: DbRule): boolean { - const { label, value, valueMatch, percentThreshold, count, minimumLabelCount, interval } = this.config.alert.on; + const { + label, + value, + valueMatch, + percentThreshold, + count, + minimumLabelCount, + interval + } = this.config.alert.on; - const labels = getDB().prepare("SELECT * FROM ruleLabels WHERE key = ? AND ruleId = ? ORDER BY timestamp ASC").all(label, rule.id) as DbRuleLabel[]; + const labels = getDB() + .prepare("SELECT * FROM ruleLabels WHERE key = ? AND ruleId = ? ORDER BY timestamp ASC") + .all(label, rule.id) as DbRuleLabel[]; const [olderLabel] = labels; if (olderLabel === undefined) { this.#logger.info(`[${rule.name}](state: skip|label: ${label})`); @@ -221,6 +240,7 @@ export class Rule { const countReached = minimumLabelCount ? minimumLabelCount <= labels.length : true; if (!intervalReached || !countReached) { + // eslint-disable-next-line @stylistic/max-len this.#logger.info(`[${rule.name}](state: unreached|labelCount: ${labels.length}|minimumLabelCount: ${minimumLabelCount || "*"}|oldestTimestamp: ${olderLabel.timestamp}|minimumTimestamp: ${intervalTimestamp ?? "*"})`); return false; @@ -231,7 +251,11 @@ export class Rule { const rangeValueMatch = utils.rules.OPERATOR_VALUE_REGEXP.exec(value); if (rangeValueMatch) { - return utils.rules.countMatchOperator(rangeValueMatch[1] as utils.rules.RuleOperators, Number(label.value), Number(rangeValueMatch[2])); + return utils.rules.countMatchOperator( + rangeValueMatch[1] as utils.rules.RuleOperators, + Number(label.value), + Number(rangeValueMatch[2]) + ); } return label.value === value; @@ -240,6 +264,7 @@ export class Rule { return label.value.match(valueMatch!); }).length; + // eslint-disable-next-line @stylistic/max-len this.#logger.info(`[${rule.name}](state: reached|actual: ${labels.length}|count: ${count ?? "x"}|thresholdCount: ${labelMatchCount}|percentThreshold: ${percentThreshold}|actualPercent: ${labelMatchCount / labels.length * 100})`); this.#labelCount = labels.length; @@ -265,7 +290,7 @@ export class Rule { const alerts = getDB().prepare( `SELECT alertId, key, value FROM alertLabels WHERE key IN (${labelScope.map(() => "?").join(",")})` - ).all(labelScope) as { alertId: number; key: string; value: string }[]; + ).all(labelScope) as { alertId: number; key: string; value: string; }[]; const alertIds = alerts.flatMap((alert) => { if (this.#lastFetchedStream![alert.key].split(",").includes(alert.value)) { @@ -279,16 +304,19 @@ export class Rule { return 0; } - return (getDB().prepare(`SELECT COUNT(id) as count FROM alerts WHERE id IN (${alertIds.map(() => "?").join(",")}) AND createdAt >= ?`).get( - alertIds, - interval - ) as { count: number }).count; + return (getDB() + .prepare(`SELECT COUNT(id) as count FROM alerts WHERE id IN (${alertIds.map(() => "?").join(",")}) AND createdAt >= ?`) + .get( + alertIds, + interval + ) as { count: number; } + ).count; } return (getDB().prepare("SELECT COUNT(id) as count FROM alerts WHERE ruleId = ? AND createdAt >= ?").get( rule.id, interval - ) as { count: number }).count; + ) as { count: number; }).count; } #checkThrottle(rule: DbRule, db: Database): boolean { @@ -309,6 +337,7 @@ export class Rule { return true; } else if (ruleAlertsCount <= activationThreshold!) { + // eslint-disable-next-line @stylistic/max-len this.#logger.error(`[${rule.name}](activationThreshold: ${activationThreshold}|actual: ${ruleAlertsCount}|labelScope: ${labelScope})`); return false; diff --git a/src/agent/src/tasks/asyncTask.ts b/src/agent/src/tasks/asyncTask.ts index a0cb3c8f..bccbdba2 100644 --- a/src/agent/src/tasks/asyncTask.ts +++ b/src/agent/src/tasks/asyncTask.ts @@ -2,16 +2,16 @@ import { performance } from "node:perf_hooks"; // Import Third-party Dependencies -import { SigynInitializedRule } from "@sigyn/config"; +import { type SigynInitializedRule } from "@sigyn/config"; import { GrafanaApi } from "@myunisoft/loki"; import { AsyncTask } from "toad-scheduler"; import ms from "ms"; // Import Internal Dependencies -import { Rule } from "../rules"; -import { Logger } from ".."; -import { createRuleAlert } from "../alert"; -import { handleAgentFailure } from "../utils/selfMonitoring"; +import { Rule } from "../rules.js"; +import { type Logger } from "../index.js"; +import { createRuleAlert } from "../alert.js"; +import { handleAgentFailure } from "../utils/selfMonitoring.js"; export interface AsyncTaskOptions { logger: Logger; @@ -47,7 +47,7 @@ export function asyncTask(ruleConfig: SigynInitializedRule, options: AsyncTaskOp logger.debug(`[${ruleConfig.name}](debug: ${createAlertResult.val})`); } } - catch (error) { + catch (error: any) { logger.error(`[${ruleConfig.name}](error: ${error.message}|execTime: ${ms(performance.now() - t0)})`); logger.debug(error); diff --git a/src/agent/src/utils/getLokiUrl.ts b/src/agent/src/utils/getLokiUrl.ts index 8526f47e..641851c6 100644 --- a/src/agent/src/utils/getLokiUrl.ts +++ b/src/agent/src/utils/getLokiUrl.ts @@ -1,11 +1,11 @@ // Import Third-party Dependencies import dayjs from "dayjs"; -import { SigynInitializedRule, getConfig } from "@sigyn/config"; +import { type SigynInitializedRule, getConfig } from "@sigyn/config"; // Import Internal Dependencies -import { Datasource } from "../datasource"; -import { durationOrCronToDate } from "./cron"; -import { RuleNotifierAlert } from "../notifiers/rules.notifier"; +import { Datasource } from "../datasource.js"; +import { durationOrCronToDate } from "./cron.js"; +import { type RuleNotifierAlert } from "../notifiers/rules.notifier.js"; export async function getLokiUrl( rule: RuleNotifierAlert["rule"], diff --git a/src/agent/src/utils/index.ts b/src/agent/src/utils/index.ts index 22f7dbaf..2065ba6e 100644 --- a/src/agent/src/utils/index.ts +++ b/src/agent/src/utils/index.ts @@ -1,3 +1,3 @@ -export * as rules from "./rules"; -export * as cron from "./cron"; -export * from "./getLokiUrl"; +export * as rules from "./rules.js"; +export * as cron from "./cron.js"; +export * from "./getLokiUrl.js"; diff --git a/src/agent/src/utils/rules.ts b/src/agent/src/utils/rules.ts index fa375915..f8b8fc4d 100644 --- a/src/agent/src/utils/rules.ts +++ b/src/agent/src/utils/rules.ts @@ -1,8 +1,8 @@ // Import Third-party Dependencies -import { SigynRule } from "@sigyn/config"; +import { type SigynRule } from "@sigyn/config"; // Import Internal Dependencies -import { isCron } from "./cron"; +import { isCron } from "./cron.js"; // CONSTANTS const kOnlyDigitsRegExp = /^\d+$/; diff --git a/src/agent/src/utils/selfMonitoring.ts b/src/agent/src/utils/selfMonitoring.ts index b738d682..ee679595 100644 --- a/src/agent/src/utils/selfMonitoring.ts +++ b/src/agent/src/utils/selfMonitoring.ts @@ -1,20 +1,20 @@ // Import Third-party Dependencies -import { SigynInitializedSelfMonitoring, getConfig } from "@sigyn/config"; +import { type SigynInitializedSelfMonitoring, getConfig } from "@sigyn/config"; import { Result, Ok, Err } from "@openally/result"; // Import Internal Dependencies -import { DbAgentFailure, getDB } from "../database"; -import * as cronUtils from "./cron"; -import { Rule } from "../rules"; -import { Logger } from ".."; -import { createAgentFailureAlert } from "../alert"; -import { AgentFailureAlert } from "../notifiers/agentFailure.notifier"; +import { type DbAgentFailure, getDB } from "../database.js"; +import * as cronUtils from "./cron.js"; +import { Rule } from "../rules.js"; +import { type Logger } from "../index.js"; +import { createAgentFailureAlert } from "../alert.js"; +import { type AgentFailureAlert } from "../notifiers/agentFailure.notifier.js"; export function getAgentFailureRules(alert: AgentFailureAlert): string { const ruleIds = new Set(alert.failures.map(({ ruleId }) => ruleId)); const failures = getDB() .prepare(`SELECT name FROM rules WHERE id IN (${[...ruleIds].map(() => "?").join(",")})`) - .all([...ruleIds]) as { name: string }[]; + .all([...ruleIds]) as { name: string; }[]; return failures.map(({ name }) => name).join(", "); } @@ -29,10 +29,10 @@ function hasAgentFailureThrottle(throttle: SigynInitializedSelfMonitoring["throt const intervalDate = cronUtils.durationOrCronToDate(interval, "subtract").valueOf(); const agentFailuresAlert = (getDB() .prepare("SELECT count FROM agentFailures WHERE timestamp >= ? ORDER BY count DESC") - .get(intervalDate) as { count: number }); + .get(intervalDate) as { count: number; }); const unprocessedAgentFailuresAlertFromThrottle = (getDB() .prepare("SELECT count FROM agentFailures WHERE timestamp <= ? AND processed = 0 ORDER BY count DESC") - .get(intervalDate) as { count: number }); + .get(intervalDate) as { count: number; }); const lastAgentFailureAlert = (getDB() .prepare("SELECT * FROM agentFailures ORDER BY count DESC LIMIT 1") .get() as DbAgentFailure); @@ -44,7 +44,7 @@ function hasAgentFailureThrottle(throttle: SigynInitializedSelfMonitoring["throt const intervalExceeded = lastAgentFailureAlert.processed && lastAgentFailureAlert.timestamp > intervalDate; function logMessage(throttle: boolean, details: string) { - // eslint-disable-next-line max-len + // eslint-disable-next-line @stylistic/max-len return `(throttle: ${throttle ? "on" : "off"}|details: ${details}|processed: ${lastAgentFailureAlert.processed}|lastAlertTime: ${lastAgentFailureAlert.timestamp}|activationThreshold: ${activationThreshold}|agentFailuresCount: ${agentFailuresAlertCount}|count: ${count})`; } @@ -133,7 +133,7 @@ export function handleAgentFailure(errorMessage: string, rule: Rule, logger: Log db.prepare("DELETE FROM agentFailures WHERE timestamp < ?").run(intervalDate); } } - catch (error) { + catch (error: any) { logger.error(`[SELF MONITORING](error: ${error.message})`); logger.debug(error); } diff --git a/src/agent/test/FT/compositeRules.spec.ts b/src/agent/test/FT/compositeRules.spec.ts index fb04f4af..656f3999 100644 --- a/src/agent/test/FT/compositeRules.spec.ts +++ b/src/agent/test/FT/compositeRules.spec.ts @@ -2,6 +2,7 @@ import assert from "node:assert"; import fs from "node:fs"; import path from "node:path"; +import url from "node:url"; import { before, beforeEach, after, describe, it } from "node:test"; import { setTimeout } from "node:timers/promises"; @@ -11,12 +12,13 @@ import { SigynInitializedConfig, initConfig } from "@sigyn/config"; import isCI from "is-ci"; // Import Internal Dependencies -import { getDB, initDB } from "../../src/database"; -import { createRuleAlert, MockLogger, resetRuteMuteUntil, ruleMuteUntilTimestamp } from "./helpers"; -import { handleCompositeRules } from "../../src/compositeRules"; -import { Rule } from "../../src/rules"; +import { getDB, initDB } from "../../src/database.js"; +import { createRuleAlert, MockLogger, resetRuteMuteUntil, ruleMuteUntilTimestamp } from "./helpers.js"; +import { handleCompositeRules } from "../../src/compositeRules.js"; +import { Rule } from "../../src/rules.js"; // CONSTANTS +const __dirname = path.dirname(url.fileURLToPath(import.meta.url)); const kCompositeRulesConfigLocation = path.join(__dirname, "/fixtures/composite-rules/sigyn.config.json"); const kLogger = new MockLogger(); const kMockAgent = new MockAgent(); diff --git a/src/agent/test/FT/compositeRulesLocalNotifier.spec.ts b/src/agent/test/FT/compositeRulesLocalNotifier.spec.ts index dd8eaa41..25d02ced 100644 --- a/src/agent/test/FT/compositeRulesLocalNotifier.spec.ts +++ b/src/agent/test/FT/compositeRulesLocalNotifier.spec.ts @@ -2,6 +2,7 @@ import assert from "node:assert"; import fs from "node:fs"; import path from "node:path"; +import url from "node:url"; import { before, beforeEach, describe, it } from "node:test"; import { setTimeout } from "node:timers/promises"; @@ -10,13 +11,14 @@ import { SigynInitializedConfig, initConfig } from "@sigyn/config"; import isCI from "is-ci"; // Import Internal Dependencies -import { getDB, initDB } from "../../src/database"; -import { createRuleAlert, MockLogger } from "./helpers"; -import { handleCompositeRules } from "../../src/compositeRules"; -import { Rule } from "../../src/rules"; +import { getDB, initDB } from "../../src/database.js"; +import { createRuleAlert, MockLogger } from "./helpers.js"; +import { handleCompositeRules } from "../../src/compositeRules.js"; +import { Rule } from "../../src/rules.js"; import { TestingNotifier } from "./mocks/sigyn-test-notifier.js"; // CONSTANTS +const __dirname = path.dirname(url.fileURLToPath(import.meta.url)); const kCompositeRulesConfigLocation = path.join(__dirname, "/fixtures/composite-rules-local/sigyn.config.json"); const kLogger = new MockLogger(); // time to wait for the task to be fully executed (alert sent) diff --git a/src/agent/test/FT/compositeRulesSeverityFilter.spec.ts b/src/agent/test/FT/compositeRulesSeverityFilter.spec.ts index f8a9e8af..2aec3f90 100644 --- a/src/agent/test/FT/compositeRulesSeverityFilter.spec.ts +++ b/src/agent/test/FT/compositeRulesSeverityFilter.spec.ts @@ -2,6 +2,7 @@ import assert from "node:assert"; import fs from "node:fs"; import path from "node:path"; +import url from "node:url"; import { before, beforeEach, after, describe, it } from "node:test"; import { setTimeout } from "node:timers/promises"; @@ -11,12 +12,13 @@ import { SigynInitializedConfig, initConfig } from "@sigyn/config"; import isCI from "is-ci"; // Import Internal Dependencies -import { getDB, initDB } from "../../src/database"; -import { createRuleAlert, MockLogger, resetRuteMuteUntil, ruleMuteUntilTimestamp } from "./helpers"; -import { handleCompositeRules } from "../../src/compositeRules"; -import { Rule } from "../../src/rules"; +import { getDB, initDB } from "../../src/database.js"; +import { createRuleAlert, MockLogger, resetRuteMuteUntil, ruleMuteUntilTimestamp } from "./helpers.js"; +import { handleCompositeRules } from "../../src/compositeRules.js"; +import { Rule } from "../../src/rules.js"; // CONSTANTS +const __dirname = path.dirname(url.fileURLToPath(import.meta.url)); const kSeverityFilterCompositeRulesConfigLocation = path.join( __dirname, "/fixtures/composite-rules-sev-filters/sigyn.config.json" diff --git a/src/agent/test/FT/compositeRulesUntriggered.spec.ts b/src/agent/test/FT/compositeRulesUntriggered.spec.ts index 257dc788..14d7e276 100644 --- a/src/agent/test/FT/compositeRulesUntriggered.spec.ts +++ b/src/agent/test/FT/compositeRulesUntriggered.spec.ts @@ -2,6 +2,7 @@ import assert from "node:assert"; import fs from "node:fs"; import path from "node:path"; +import url from "node:url"; import { before, beforeEach, after, describe, it } from "node:test"; import { setTimeout } from "node:timers/promises"; @@ -11,12 +12,13 @@ import { SigynInitializedConfig, initConfig } from "@sigyn/config"; import isCI from "is-ci"; // Import Internal Dependencies -import { getDB, initDB } from "../../src/database"; -import { createRuleAlert, MockLogger, resetRuteMuteUntil, ruleMuteUntilTimestamp } from "./helpers"; -import { handleCompositeRules } from "../../src/compositeRules"; -import { Rule } from "../../src/rules"; +import { getDB, initDB } from "../../src/database.js"; +import { createRuleAlert, MockLogger, resetRuteMuteUntil, ruleMuteUntilTimestamp } from "./helpers.js"; +import { handleCompositeRules } from "../../src/compositeRules.js"; +import { Rule } from "../../src/rules.js"; // CONSTANTS +const __dirname = path.dirname(url.fileURLToPath(import.meta.url)); const kUntriggeredCompositeRulesConfigLocation = path.join( __dirname, "/fixtures/composite-rules-no-mute-untriggered/sigyn.config.json" diff --git a/src/agent/test/FT/database.spec.ts b/src/agent/test/FT/database.spec.ts index c0d2d702..3e94be68 100644 --- a/src/agent/test/FT/database.spec.ts +++ b/src/agent/test/FT/database.spec.ts @@ -7,8 +7,8 @@ import fs from "node:fs"; import SQLite3 from "better-sqlite3"; // Import Internal Dependencies -import { initDB } from "../../src/database"; -import * as testHelpers from "./helpers"; +import { initDB } from "../../src/database.js"; +import * as testHelpers from "./helpers.js"; // CONSTANTS const kDummyLogger = { info: () => null } as any; diff --git a/src/agent/test/FT/helpers.ts b/src/agent/test/FT/helpers.ts index 27d8c5be..932b6e0c 100644 --- a/src/agent/test/FT/helpers.ts +++ b/src/agent/test/FT/helpers.ts @@ -5,8 +5,8 @@ import fs from "node:fs"; import dayjs from "dayjs"; // Import Internal Dependencies -import { DbAlert, DbAlertNotif, DbNotifier, DbRule, getDB } from "../../src/database"; -import { Rule } from "../../src/rules"; +import { DbAlert, DbAlertNotif, DbNotifier, DbRule, getDB } from "../../src/database.js"; +import { Rule } from "../../src/rules.js"; // CONSTANTS const kDatabaseFilename = "test/.temp/test-db.sqlite3"; @@ -80,7 +80,7 @@ export function createRuleAlert(rule: Rule, times: number) { export function ruleMuteUntilTimestamp(rule: Rule): number { const { muteUntil } = getDB() .prepare("SELECT muteUntil FROM rules WHERE name = ?") - .get(rule.config.name) as { muteUntil: number }; + .get(rule.config.name) as { muteUntil: number; }; return muteUntil; } diff --git a/src/agent/test/FT/rule.walkOnLogs.spec.ts b/src/agent/test/FT/rule.walkOnLogs.spec.ts index ef55a02e..6c24c363 100644 --- a/src/agent/test/FT/rule.walkOnLogs.spec.ts +++ b/src/agent/test/FT/rule.walkOnLogs.spec.ts @@ -2,6 +2,7 @@ import assert from "node:assert"; import path from "node:path"; import fs from "node:fs"; +import url from "node:url"; import timers from "node:timers/promises"; import { after, before, describe, it } from "node:test"; @@ -12,11 +13,12 @@ import { MockAgent, getGlobalDispatcher, setGlobalDispatcher } from "@myunisoft/ import { Result } from "@openally/result"; // Import Internal Dependencies -import { DbRule, DbRuleLabel, getDB, initDB } from "../../src/database"; -import { MockLogger } from "./helpers"; -import { Rule } from "../../src/rules"; +import { DbRule, DbRuleLabel, getDB, initDB } from "../../src/database.js"; +import { MockLogger } from "./helpers.js"; +import { Rule } from "../../src/rules.js"; // CONSTANTS +const __dirname = path.dirname(url.fileURLToPath(import.meta.url)); const kMultiPollingConfigLocation = path.join(__dirname, "/fixtures/multi-polling/sigyn.config.json"); const kLabelConfigLocation = path.join(__dirname, "/fixtures/label/sigyn.config.json"); const kLabelRangeValueConfigLocation = path.join(__dirname, "/fixtures/label-range-value/sigyn.config.json"); @@ -292,7 +294,7 @@ describe("Rule.walkOnLogs()", () => { } }); - // eslint-disable-next-line max-len + // eslint-disable-next-line @stylistic/max-len it("should then activate threshold and not send another alert whithin interval and with less logs than count threshold", async() => { for (let i = 0; i < 5; i++) { const rule = new Rule(ruleConfig, { logger: kLogger }); @@ -436,7 +438,6 @@ describe("Rule.walkOnLogs()", () => { assert.equal(labels.length, 3); assert.deepEqual(labels.map((label) => { - // eslint-disable-next-line @typescript-eslint/no-unused-vars const { timestamp, ...labelWithouTimestamp } = label; return labelWithouTimestamp; diff --git a/src/agent/test/FT/rules.spec.ts b/src/agent/test/FT/rules.spec.ts index 76e037ef..2ce6cf8a 100644 --- a/src/agent/test/FT/rules.spec.ts +++ b/src/agent/test/FT/rules.spec.ts @@ -1,6 +1,7 @@ // Import Node.js Dependencies import assert from "node:assert"; import path from "node:path"; +import url from "node:url"; import { before, describe, it } from "node:test"; // Import Third-party Dependencies @@ -9,11 +10,12 @@ import MockDate from "mockdate"; import { SigynInitializedConfig, initConfig } from "@sigyn/config"; // Import Internal Dependencies -import { getDB, initDB } from "../../src/database"; -import { MockLogger } from "./helpers"; -import { Rule } from "../../src/rules"; +import { getDB, initDB } from "../../src/database.js"; +import { MockLogger } from "./helpers.js"; +import { Rule } from "../../src/rules.js"; // CONSTANTS +const __dirname = path.dirname(url.fileURLToPath(import.meta.url)); const kMultiPollingConfigLocation = path.join(__dirname, "/fixtures/multi-polling/sigyn.config.json"); const kLabelValueMatchConfigLocation = path.join(__dirname, "/fixtures/label-value-match/sigyn.config.json"); const kLogger = new MockLogger(); diff --git a/src/agent/test/FT/selfMonitoring.spec.ts b/src/agent/test/FT/selfMonitoring.spec.ts index 66b440a6..dff3545d 100644 --- a/src/agent/test/FT/selfMonitoring.spec.ts +++ b/src/agent/test/FT/selfMonitoring.spec.ts @@ -1,6 +1,7 @@ // Import Node.js Dependencies import assert from "node:assert"; import path from "node:path"; +import url from "node:url"; import { afterEach, before, beforeEach, describe, it } from "node:test"; import { setTimeout } from "node:timers/promises"; @@ -10,13 +11,14 @@ import { AsyncTask } from "toad-scheduler"; import isCI from "is-ci"; // Import Internal Dependencies -import { asyncTask } from "../../src/tasks/asyncTask"; -import { MockLogger, resetAgentFailures } from "./helpers"; -import { Rule } from "../../src/rules"; -import { getDB, initDB } from "../../src/database"; -import { TestingNotifier } from "./mocks/sigyn-test-notifier"; +import { asyncTask } from "../../src/tasks/asyncTask.js"; +import { MockLogger, resetAgentFailures } from "./helpers.js"; +import { Rule } from "../../src/rules.js"; +import { getDB, initDB } from "../../src/database.js"; +import { TestingNotifier } from "./mocks/sigyn-test-notifier.js"; // CONSTANTS +const __dirname = path.dirname(url.fileURLToPath(import.meta.url)); const kFixturePath = path.join(__dirname, "/fixtures"); const kRuleConfigLocation = path.join(kFixturePath, "/self-monitoring/sigyn.config.json"); const kRuleNotMatchFiltersConfigLocation = path.join(kFixturePath, "/not-match-rule-filters/sigyn.config.json"); @@ -114,7 +116,6 @@ describe("Self-monitoring", { concurrency: 1 }, () => { task.execute(); } - await setTimeout(kTimeout); assert.equal(kTestingNotifier.notifCount, 3); @@ -215,7 +216,6 @@ describe("Self-monitoring", { concurrency: 1 }, () => { // first alert, no throttle (remaining: 2) assert.equal(kTestingNotifier.notifCount, 1); - task.execute(); await setTimeout(kTimeout); // because of activationThreshold, no throttle (remaining: 1) diff --git a/src/agent/test/e2e/logs-count.e2e-spec.ts b/src/agent/test/e2e/logs-count.e2e-spec.ts index ae9bf3b9..6f6155f7 100644 --- a/src/agent/test/e2e/logs-count.e2e-spec.ts +++ b/src/agent/test/e2e/logs-count.e2e-spec.ts @@ -2,14 +2,16 @@ import { before, describe, it } from "node:test"; import assert from "node:assert"; import path from "node:path"; +import url from "node:url"; import { setTimeout } from "node:timers/promises"; // Import Internal Dependencies -import { TestingNotifier } from "../FT/mocks/sigyn-test-notifier"; -import { setupEnvironment } from "./setup"; -import { start } from "../../src"; +import { TestingNotifier } from "../FT/mocks/sigyn-test-notifier.js"; +import { setupEnvironment } from "./setup.js"; +import { start } from "../../src/index.js"; // CONSTANTS +const __dirname = path.dirname(url.fileURLToPath(import.meta.url)); const kConfigLocation = path.join(__dirname, "./configs/count-logs"); const kTestingNotifier = TestingNotifier.getInstance(); diff --git a/src/agent/test/e2e/setup.ts b/src/agent/test/e2e/setup.ts index b882c4a4..f7ba6c34 100644 --- a/src/agent/test/e2e/setup.ts +++ b/src/agent/test/e2e/setup.ts @@ -1,5 +1,6 @@ // Import Node.js Dependencies import path from "node:path"; +import url from "node:url"; // Import Third-party Dependencies import { DockerComposeEnvironment } from "testcontainers"; @@ -8,13 +9,14 @@ import Fastify from "fastify"; import { GrafanaApi } from "@myunisoft/loki"; // CONSTANTS +const __dirname = path.dirname(url.fileURLToPath(import.meta.url)); const kMockAgent = new MockAgent(); const kDefaultGrafanaHost = "http://localhost:3000"; export const LOG_MESSAGE = "Hello World"; export interface SetupEnvironmentOptions { - grafanaHost?: string + grafanaHost?: string; } export async function setupEnvironment(options: SetupEnvironmentOptions = {}) { diff --git a/src/agent/test/utils.spec.ts b/src/agent/test/utils.spec.ts index 457e42e6..1634b018 100644 --- a/src/agent/test/utils.spec.ts +++ b/src/agent/test/utils.spec.ts @@ -2,6 +2,7 @@ import assert from "node:assert"; import { after, before, describe, it } from "node:test"; import path from "node:path"; +import url from "node:url"; // Import Third-party Dependencies import { initConfig } from "@sigyn/config"; @@ -9,9 +10,10 @@ import { MockAgent, getGlobalDispatcher, setGlobalDispatcher } from "@myunisoft/ import dayjs from "dayjs"; // Import Internal Dependencies -import * as utils from "../src/utils/index"; +import * as utils from "../src/utils/index.js"; // CONSTANTS +const __dirname = path.dirname(url.fileURLToPath(import.meta.url)); const kDummyUrl = "http://localhost:3000"; const kMockAgent = new MockAgent(); const kGlobalDispatcher = getGlobalDispatcher(); diff --git a/src/agent/tsconfig.json b/src/agent/tsconfig.json index 4dc29794..5505e6d5 100644 --- a/src/agent/tsconfig.json +++ b/src/agent/tsconfig.json @@ -1,24 +1,10 @@ { + "extends": "../../tsconfig.base.json", "compilerOptions": { - "declaration": true, - "strictNullChecks": true, - "target": "ES2022", - "outDir": "dist", - "module": "NodeNext", - "moduleResolution": "NodeNext", - "esModuleInterop": true, - "resolveJsonModule": false, - "skipDefaultLibCheck": true, - "skipLibCheck": true, - "forceConsistentCasingInFileNames": true, - "sourceMap": true, "rootDir": "./src", - "typeRoots": [ - "../../node_modules/@types", - "../config/dist" - ], - "types": ["node"] + "outDir": "./dist", }, - "include": ["src"], - "exclude": ["node_modules", "dist"] + "include": [ + "src" + ], } diff --git a/src/config/package.json b/src/config/package.json index fc6c1f4f..49fc5387 100644 --- a/src/config/package.json +++ b/src/config/package.json @@ -2,25 +2,25 @@ "name": "@sigyn/config", "version": "4.0.0", "description": "Sigyn configuration manager", - "main": "./dist/index.js", - "module": "./dist/index.mjs", + "main": "./dist/index.cjs", + "module": "./dist/index.js", "types": "./dist/index.d.ts", "exports": { ".": { - "require": "./dist/index.js", - "import": "./dist/index.mjs", - "types": "./dist/index.d.ts" + "types": "./dist/index.d.ts", + "require": "./dist/index.cjs", + "import": "./dist/index.js" } }, "engines": { - "node": ">=18" + "node": ">=20" }, "scripts": { "build": "tsup src/index.ts --format cjs,esm --dts --clean", "prepublishOnly": "npm run build", "test": "glob -c \"tsx -r dotenv/config --test\" \"./test/**/*.spec.ts\"", "coverage": "c8 -r html npm test", - "lint": "cross-env eslint src/**/*.ts" + "lint": "eslint src test" }, "repository": { "type": "git", @@ -38,13 +38,14 @@ "author": "GENTILHOMME Thomas ", "license": "MIT", "dependencies": { - "@myunisoft/loki": "^5.0.0", + "@myunisoft/loki": "^5.1.0", "ajv": "^8.17.1", "ajv-keywords": "^5.1.0", "minimatch": "^10.0.1" }, "devDependencies": { - "@myunisoft/httpie": "^5.0.0", - "dotenv": "^16.4.5" - } + "@myunisoft/httpie": "^5.0.1", + "dotenv": "^16.4.7" + }, + "type": "module" } diff --git a/src/config/src/index.ts b/src/config/src/index.ts index 8cee8483..bdd72c5d 100644 --- a/src/config/src/index.ts +++ b/src/config/src/index.ts @@ -3,11 +3,11 @@ import fs from "node:fs"; import path from "node:path"; // Import Internal Dependencies -import { SigynInitializedConfig } from "./types"; -import { validateConfig, validateExtendedConfig } from "./validate"; -import * as utils from "./utils"; +import { type SigynInitializedConfig } from "./types.js"; +import { validateConfig, validateExtendedConfig } from "./validate.js"; +import * as utils from "./utils/index.js"; -export * from "./types"; +export * from "./types.js"; export { validateConfig, validateExtendedConfig }; let initializedConfig: SigynInitializedConfig; diff --git a/src/config/src/types.ts b/src/config/src/types.ts index 0e7df199..9cad65b4 100644 --- a/src/config/src/types.ts +++ b/src/config/src/types.ts @@ -58,7 +58,7 @@ export interface GrafanaConfig { export interface SigynRule { name: string; - logql: string | { query: string; vars?: Record }; + logql: string | { query: string; vars?: Record; }; polling: string | string[]; pollingStrategy: "bounded" | "unbounded"; alert: SigynAlert; @@ -80,7 +80,7 @@ export interface SigynInitializedRule { export interface PartialSigynRule { name: string; - logql: string | { query: string; vars?: Record }; + logql: string | { query: string; vars?: Record; }; polling?: string | string[]; pollingStrategy?: "bounded" | "unbounded"; alert: PartialSigynAlert; @@ -90,7 +90,7 @@ export interface PartialSigynRule { } export type NotifierFormattedSigynRule = Omit & { - alert: Omit + alert: Omit; }; export type AlertSeverity = @@ -108,7 +108,7 @@ export interface SigynAlert { valueMatch?: string; percentThreshold?: number; minimumLabelCount?: number; - }, + }; template: string | SigynAlertTemplate; severity: Extract; throttle?: { @@ -128,7 +128,7 @@ export interface SigynInitializedAlert { valueMatch?: string; percentThreshold?: number; minimumLabelCount?: number; - }, + }; template: SigynInitializedTemplate; severity: Extract; throttle?: { @@ -148,7 +148,7 @@ export interface PartialSigynAlert { valueMatch?: string; percentThreshold?: number; minimumLabelCount?: number; - }, + }; template: string | SigynAlertTemplate; severity?: AlertSeverity; throttle?: { @@ -216,7 +216,7 @@ export interface SigynCompositeRule { include?: string[]; exclude?: string[]; severity?: Extract[]; - } + }; notifCount: number; ruleCountThreshold?: number; interval?: string; diff --git a/src/config/src/utils/compositeRules.ts b/src/config/src/utils/compositeRules.ts index a49c27ed..aae238d0 100644 --- a/src/config/src/utils/compositeRules.ts +++ b/src/config/src/utils/compositeRules.ts @@ -5,9 +5,9 @@ import { isDeepStrictEqual } from "node:util"; import { minimatch } from "minimatch"; // Import Internal Dependencies -import { SigynConfig, SigynCompositeRule, SigynInitializedCompositeRule } from "../types"; -import { extendsTemplates } from "./templates"; -import { ruleSeverity } from "./defaultValues"; +import type { SigynConfig, SigynCompositeRule, SigynInitializedCompositeRule } from "../types.js"; +import { extendsTemplates } from "./templates.js"; +import { ruleSeverity } from "./defaultValues.js"; // CONSTANTS const kDefaultCompositeRuleInterval = "1d"; diff --git a/src/config/src/utils/defaultValues.ts b/src/config/src/utils/defaultValues.ts index 18b90647..0b098ec7 100644 --- a/src/config/src/utils/defaultValues.ts +++ b/src/config/src/utils/defaultValues.ts @@ -1,13 +1,13 @@ // Import Internal Dependencies -import { +import type { PartialSigynConfig, SigynConfig, SigynInitializedConfig, SigynInitializedRule, SigynInitializedCompositeRule, SigynRule -} from "../types"; -import { getSeverity } from "./severity"; +} from "../types.js"; +import { getSeverity } from "./severity.js"; // CONSTANTS const kDefaultMissingLabelStrategy = "ignore"; @@ -69,7 +69,7 @@ export function applyDefaultValues( count: config.selfMonitoring.throttle.count ?? 0 } : undefined } : undefined, - compositeRules: config.compositeRules ? config.compositeRules.map((rule: SigynInitializedCompositeRule) => { + compositeRules: config.compositeRules ? (config.compositeRules as SigynInitializedCompositeRule[]).map((rule) => { // Note: rules are already initialized with `initializeCompositeRules()`. rule.notifiers ??= Object.values(config.notifiers!).map(({ notifier }) => notifier); rule.template.title ??= ""; diff --git a/src/config/src/utils/index.ts b/src/config/src/utils/index.ts index 0d2ba776..0223bc3b 100644 --- a/src/config/src/utils/index.ts +++ b/src/config/src/utils/index.ts @@ -1,5 +1,5 @@ -export * as compositeRules from "./compositeRules"; -export * as rules from "./rules"; -export * from "./defaultValues"; -export * from "./severity"; -export * from "./templates"; +export * as compositeRules from "./compositeRules.js"; +export * as rules from "./rules.js"; +export * from "./defaultValues.js"; +export * from "./severity.js"; +export * from "./templates.js"; diff --git a/src/config/src/utils/rules.ts b/src/config/src/utils/rules.ts index 331edf1b..afcba6c1 100644 --- a/src/config/src/utils/rules.ts +++ b/src/config/src/utils/rules.ts @@ -2,8 +2,8 @@ import { GrafanaApi } from "@myunisoft/loki"; // Import Internal Dependencies -import { SigynConfig, SigynInitializedRule, SigynRule } from "../types"; -import { extendsTemplates } from "./templates"; +import type { SigynConfig, SigynInitializedRule, SigynRule } from "../types.js"; +import { extendsTemplates } from "./templates.js"; export async function initialize(config: SigynConfig): Promise { const labels = await fetchLabels(config); diff --git a/src/config/src/utils/severity.ts b/src/config/src/utils/severity.ts index 0bcaa959..521d1457 100644 --- a/src/config/src/utils/severity.ts +++ b/src/config/src/utils/severity.ts @@ -1,5 +1,5 @@ // Import Internal Dependencies -import { AlertSeverity } from "../types"; +import type { AlertSeverity } from "../types.js"; export function getSeverity(sev: AlertSeverity): "critical" | "error" | "warning" | "info" { switch (sev) { diff --git a/src/config/src/utils/templates.ts b/src/config/src/utils/templates.ts index 030496eb..340caee1 100644 --- a/src/config/src/utils/templates.ts +++ b/src/config/src/utils/templates.ts @@ -1,5 +1,5 @@ // Import Internal Dependencies -import { SigynAlertTemplate, SigynConfig, SigynInitializedTemplate } from "../types"; +import type { SigynAlertTemplate, SigynConfig, SigynInitializedTemplate } from "../types.js"; export function extendsTemplates(template: SigynAlertTemplate, config: SigynConfig): SigynInitializedTemplate { const configTemplates = config.templates!; diff --git a/src/config/src/validate.ts b/src/config/src/validate.ts index d4c64d37..b6e9fa2b 100644 --- a/src/config/src/validate.ts +++ b/src/config/src/validate.ts @@ -1,18 +1,19 @@ // Import Third-party Dependencies -import Ajv, { ErrorObject } from "ajv/dist/2020.js"; -import ajvKeywords from "ajv-keywords"; +import { Ajv2020 as Ajv, type ErrorObject } from "ajv/dist/2020.js"; +import _ajvKeywords from "ajv-keywords"; // Import Internal Dependencies -import { ExtendedSigynConfig, PartialSigynConfig } from "./types"; -import rulesSchema from "./schemas/rules.json"; -import templateSchema from "./schemas/templates.json"; -import configSchema from "./schemas/configSchema.json"; -import extendedConfigSchema from "./schemas/extendedConfigSchema.json"; +import type { ExtendedSigynConfig, PartialSigynConfig } from "./types.js"; +import rulesSchema from "./schemas/rules.json" with { type: "json" }; +import templateSchema from "./schemas/templates.json" with { type: "json" }; +import configSchema from "./schemas/configSchema.json" with { type: "json" }; +import extendedConfigSchema from "./schemas/extendedConfigSchema.json" with { type: "json" }; // CONSTANTS const kAjv = new Ajv(); kAjv.addSchema(rulesSchema); kAjv.addSchema(templateSchema); +const ajvKeywords = _ajvKeywords as unknown as typeof _ajvKeywords.default; ajvKeywords(kAjv); export function validateConfig(config: PartialSigynConfig) { diff --git a/src/config/test/compositeRules.validation.spec.ts b/src/config/test/compositeRules.validation.spec.ts index 0a434d9f..2de63271 100644 --- a/src/config/test/compositeRules.validation.spec.ts +++ b/src/config/test/compositeRules.validation.spec.ts @@ -1,4 +1,4 @@ -/* eslint-disable max-lines */ +/* eslint-disable max-lines, @stylistic/max-len */ // Import Node.js Dependencies import assert from "node:assert"; import { describe, it } from "node:test"; @@ -596,7 +596,7 @@ describe("Composite rules validations", () => { }); }, { name: "Error", - // eslint-disable-next-line max-len + message: "Invalid config: /compositeRules/0/interval: must match pattern \"^((?:\\d+)?\\.?\\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$\"" }); }); @@ -775,7 +775,7 @@ describe("Composite rules validations", () => { }); }, { name: "Error", - // eslint-disable-next-line max-len + message: "Invalid config: /compositeRules/0/throttle/interval: must match pattern \"^((?:\\d+)?\\.?\\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$\"" }); }); @@ -960,7 +960,7 @@ describe("Composite rules validations", () => { }); }, { name: "Error", - // eslint-disable-next-line max-len + message: "Invalid config: /compositeRules/0/muteDuration: must match pattern \"^((?:\\d+)?\\.?\\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$\"" }); }); diff --git a/src/config/test/extendsConfig.spec.ts b/src/config/test/extendsConfig.spec.ts index 7d31eb0a..2d6e41ea 100644 --- a/src/config/test/extendsConfig.spec.ts +++ b/src/config/test/extendsConfig.spec.ts @@ -2,6 +2,7 @@ import assert from "node:assert"; import { after, before, describe, it } from "node:test"; import path from "node:path"; +import url from "node:url"; // Import Third-party Dependencies import { MockAgent, getGlobalDispatcher, setGlobalDispatcher } from "@myunisoft/httpie"; @@ -14,6 +15,8 @@ const kLokiFixtureApiUrl = "http://localhost:3100"; const kMockAgent = new MockAgent(); const kGlobalDispatcher = getGlobalDispatcher(); +const __dirname = path.dirname(url.fileURLToPath(import.meta.url)); + describe("Extended configs", () => { before(() => { process.env.GRAFANA_API_TOKEN = "toto"; diff --git a/src/config/test/extendsTemplate.spec.ts b/src/config/test/extendsTemplate.spec.ts index 03a0f991..fc316a7f 100644 --- a/src/config/test/extendsTemplate.spec.ts +++ b/src/config/test/extendsTemplate.spec.ts @@ -2,6 +2,7 @@ import assert from "node:assert"; import { after, before, describe, it } from "node:test"; import path from "node:path"; +import url from "node:url"; // Import Third-party Dependencies import { MockAgent, getGlobalDispatcher, setGlobalDispatcher } from "@myunisoft/httpie"; @@ -14,6 +15,8 @@ const kLokiFixtureApiUrl = "http://localhost:3100"; const kMockAgent = new MockAgent(); const kGlobalDispatcher = getGlobalDispatcher(); +const __dirname = path.dirname(url.fileURLToPath(import.meta.url)); + describe("Extended templates", () => { before(() => { process.env.GRAFANA_API_TOKEN = "toto"; diff --git a/src/config/test/rule.alert.validation.spec.ts b/src/config/test/rule.alert.validation.spec.ts index eb958b16..97aea28e 100644 --- a/src/config/test/rule.alert.validation.spec.ts +++ b/src/config/test/rule.alert.validation.spec.ts @@ -1,4 +1,4 @@ -/* eslint-disable max-len */ +/* eslint-disable @stylistic/max-len */ // Import Node.js Dependencies import assert from "node:assert"; import { describe, it } from "node:test"; @@ -244,7 +244,7 @@ describe("Rule alert validations", () => { })); }, { name: "Error", - // eslint-disable-next-line max-len + message: "Invalid config: /rules/0/alert/on/interval: must match pattern \"^((?:\\d+)?\\.?\\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$\"" }); }); @@ -553,7 +553,7 @@ describe("Rule alert validations", () => { })); }, { name: "Error", - // eslint-disable-next-line max-len + message: "Invalid config: /rules/0/alert/throttle/interval: must match pattern \"^((?:\\d+)?\\.?\\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$\"" }); }); diff --git a/src/config/test/rule.common.validation.spec.ts b/src/config/test/rule.common.validation.spec.ts index 6ae12e8f..599baefc 100644 --- a/src/config/test/rule.common.validation.spec.ts +++ b/src/config/test/rule.common.validation.spec.ts @@ -1,4 +1,4 @@ -/* eslint-disable max-len */ +/* eslint-disable @stylistic/max-len */ // Import Node.js Dependencies import assert from "node:assert"; import { describe, it } from "node:test"; diff --git a/src/config/test/rule.template.validation.spec.ts b/src/config/test/rule.template.validation.spec.ts index d12562ca..90592b3f 100644 --- a/src/config/test/rule.template.validation.spec.ts +++ b/src/config/test/rule.template.validation.spec.ts @@ -1,4 +1,4 @@ -/* eslint-disable max-len */ +/* eslint-disable @stylistic/max-len */ // Import Node.js Dependencies import assert from "node:assert"; import { describe, it } from "node:test"; diff --git a/src/config/test/selfMonitoring.validation.spec.ts b/src/config/test/selfMonitoring.validation.spec.ts index 6f56632f..ec9f3f48 100644 --- a/src/config/test/selfMonitoring.validation.spec.ts +++ b/src/config/test/selfMonitoring.validation.spec.ts @@ -6,7 +6,6 @@ import { describe, it } from "node:test"; import { validateConfig } from "../src/validate"; import { VALID_CONFIG } from "./helpers"; - // CONSTANTS const kDurations = [ "20milliseconds", "20 milliseconds", @@ -410,7 +409,8 @@ describe("Self-monitoring validations", () => { }); }, { name: "Error", - // eslint-disable-next-line max-len + + // eslint-disable-next-line @stylistic/max-len message: "Invalid config: /selfMonitoring/throttle/interval: must match pattern \"^((?:\\d+)?\\.?\\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$\"" }); }); diff --git a/src/config/test/validation.spec.ts b/src/config/test/validation.spec.ts index dac05b3c..1ab8d6c9 100644 --- a/src/config/test/validation.spec.ts +++ b/src/config/test/validation.spec.ts @@ -1,4 +1,4 @@ -/* eslint-disable max-len */ + // Import Node.js Dependencies import assert from "node:assert"; import { describe, it } from "node:test"; @@ -304,7 +304,6 @@ describe("Config validation", () => { }); }); - it("given a root template without title and content, it should throws", () => { assert.throws(() => { validateConfig({ @@ -315,6 +314,7 @@ describe("Config validation", () => { }); }, { name: "Error", + // eslint-disable-next-line @stylistic/max-len message: "Invalid config: /templates/foo: must have required property 'title', /templates/foo: must have required property 'content', /templates/foo: must have required property 'extends', /templates/foo: must match a schema in anyOf" }); }); diff --git a/src/config/tsconfig.json b/src/config/tsconfig.json index edfc8d8a..5505e6d5 100644 --- a/src/config/tsconfig.json +++ b/src/config/tsconfig.json @@ -1,20 +1,10 @@ { + "extends": "../../tsconfig.base.json", "compilerOptions": { - "declaration": true, - "strictNullChecks": true, - "target": "ES2022", - "outDir": "dist", - "module": "NodeNext", - "moduleResolution": "NodeNext", - "esModuleInterop": true, - "resolveJsonModule": true, - "skipDefaultLibCheck": true, - "skipLibCheck": true, - "forceConsistentCasingInFileNames": true, - "sourceMap": true, "rootDir": "./src", - "types": ["node"] + "outDir": "./dist", }, - "include": ["src"], - "exclude": ["node_modules", "dist"] + "include": [ + "src" + ], } diff --git a/src/discord/README.md b/src/discord/README.md index d62f130d..8a23229c 100644 --- a/src/discord/README.md +++ b/src/discord/README.md @@ -26,7 +26,7 @@ ## 🚧 Requirements -- [Node.js](https://nodejs.org/en/) version 18 or higher +- [Node.js](https://nodejs.org/en/) version 20 or higher ## 🚀 Getting Started diff --git a/src/discord/package.json b/src/discord/package.json index 88f88ce6..83441fa5 100644 --- a/src/discord/package.json +++ b/src/discord/package.json @@ -2,25 +2,25 @@ "name": "@sigyn/discord", "version": "2.0.0", "description": "Send Sigyn alerts to Discord via webhook", - "main": "./dist/index.js", - "module": "./dist/index.mjs", + "main": "./dist/index.cjs", + "module": "./dist/index.js", "types": "./dist/index.d.ts", "exports": { ".": { - "require": "./dist/index.js", - "import": "./dist/index.mjs", - "types": "./dist/index.d.ts" + "types": "./dist/index.d.ts", + "require": "./dist/index.cjs", + "import": "./dist/index.js" } }, "engines": { - "node": ">=18" + "node": ">=20" }, "scripts": { "build": "tsup src/index.ts --format cjs,esm --dts --clean", "prepublishOnly": "npm run build", "test": "glob -c \"tsx --test\" \"./test/**/*.spec.ts\"", "coverage": "c8 -r html npm test", - "lint": "cross-env eslint src/**/*.ts" + "lint": "eslint src test" }, "repository": { "type": "git", @@ -38,6 +38,7 @@ "author": "GENTILHOMME Thomas ", "license": "MIT", "dependencies": { - "@myunisoft/httpie": "^5.0.0" - } + "@myunisoft/httpie": "^5.0.1" + }, + "type": "module" } diff --git a/src/discord/src/index.ts b/src/discord/src/index.ts index 4bd63e4f..bdaaea4b 100644 --- a/src/discord/src/index.ts +++ b/src/discord/src/index.ts @@ -1,6 +1,6 @@ // Import Third-party Dependencies -import { MorphixOptions } from "@sigyn/morphix"; -import { WebhookNotifierOptions, WebhookNotifier } from "@sigyn/notifiers"; +import { type MorphixOptions } from "@sigyn/morphix"; +import { type WebhookNotifierOptions, WebhookNotifier } from "@sigyn/notifiers"; // CONSTANTS const kWebhookUsername = "Sigyn Agent"; @@ -27,7 +27,7 @@ export interface DiscordWebhookBodyFormat { } class DiscordNotifier extends WebhookNotifier { - contentTemplateOptions(): MorphixOptions { + override contentTemplateOptions(): MorphixOptions { return { transform: ({ key, value }) => (key === "lokiUrl" ? value : `**${value === undefined ? "unknown" : value}**`), ignoreMissing: true diff --git a/src/discord/test/execute.spec.ts b/src/discord/test/execute.spec.ts index b6ef138e..1385f565 100644 --- a/src/discord/test/execute.spec.ts +++ b/src/discord/test/execute.spec.ts @@ -6,7 +6,7 @@ import { after, before, describe, it } from "node:test"; import { MockAgent, MockPool, getGlobalDispatcher, setGlobalDispatcher } from "@myunisoft/httpie"; // Import Internal Dependencies -import * as discord from "../src/index"; +import * as discord from "../src/index.js"; const kMockAgent = new MockAgent(); const kDispatcher = getGlobalDispatcher(); diff --git a/src/discord/tsconfig.json b/src/discord/tsconfig.json index de4ebfc0..5505e6d5 100644 --- a/src/discord/tsconfig.json +++ b/src/discord/tsconfig.json @@ -1,20 +1,10 @@ { + "extends": "../../tsconfig.base.json", "compilerOptions": { - "declaration": true, - "strictNullChecks": true, - "target": "ES2022", - "outDir": "dist", - "module": "NodeNext", - "moduleResolution": "NodeNext", - "esModuleInterop": true, - "resolveJsonModule": false, - "skipDefaultLibCheck": true, - "skipLibCheck": true, - "forceConsistentCasingInFileNames": true, - "sourceMap": true, "rootDir": "./src", - "types": ["node"] + "outDir": "./dist", }, - "include": ["src"], - "exclude": ["node_modules", "dist"] + "include": [ + "src" + ], } diff --git a/src/logql/README.md b/src/logql/README.md index 386652a1..2f5bb3f1 100644 --- a/src/logql/README.md +++ b/src/logql/README.md @@ -26,7 +26,7 @@ ## 🚧 Requirements -- [Node.js](https://nodejs.org/en/) version 18 or higher +- [Node.js](https://nodejs.org/en/) version 20 or higher ## 🚀 Getting Started diff --git a/src/logql/package.json b/src/logql/package.json index b8e16032..c696904b 100644 --- a/src/logql/package.json +++ b/src/logql/package.json @@ -2,25 +2,25 @@ "name": "@sigyn/logql", "version": "2.2.0", "description": "Parse and serialize LogQL queries", - "main": "./dist/index.js", - "module": "./dist/index.mjs", + "main": "./dist/index.cjs", + "module": "./dist/index.js", "types": "./dist/index.d.ts", "exports": { ".": { - "require": "./dist/index.js", - "import": "./dist/index.mjs", - "types": "./dist/index.d.ts" + "types": "./dist/index.d.ts", + "require": "./dist/index.cjs", + "import": "./dist/index.js" } }, "engines": { - "node": ">=18" + "node": ">=20" }, "scripts": { "build": "tsup src/index.ts --format cjs,esm --dts --clean", "prepublishOnly": "npm run build", "test": "glob -c \"tsx --test\" \"./test/**/*.spec.ts\"", "coverage": "c8 -r html npm test", - "lint": "cross-env eslint src/**/*.ts" + "lint": "eslint src test" }, "repository": { "type": "git", @@ -36,5 +36,6 @@ ], "keywords": [], "author": "GENTILHOMME Thomas ", - "license": "MIT" + "license": "MIT", + "type":"module" } diff --git a/src/logql/src/index.ts b/src/logql/src/index.ts index 8dc0da54..84025c85 100644 --- a/src/logql/src/index.ts +++ b/src/logql/src/index.ts @@ -1,8 +1,8 @@ // Import Internal Dependencies -import { StreamSelector } from "./streamSelector"; -import { LineFilters } from "./lineFilters"; -import { LabelFilters } from "./labelFilters"; -import { ParserExpression } from "./parserExpression"; +import { StreamSelector } from "./streamSelector.js"; +import { LineFilters } from "./lineFilters.js"; +import { LabelFilters } from "./labelFilters.js"; +import { ParserExpression } from "./parserExpression.js"; export { StreamSelector, LineFilters, LabelFilters, ParserExpression }; diff --git a/src/logql/src/labelFilters.ts b/src/logql/src/labelFilters.ts index 3d5e2244..d72bfe3f 100644 --- a/src/logql/src/labelFilters.ts +++ b/src/logql/src/labelFilters.ts @@ -78,7 +78,7 @@ export class LabelFilters extends Map { * If `labelValue` is a `string` or a `number`, the default operator will be an **exactlyEqual** and must be passed as * a third argument to be modified. * */ - set(labelKey: string, labelValue: LabelValue[] | LabelValue | string | number, op: LabelFilterOperator = "=") { + override set(labelKey: string, labelValue: LabelValue[] | LabelValue | string | number, op: LabelFilterOperator = "=") { if (typeof labelValue === "string" || typeof labelValue === "number") { this.#set(labelKey, { value: labelValue, operator: op }); @@ -102,7 +102,7 @@ export class LabelFilters extends Map { return this; } - toString() { + override toString() { return `${[...this.entries()].flatMap(([key, values], index) => values.map(({ operator, value }) => { const delimiter = this.#getDelimiter(value, operator); diff --git a/src/logql/src/lineFilters.ts b/src/logql/src/lineFilters.ts index 12bdc93b..b101e337 100644 --- a/src/logql/src/lineFilters.ts +++ b/src/logql/src/lineFilters.ts @@ -94,7 +94,7 @@ export class LineFilters extends Map { return this; } - toString() { + override toString() { function serializeExpression(values: string[], operator: string) { return values.map((value) => `${operator} \`${value}\``).join(` ${operator} `); } diff --git a/src/logql/src/streamSelector.ts b/src/logql/src/streamSelector.ts index f3e558b6..bcc6432e 100644 --- a/src/logql/src/streamSelector.ts +++ b/src/logql/src/streamSelector.ts @@ -116,7 +116,7 @@ export class StreamSelector extends Map { * * If `labelValue` is a `string`, the default operator will be an **exactlyEqual** and must be passed as a third argument to be modified. */ - set( + override set( labelKey: string, labelValue: LabelValue | string, op?: LabelMatchingOperator @@ -133,7 +133,7 @@ export class StreamSelector extends Map { return this; } - toString() { + override toString() { const selectorStr = [...this.entries()] .map(([key, { operator, value }]) => `${key}${operator}"${value}"`) .join(","); diff --git a/src/logql/test/labelFilters.spec.ts b/src/logql/test/labelFilters.spec.ts index fd0b3d7a..b1452ccb 100644 --- a/src/logql/test/labelFilters.spec.ts +++ b/src/logql/test/labelFilters.spec.ts @@ -3,7 +3,7 @@ import assert from "node:assert"; import { describe, it } from "node:test"; // Import Internal Dependencies -import { LabelFilters } from "../src/labelFilters"; +import { LabelFilters } from "../src/labelFilters.js"; describe("LabelFilters", () => { describe("Constructor", () => { diff --git a/src/logql/test/lineFilters.spec.ts b/src/logql/test/lineFilters.spec.ts index 2e5a2c41..b0daf7e1 100644 --- a/src/logql/test/lineFilters.spec.ts +++ b/src/logql/test/lineFilters.spec.ts @@ -3,7 +3,7 @@ import assert from "node:assert"; import { describe, it } from "node:test"; // Import Internal Dependencies -import { LineFilters } from "../src/lineFilters"; +import { LineFilters } from "../src/lineFilters.js"; describe("LineFilters", () => { describe("parsing", () => { diff --git a/src/logql/test/logql.spec.ts b/src/logql/test/logql.spec.ts index b67ffe54..7627226c 100644 --- a/src/logql/test/logql.spec.ts +++ b/src/logql/test/logql.spec.ts @@ -3,9 +3,9 @@ import assert from "node:assert"; import { describe, it } from "node:test"; // Import Internal Dependencies -import { LogQL } from "../src/index"; -import { StreamSelector } from "../src/streamSelector"; -import { LineFilters } from "../src/lineFilters"; +import { LogQL } from "../src/index.js"; +import { StreamSelector } from "../src/streamSelector.js"; +import { LineFilters } from "../src/lineFilters.js"; describe("LogQL", () => { describe("static type", () => { diff --git a/src/logql/test/parserExpression.spec.ts b/src/logql/test/parserExpression.spec.ts index c940e763..0d396779 100644 --- a/src/logql/test/parserExpression.spec.ts +++ b/src/logql/test/parserExpression.spec.ts @@ -3,7 +3,7 @@ import assert from "node:assert"; import { describe, it } from "node:test"; // Import Internal Dependencies -import { ParserExpression } from "../src/parserExpression"; +import { ParserExpression } from "../src/parserExpression.js"; describe("ParserExpression", () => { describe("Parsing", () => { diff --git a/src/logql/test/streamSelector.spec.ts b/src/logql/test/streamSelector.spec.ts index da20d333..2c92ced8 100644 --- a/src/logql/test/streamSelector.spec.ts +++ b/src/logql/test/streamSelector.spec.ts @@ -3,7 +3,7 @@ import assert from "node:assert"; import { describe, it } from "node:test"; // Import Internal Dependencies -import { StreamSelector } from "../src/streamSelector"; +import { StreamSelector } from "../src/streamSelector.js"; describe("StreamSelector", () => { describe("constructor", () => { diff --git a/src/logql/tsconfig.json b/src/logql/tsconfig.json index de4ebfc0..5505e6d5 100644 --- a/src/logql/tsconfig.json +++ b/src/logql/tsconfig.json @@ -1,20 +1,10 @@ { + "extends": "../../tsconfig.base.json", "compilerOptions": { - "declaration": true, - "strictNullChecks": true, - "target": "ES2022", - "outDir": "dist", - "module": "NodeNext", - "moduleResolution": "NodeNext", - "esModuleInterop": true, - "resolveJsonModule": false, - "skipDefaultLibCheck": true, - "skipLibCheck": true, - "forceConsistentCasingInFileNames": true, - "sourceMap": true, "rootDir": "./src", - "types": ["node"] + "outDir": "./dist", }, - "include": ["src"], - "exclude": ["node_modules", "dist"] + "include": [ + "src" + ], } diff --git a/src/morphix/package.json b/src/morphix/package.json index 3c2aa20c..b01c82a3 100644 --- a/src/morphix/package.json +++ b/src/morphix/package.json @@ -7,20 +7,20 @@ "types": "./dist/index.d.ts", "exports": { ".": { - "require": "./dist/index.js", - "import": "./dist/index.mjs", - "types": "./dist/index.d.ts" + "types": "./dist/index.d.ts", + "require": "./dist/index.cjs", + "import": "./dist/index.js" } }, "engines": { - "node": ">=18" + "node": ">=20" }, "scripts": { "build": "tsup src/index.ts --format cjs,esm --dts --clean", "prepublishOnly": "npm run build", - "test": "npm run build && glob -c \"tsx --test --loader=esmock\" \"./test/**/*.spec.mts\"", + "test": "npm run build && glob -c \"tsx --test\" \"./test/**/*.spec.ts\"", "coverage": "c8 -r html npm test", - "lint": "cross-env eslint src/**/*.ts" + "lint": "eslint src test" }, "repository": { "type": "git", @@ -37,7 +37,5 @@ "keywords": [], "author": "GENTILHOMME Thomas ", "license": "MIT", - "devDependencies": { - "esmock": "^2.6.6" - } + "type": "module" } diff --git a/src/morphix/src/functions/index.ts b/src/morphix/src/functions/index.ts index d3f5ef2b..b46a1207 100644 --- a/src/morphix/src/functions/index.ts +++ b/src/morphix/src/functions/index.ts @@ -1,2 +1,2 @@ -export { capitalize } from "./capitalize"; -export { dnsresolve } from "./dnsresolve"; +export { capitalize } from "./capitalize.js"; +export { dnsresolve } from "./dnsresolve.js"; diff --git a/src/morphix/src/index.ts b/src/morphix/src/index.ts index c04dd132..6e6d03c2 100644 --- a/src/morphix/src/index.ts +++ b/src/morphix/src/index.ts @@ -1,7 +1,7 @@ /* eslint-disable func-style */ // Import Internal Dependencies -import { capitalize, dnsresolve } from "./functions"; +import { capitalize, dnsresolve } from "./functions/index.js"; // CONSTANTS const kDefaultFunctions: Record = { @@ -17,7 +17,7 @@ export interface MorphixOptions { * If the returned value is undefined, the behavior depends on the ignoreMissing option. * Otherwise, the returned value is converted to a string and embedded into the template. */ - transform?: (data: { value: unknown; key: string }) => unknown; + transform?: (data: { value: unknown; key: string; }) => unknown; /** * By default, Morphix throws a MissingValueError when a placeholder resolves to undefined. * If this option is set to true, it simply ignores the unresolved placeholder and leaves it as is. @@ -59,7 +59,7 @@ export async function morphix( } const replace = async(placeholder: string, key: string, func: string | undefined) => { - let value: string | undefined = undefined; + let value: string | undefined; const keys = key?.split(".") ?? []; for (const property of keys) { if (data[property] !== void 0) { diff --git a/src/morphix/test/index.spec.mts b/src/morphix/test/index.spec.ts similarity index 86% rename from src/morphix/test/index.spec.mts rename to src/morphix/test/index.spec.ts index ae4d06d7..09458131 100644 --- a/src/morphix/test/index.spec.mts +++ b/src/morphix/test/index.spec.ts @@ -1,12 +1,10 @@ // Import Node.js Dependencies import assert from "node:assert"; import { describe, it } from "node:test"; - -// Import Third-party Dependencies -import esmock from "esmock"; +import dns from "node:dns/promises"; // Import Internal Dependencies -import { morphix, type MorphixFunction } from "../dist/index.mjs"; +import { morphix, type MorphixFunction } from "../src/index.js"; describe("Morphix", () => { it("main", async() => { @@ -88,22 +86,14 @@ describe("Morphix", () => { assert.equal(await morphix("{foo | capitalize}", { foo: "foo" }), "Foo"); }); - it("should find ip hostname", async() => { - const { morphix } = await esmock("../dist/index.mjs", { - "node:dns/promises": { - reverse: async() => ["dns.google"] - } - }); + it("should find ip hostname", async(t) => { + t.mock.method(dns, "reverse", async() => ["dns.google"]); assert.equal(await morphix("host: {foo | dnsresolve}", { foo: "8.8.8.8" }), "host: dns.google"); }); - it("should not find ip hostname", async() => { - const { morphix } = await esmock("../dist/index.mjs", { - "node:dns/promises": { - reverse: async() => { - throw new Error("Not found"); - } - } + it("should not find ip hostname", async(t) => { + t.mock.method(dns, "reverse", async() => { + throw new Error("boo"); }); assert.equal(await morphix("host: {foo | dnsresolve}", { foo: "8.8.8.8" }), "host: 8.8.8.8"); }); diff --git a/src/morphix/tsconfig.json b/src/morphix/tsconfig.json index de4ebfc0..5505e6d5 100644 --- a/src/morphix/tsconfig.json +++ b/src/morphix/tsconfig.json @@ -1,20 +1,10 @@ { + "extends": "../../tsconfig.base.json", "compilerOptions": { - "declaration": true, - "strictNullChecks": true, - "target": "ES2022", - "outDir": "dist", - "module": "NodeNext", - "moduleResolution": "NodeNext", - "esModuleInterop": true, - "resolveJsonModule": false, - "skipDefaultLibCheck": true, - "skipLibCheck": true, - "forceConsistentCasingInFileNames": true, - "sourceMap": true, "rootDir": "./src", - "types": ["node"] + "outDir": "./dist", }, - "include": ["src"], - "exclude": ["node_modules", "dist"] + "include": [ + "src" + ], } diff --git a/src/notifiers/package.json b/src/notifiers/package.json index c0d2e478..2c0bbb12 100644 --- a/src/notifiers/package.json +++ b/src/notifiers/package.json @@ -2,25 +2,25 @@ "name": "@sigyn/notifiers", "version": "1.0.0", "description": "Helpers to build a Sigyn notifier", - "main": "./dist/index.js", - "module": "./dist/index.mjs", + "main": "./dist/index.cjs", + "module": "./dist/index.js", "types": "./dist/index.d.ts", "exports": { ".": { - "require": "./dist/index.js", - "import": "./dist/index.mjs", - "types": "./dist/index.d.ts" + "types": "./dist/index.d.ts", + "require": "./dist/index.cjs", + "import": "./dist/index.js" } }, "engines": { - "node": ">=18" + "node": ">=20" }, "scripts": { "build": "tsup src/index.ts --format cjs,esm --dts --clean --external @myunisoft/httpie", "prepublishOnly": "npm run build", "test": "glob -c \"tsx --test\" \"./test/**/*.spec.ts\"", "coverage": "c8 -r html npm test", - "lint": "cross-env eslint src/**/*.ts" + "lint": "eslint src test" }, "repository": { "type": "git", @@ -39,5 +39,6 @@ "license": "MIT", "peerDependencies": { "@myunisoft/httpie": "^2.0.3" - } + }, + "type": "module" } diff --git a/src/notifiers/src/webhook.ts b/src/notifiers/src/webhook.ts index bb53d966..c6567838 100644 --- a/src/notifiers/src/webhook.ts +++ b/src/notifiers/src/webhook.ts @@ -1,9 +1,9 @@ // Import Third-party Dependencies -import { +import type { SigynInitializedTemplate, NotifierFormattedSigynRule } from "@sigyn/config"; -import { morphix, MorphixOptions } from "@sigyn/morphix"; +import { morphix, type MorphixOptions } from "@sigyn/morphix"; import * as httpie from "@myunisoft/httpie"; // CONSTANTS @@ -37,7 +37,7 @@ export interface WebhookData { agentFailure?: { errors: string; rules: string; - } + }; rules?: string; labelCount: number; labelMatchCount: number; diff --git a/src/notifiers/test/webhook.spec.ts b/src/notifiers/test/webhook.spec.ts index 198d6ab1..872df99b 100644 --- a/src/notifiers/test/webhook.spec.ts +++ b/src/notifiers/test/webhook.spec.ts @@ -6,7 +6,7 @@ import { describe, it, after, before, test } from "node:test"; import { MockAgent, MockPool, getGlobalDispatcher, setGlobalDispatcher } from "@myunisoft/httpie"; // Import Internal Dependencies -import { WebhookNotifier } from "../src/webhook"; +import { WebhookNotifier } from "../src/webhook.js"; // CONSTANTS const kMockAgent = new MockAgent(); @@ -114,7 +114,7 @@ describe("Webhook", () => { }); }); -class DummyWebhookNotifier extends WebhookNotifier<{ foo: string }> { +class DummyWebhookNotifier extends WebhookNotifier<{ foo: string; }> { async formatWebhookBody() { return { foo: "bar" }; } diff --git a/src/notifiers/tsconfig.json b/src/notifiers/tsconfig.json index e0222495..5505e6d5 100644 --- a/src/notifiers/tsconfig.json +++ b/src/notifiers/tsconfig.json @@ -1,24 +1,10 @@ { + "extends": "../../tsconfig.base.json", "compilerOptions": { - "declaration": true, - "strictNullChecks": true, - "target": "ES2022", - "outDir": "dist", - "module": "NodeNext", - "moduleResolution": "NodeNext", - "esModuleInterop": true, - "resolveJsonModule": false, - "skipDefaultLibCheck": true, - "skipLibCheck": true, - "forceConsistentCasingInFileNames": true, - "sourceMap": true, "rootDir": "./src", - "typeRoots": [ - "../../node_modules/@types", - "../config/dist" - ], - "types": ["node"], + "outDir": "./dist", }, - "include": ["src"], - "exclude": ["node_modules", "dist"] + "include": [ + "src" + ], } diff --git a/src/pattern/README.md b/src/pattern/README.md index 675a63e0..658a1a40 100644 --- a/src/pattern/README.md +++ b/src/pattern/README.md @@ -26,7 +26,7 @@ ## 🚧 Requirements -- [Node.js](https://nodejs.org/en/) version 18 or higher +- [Node.js](https://nodejs.org/en/) version 20 or higher ## 🚀 Getting Started diff --git a/src/pattern/package.json b/src/pattern/package.json index 247a1aa2..a6f63878 100644 --- a/src/pattern/package.json +++ b/src/pattern/package.json @@ -2,18 +2,18 @@ "name": "@sigyn/pattern", "version": "1.1.0", "description": "Loki pattern in JavaScript", - "main": "./dist/pattern.js", - "module": "./dist/pattern.mjs", + "main": "./dist/pattern.cjs", + "module": "./dist/pattern.js", "types": "./dist/pattern.d.ts", "exports": { ".": { - "require": "./dist/pattern.js", - "import": "./dist/pattern.mjs", - "types": "./dist/pattern.d.ts" + "types": "./dist/pattern.d.ts", + "require": "./dist/pattern.cjs", + "import": "./dist/pattern.js" } }, "engines": { - "node": ">=18" + "node": ">=20" }, "scripts": { "build": "tsup src/pattern.ts --format cjs,esm --dts --clean", @@ -22,7 +22,7 @@ "test:runner": "glob -c \"tsx --test\" \"./test/*.spec.ts\"", "test": "npm run test:runner && npm run test:tsd", "coverage": "c8 -r html npm test", - "lint": "cross-env eslint src/**/*.ts" + "lint": "eslint src test" }, "repository": { "type": "git", @@ -32,7 +32,7 @@ "bugs": { "url": "https://github.com/MyUnisoft/sigyn/issues" }, - "homepage": "https://github.com/MyUnisoft/sigyn/blob/main/src/logql/README.md", + "homepage": "https://github.com/MyUnisoft/sigyn/blob/main/src/pattern/README.md", "files": [ "dist" ], @@ -49,6 +49,7 @@ "author": "GENTILHOMME Thomas ", "license": "MIT", "devDependencies": { - "tsd": "^0.31.1" - } + "tsd": "^0.31.2" + }, + "type": "module" } diff --git a/src/pattern/src/pattern.ts b/src/pattern/src/pattern.ts index 1adc5625..e2b8f42d 100644 --- a/src/pattern/src/pattern.ts +++ b/src/pattern/src/pattern.ts @@ -1,5 +1,5 @@ // Import Internal Dependencies -import { +import type { LokiLiteralPattern, LokiPatternType } from "./types.js"; @@ -59,7 +59,7 @@ export class Pattern implements PatternShape { } } -export { +export type { LokiLiteralPattern, LokiPatternType }; diff --git a/src/pattern/src/types.ts b/src/pattern/src/types.ts index 9ac76c07..e7d5cbbc 100644 --- a/src/pattern/src/types.ts +++ b/src/pattern/src/types.ts @@ -1,19 +1,16 @@ -/* eslint-disable @typescript-eslint/ban-types */ -/* eslint-disable @typescript-eslint/no-unused-vars */ - type Simplify = { [KeyType in keyof T]: T[KeyType] } & {}; type ConvertEmptyRecord = T extends Record ? R : T; type Split = string extends S ? string[] : - S extends "" ? [] : - S extends `${infer T}${D}${infer U}` ? [`${T}${D}`, ...Split] : [S]; + S extends "" ? [] : + S extends `${infer T}${D}${infer U}` ? [`${T}${D}`, ...Split] : [S]; type Trim = S extends ` ${infer U}` ? Trim : - S extends `${infer U} ` ? Trim : - S; + S extends `${infer U} ` ? Trim : + S; type Concat = T extends [infer F extends string, ...infer R extends string[]] ? `${F} ${Concat}` @@ -21,8 +18,8 @@ type Concat = T extends [infer F extends string, ...infer R type ArrayToString = T extends string[] ? Concat : - T extends readonly string[] ? Concat<[...T]> : - T; + T extends readonly string[] ? Concat<[...T]> : + T; type ExtractPattern = Pattern extends `${infer _}<${infer Name}>${infer _}` ? diff --git a/src/pattern/test/types/index.test-d.ts b/src/pattern/test/types/index.test-d.ts index e0629223..fd0190c2 100644 --- a/src/pattern/test/types/index.test-d.ts +++ b/src/pattern/test/types/index.test-d.ts @@ -21,13 +21,15 @@ expectType<{ expectType<(log: string) => [] | [log: string]>(new NoopPattern().compile()); expectType<(log: string) => [] | [log: string]>(new Pattern("invalid pattern should return string").compile()); -expectType<(log: string) => [] | [log: { foobar: string }]>(new Pattern("<_> ").compile()); +expectType<(log: string) => [] | [log: { foobar: string; }]>(new Pattern("<_> ").compile()); expectType(new Pattern("invalid pattern should return string").executeOnLogs([])); expectType(new NoopPattern().executeOnLogs([])); +// eslint-disable-next-line no-constant-binary-expression expectAssignable>(new NoopPattern() || new Pattern("")); expectAssignable>(new NoopPattern()); expectAssignable>(new Pattern("foobar")); expectAssignable>(new Pattern(["foobar", "yo"])); expectAssignable ">>(new Pattern("<_> ")); + diff --git a/src/pattern/tsconfig.json b/src/pattern/tsconfig.json index e9d6a60c..5505e6d5 100644 --- a/src/pattern/tsconfig.json +++ b/src/pattern/tsconfig.json @@ -1,20 +1,10 @@ { + "extends": "../../tsconfig.base.json", "compilerOptions": { - "declaration": true, - "strictNullChecks": true, - "target": "ES2022", - "outDir": "dist", - "module": "ES2022", - "moduleResolution": "node", - "esModuleInterop": true, - "resolveJsonModule": false, - "skipDefaultLibCheck": true, - "skipLibCheck": true, - "forceConsistentCasingInFileNames": true, - "sourceMap": true, "rootDir": "./src", - "types": ["node"] + "outDir": "./dist", }, - "include": ["src"], - "exclude": ["node_modules", "dist"] + "include": [ + "src" + ], } diff --git a/src/slack/package.json b/src/slack/package.json index 16c6f058..c5000f0f 100644 --- a/src/slack/package.json +++ b/src/slack/package.json @@ -2,25 +2,25 @@ "name": "@sigyn/slack", "version": "2.0.0", "description": "Send Sigyn alerts to Slack via webhook", - "main": "./dist/index.js", - "module": "./dist/index.mjs", + "main": "./dist/index.cjs", + "module": "./dist/index.js", "types": "./dist/index.d.ts", "exports": { ".": { - "require": "./dist/index.js", - "import": "./dist/index.mjs", - "types": "./dist/index.d.ts" + "types": "./dist/index.d.ts", + "require": "./dist/index.cjs", + "import": "./dist/index.js" } }, "engines": { - "node": ">=18" + "node": ">=20" }, "scripts": { "build": "tsup src/index.ts --format cjs,esm --dts --clean", "prepublishOnly": "npm run build", "test": "glob -c \"tsx --test\" \"./test/**/*.spec.ts\"", "coverage": "c8 -r html npm test", - "lint": "cross-env eslint src/**/*.ts" + "lint": "eslint src test" }, "repository": { "type": "git", @@ -38,7 +38,8 @@ "author": "GENTILHOMME Thomas ", "license": "MIT", "dependencies": { - "@myunisoft/httpie": "^5.0.0", - "@slack/types": "^2.12.0" - } + "@myunisoft/httpie": "^5.0.1", + "@slack/types": "^2.14.0" + }, + "type": "module" } diff --git a/src/slack/src/index.ts b/src/slack/src/index.ts index fd9c745f..413e2b65 100644 --- a/src/slack/src/index.ts +++ b/src/slack/src/index.ts @@ -1,7 +1,7 @@ // Import Third-party Dependencies -import { MorphixOptions } from "@sigyn/morphix"; -import { WebhookNotifierOptions, WebhookNotifier } from "@sigyn/notifiers"; -import { MessageAttachment } from "@slack/types"; +import { type MorphixOptions } from "@sigyn/morphix"; +import { type WebhookNotifierOptions, WebhookNotifier } from "@sigyn/notifiers"; +import { type MessageAttachment } from "@slack/types"; // CONSTANTS const kAttachmentColor = { @@ -16,7 +16,7 @@ export interface SlackWebhookBodyFormat { } class SlackNotifier extends WebhookNotifier { - contentTemplateOptions(): MorphixOptions { + override contentTemplateOptions(): MorphixOptions { return { transform: ({ value, key }) => (key === "logql" || key === "lokiUrl" ? value : `*${value ?? "unknown"}*`), ignoreMissing: true diff --git a/src/slack/test/execute.spec.ts b/src/slack/test/execute.spec.ts index 5e442a89..f7f7255f 100644 --- a/src/slack/test/execute.spec.ts +++ b/src/slack/test/execute.spec.ts @@ -6,7 +6,7 @@ import { after, before, describe, it } from "node:test"; import { MockAgent, MockPool, getGlobalDispatcher, setGlobalDispatcher } from "@myunisoft/httpie"; // Import Internal Dependencies -import * as slack from "../src/index"; +import * as slack from "../src/index.js"; const kMockAgent = new MockAgent(); const kDispatcher = getGlobalDispatcher(); diff --git a/src/slack/tsconfig.json b/src/slack/tsconfig.json index de4ebfc0..5505e6d5 100644 --- a/src/slack/tsconfig.json +++ b/src/slack/tsconfig.json @@ -1,20 +1,10 @@ { + "extends": "../../tsconfig.base.json", "compilerOptions": { - "declaration": true, - "strictNullChecks": true, - "target": "ES2022", - "outDir": "dist", - "module": "NodeNext", - "moduleResolution": "NodeNext", - "esModuleInterop": true, - "resolveJsonModule": false, - "skipDefaultLibCheck": true, - "skipLibCheck": true, - "forceConsistentCasingInFileNames": true, - "sourceMap": true, "rootDir": "./src", - "types": ["node"] + "outDir": "./dist", }, - "include": ["src"], - "exclude": ["node_modules", "dist"] + "include": [ + "src" + ], } diff --git a/src/teams/package.json b/src/teams/package.json index 3affdbae..ccc625fc 100644 --- a/src/teams/package.json +++ b/src/teams/package.json @@ -2,25 +2,25 @@ "name": "@sigyn/teams", "version": "2.0.0", "description": "Send Sigyn alerts to Teams via webhook", - "main": "./dist/index.js", - "module": "./dist/index.mjs", + "main": "./dist/index.cjs", + "module": "./dist/index.js", "types": "./dist/index.d.ts", "exports": { ".": { - "require": "./dist/index.js", - "import": "./dist/index.mjs", - "types": "./dist/index.d.ts" + "types": "./dist/index.d.ts", + "require": "./dist/index.cjs", + "import": "./dist/index.js" } }, "engines": { - "node": ">=18" + "node": ">=20" }, "scripts": { "build": "tsup src/index.ts --format cjs,esm --dts --clean", "prepublishOnly": "npm run build", "test": "glob -c \"tsx --test\" \"./test/**/*.spec.ts\"", "coverage": "c8 -r html npm test", - "lint": "cross-env eslint src/**/*.ts" + "lint": "eslint src test" }, "repository": { "type": "git", @@ -38,6 +38,7 @@ "author": "GENTILHOMME Thomas ", "license": "MIT", "dependencies": { - "@myunisoft/httpie": "^5.0.0" - } + "@myunisoft/httpie": "^5.0.1" + }, + "type": "module" } diff --git a/src/teams/src/index.ts b/src/teams/src/index.ts index d99a42c7..c9d01f67 100644 --- a/src/teams/src/index.ts +++ b/src/teams/src/index.ts @@ -1,14 +1,14 @@ // Import Third-party Dependencies -import { MorphixOptions } from "@sigyn/morphix"; -import { WebhookNotifierOptions, WebhookNotifier } from "@sigyn/notifiers"; +import { type MorphixOptions } from "@sigyn/morphix"; +import { type WebhookNotifierOptions, WebhookNotifier } from "@sigyn/notifiers"; export interface TeamsWebhookBodyFormat { - title: string, - text: string + title: string; + text: string; } class TeamsNotifier extends WebhookNotifier { - contentTemplateOptions(): MorphixOptions { + override contentTemplateOptions(): MorphixOptions { return { transform: ({ value, key }) => (key === "logql" || key === "lokiUrl" ? value : `**${value ?? "unknown"}**`), ignoreMissing: true diff --git a/src/teams/test/execute.spec.ts b/src/teams/test/execute.spec.ts index 01c7d6c3..2578f1e9 100644 --- a/src/teams/test/execute.spec.ts +++ b/src/teams/test/execute.spec.ts @@ -6,7 +6,7 @@ import { after, before, describe, it } from "node:test"; import { MockAgent, MockPool, getGlobalDispatcher, setGlobalDispatcher } from "@myunisoft/httpie"; // Import Internal Dependencies -import * as teams from "../src/index"; +import * as teams from "../src/index.js"; const kMockAgent = new MockAgent(); const kDispatcher = getGlobalDispatcher(); diff --git a/src/teams/tsconfig.json b/src/teams/tsconfig.json index de4ebfc0..5505e6d5 100644 --- a/src/teams/tsconfig.json +++ b/src/teams/tsconfig.json @@ -1,20 +1,10 @@ { + "extends": "../../tsconfig.base.json", "compilerOptions": { - "declaration": true, - "strictNullChecks": true, - "target": "ES2022", - "outDir": "dist", - "module": "NodeNext", - "moduleResolution": "NodeNext", - "esModuleInterop": true, - "resolveJsonModule": false, - "skipDefaultLibCheck": true, - "skipLibCheck": true, - "forceConsistentCasingInFileNames": true, - "sourceMap": true, "rootDir": "./src", - "types": ["node"] + "outDir": "./dist", }, - "include": ["src"], - "exclude": ["node_modules", "dist"] + "include": [ + "src" + ], } diff --git a/tsconfig.base.json b/tsconfig.base.json new file mode 100644 index 00000000..29e2e46a --- /dev/null +++ b/tsconfig.base.json @@ -0,0 +1,3 @@ +{ + "extends": "@openally/config.typescript" +}