diff --git a/.editorconfig b/.editorconfig index 5c189821..b10e12d4 100644 --- a/.editorconfig +++ b/.editorconfig @@ -67,3 +67,6 @@ trim_trailing_whitespace = unset indent_style = unset indent_size = unset generated_code = true + +[/internal/events/**/*.schema.json] +insert_final_newline = unset diff --git a/.github/workflows/stage-1-commit.yaml b/.github/workflows/stage-1-commit.yaml index a44c8871..a8d6b2fe 100644 --- a/.github/workflows/stage-1-commit.yaml +++ b/.github/workflows/stage-1-commit.yaml @@ -199,3 +199,95 @@ jobs: idp_aws_report_upload_region: "${{ secrets.IDP_AWS_REPORT_UPLOAD_REGION }}" idp_aws_report_upload_role_name: "${{ secrets.IDP_AWS_REPORT_UPLOAD_ROLE_NAME }}" idp_aws_report_upload_bucket_endpoint: "${{ secrets.IDP_AWS_REPORT_UPLOAD_BUCKET_ENDPOINT }}" + + detect-event-schema-package-changes: + name: "Check for changes to event schema package compared to main branch" + runs-on: ubuntu-latest + permissions: + contents: read + outputs: + changed: ${{ steps.check.outputs.changed }} + main_version: ${{ steps.check.outputs.main_version }} + + steps: + - name: "Checkout code" + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Detect package changes and current version + id: check + run: | + git fetch origin main + + if git diff --quiet origin/main...HEAD -- internal/events; then + echo "No changes in event schemas package" + echo "changed=false" >> $GITHUB_OUTPUT + else + echo "Changes detected in event schemas" + echo "changed=true" >> $GITHUB_OUTPUT + fi + + if content=$(git show origin/main:internal/events/schemas/package.json 2>/dev/null); then + version=$(jq -r .version <<< $content); + else + version=null; + fi + + echo "Detected package version $version in main branch" + echo "main_version=$version" >> $GITHUB_OUTPUT + + check-schemas-generated: + name: Check event schemas have been regenerated + needs: detect-event-schema-package-changes + if: needs.detect-event-schema-package-changes.outputs.changed == 'true' + runs-on: ubuntu-latest + permissions: + contents: read + steps: + - name: "Checkout code" + uses: actions/checkout@v4 + + # Simplified caching - template management has more complex caching of installed modules from another build step + - name: "Cache node_modules" + uses: actions/cache@v4 + with: + path: | + **/node_modules + key: ${{ runner.os }}-node-${{ inputs.nodejs_version }}-${{ hashFiles('**/package-lock.json') }} + restore-keys: | + ${{ runner.os }}-node-${{ inputs.nodejs_version }}- + + - name: "Re-generate schemas" + run: | + npm ci --workspace internal/events + npm --workspace internal/events run gen:jsonschema + + - name: Check for schema changes + run: git diff --quiet internal/events/schemas + + check-schema-version-change: + name: Check event schema version has been updated + needs: detect-event-schema-package-changes + if: needs.detect-event-schema-package-changes.outputs.changed == 'true' + runs-on: ubuntu-latest + permissions: + contents: read + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Check schema versions + run: | + source scripts/is_valid_increment.sh + + main_version="${{ needs.detect-event-schema-package-changes.outputs.main_version }}" + echo "Main version: ${{ needs.detect-event-schema-package-changes.outputs.main_version }}" + + local_version=$(jq -r '.version' internal/events/package.json) + echo "Local version: $local_version" + + if ! is_valid_increment "$main_version" "$local_version" ; then + echo "Error: Event Schema package has changed, but new version ($local_version) is not a valid increment from latest version on main branch ($main_version)." + exit 1 + fi diff --git a/eslint.config.mjs b/eslint.config.mjs index 78955cab..c5f57076 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -12,7 +12,7 @@ import unicorn from 'eslint-plugin-unicorn'; import { defineConfig, globalIgnores } from 'eslint/config'; import js from '@eslint/js'; import html from 'eslint-plugin-html'; -import tseslint from '@typescript-eslint/parser'; +import tseslint from 'typescript-eslint'; // Replace plugin-only import with meta package that includes configs import sortDestructureKeys from 'eslint-plugin-sort-destructure-keys'; import { configs as airbnbConfigs, @@ -40,9 +40,15 @@ export default defineConfig([ '**/test-results', '**/playwright-report*', 'eslint.config.mjs', + // newly ignored generated/build artifacts + 'build/**', + 'sdk/**', + 'docs/_site/**', + 'docs/vendor/**', + 'docs/**/*.html', ]), - //imports + // imports importX.flatConfigs.recommended, { rules: { ...airbnbPlugins.importX.rules } }, @@ -66,21 +72,16 @@ export default defineConfig([ }, }, }, - - { - files: ['**/*.json'], - extends: [tseslint.configs.disableTypeChecked], - }, + { files: ['**/*.json'], extends: [tseslint.configs.disableTypeChecked] }, { settings: { 'import-x/resolver-next': [ eslintImportResolverTypescript.createTypeScriptImportResolver({ project: [ - 'frontend/tsconfig.json', 'lambdas/*/tsconfig.json', 'tests/test-team/tsconfig.json', - 'utils/*/tsconfig.json', + 'internal/*/tsconfig.json', ], }), ], @@ -91,10 +92,7 @@ export default defineConfig([ rules: { '@typescript-eslint/no-unused-vars': [ 2, - { - argsIgnorePattern: '^_', - varsIgnorePattern: '^_', - }, + { argsIgnorePattern: '^_', varsIgnorePattern: '^_' }, ], '@typescript-eslint/consistent-type-definitions': 0, }, @@ -107,22 +105,13 @@ export default defineConfig([ 'unicorn/prevent-abbreviations': 0, 'unicorn/filename-case': [ 2, - { - case: 'kebabCase', - ignore: ['.tsx'], - }, + { case: 'kebabCase', ignore: ['.tsx'] }, ], 'unicorn/no-null': 0, 'unicorn/prefer-module': 0, 'unicorn/import-style': [ 2, - { - styles: { - path: { - named: true, - }, - }, - }, + { styles: { path: { named: true } } }, ], }, }, @@ -145,103 +134,54 @@ export default defineConfig([ // jsxA11y { files: ['**/*.{js,mjs,cjs,jsx,mjsx,ts,tsx,mtsx}'], - plugins: { - 'jsx-a11y': jsxA11y, - }, - languageOptions: { - parserOptions: { - ecmaFeatures: { - jsx: true, - }, - }, - }, + plugins: { 'jsx-a11y': jsxA11y }, + languageOptions: { parserOptions: { ecmaFeatures: { jsx: true } } }, }, // security security.configs.recommended, - // sonar sonarjs.configs.recommended, - // html - { - files: ['**/*.html'], - plugins: { html }, - }, - - // Next.js - ...compat.config({ - extends: ['next', 'next/core-web-vitals', 'next/typescript'], - settings: { - next: { - rootDir: 'frontend', - }, - }, - rules: { - // needed because next lint rules look for a pages directory - '@next/next/no-html-link-for-pages': 0, - }, - }), + { files: ['**/*.html'], plugins: { html } }, // json - { - files: ['**/*.json'], - ...json.configs['recommended'], - }, + { files: ['**/*.json'], ...json.configs['recommended'] }, // destructure sorting { name: 'eslint-plugin-sort-destructure-keys', - plugins: { - 'sort-destructure-keys': sortDestructureKeys, - }, - rules: { - 'sort-destructure-keys/sort-destructure-keys': 2, - }, + plugins: { 'sort-destructure-keys': sortDestructureKeys }, + rules: { 'sort-destructure-keys/sort-destructure-keys': 2 }, }, // imports { rules: { - 'sort-imports': [ - 2, - { - ignoreDeclarationSort: true, - }, - ], + 'sort-imports': [2, { ignoreDeclarationSort: true }], 'import-x/extensions': 0, }, }, { files: ['**/*.ts', '**/*.tsx'], - rules: { - 'import-x/no-unresolved': 0, // trust the typescript compiler to catch unresolved imports - }, + rules: { 'import-x/no-unresolved': 0 }, }, { files: ['tests/test-team/**'], rules: { 'import-x/no-extraneous-dependencies': [ 2, - { - devDependencies: true, - }, + { devDependencies: true }, ], }, }, { files: ['**/utils/**', 'tests/test-team/**'], - rules: { - 'import-x/prefer-default-export': 0, - }, + rules: { 'import-x/prefer-default-export': 0 }, }, { - plugins: { - 'no-relative-import-paths': noRelativeImportPaths, - }, - rules: { - 'no-relative-import-paths/no-relative-import-paths': 2, - }, + plugins: { 'no-relative-import-paths': noRelativeImportPaths }, + rules: { 'no-relative-import-paths/no-relative-import-paths': 2 }, }, { files: ['scripts/**'], @@ -253,6 +193,34 @@ export default defineConfig([ }, }, + // js parserOptions override to suppress project service warnings for loose JS files + { + files: ['**/*.js', '**/*.cjs', '**/*.mjs'], + languageOptions: { + parserOptions: { + allowDefaultProject: true, + noWarnOnMultipleProjects: true, // suppress informational warning + }, + }, + }, + // tests: relax package import restriction + { + files: ['**/__test__/**', '**/__tests__/**', '**/*.test.ts', '**/*.test.js'], + rules: { + 'import-x/no-relative-packages': 0, + 'security/detect-non-literal-fs-filename': 0 + }, + }, + + // CLI tools + { + files: ['**/cli/**'], + rules: { + 'no-console': 0, + 'security/detect-non-literal-fs-filename': 0 + }, + }, + // misc rule overrides { rules: { @@ -260,7 +228,9 @@ export default defineConfig([ 'no-underscore-dangle': 0, 'no-await-in-loop': 0, 'no-plusplus': [2, { allowForLoopAfterthoughts: true }], - 'unicorn/prefer-top-level-await': 0, // top level await is not available in commonjs + 'unicorn/prefer-top-level-await': 0, + 'import-x/no-relative-packages': 1, + 'no-relative-import-paths/no-relative-import-paths': 1 }, }, ]); diff --git a/internal/events/.spectral.yaml b/internal/events/.spectral.yaml new file mode 100644 index 00000000..63790cd0 --- /dev/null +++ b/internal/events/.spectral.yaml @@ -0,0 +1 @@ +extends: ["spectral:oas", "spectral:asyncapi", "spectral:arazzo"] diff --git a/internal/events/jest.config.ts b/internal/events/jest.config.ts new file mode 100644 index 00000000..dc227b1b --- /dev/null +++ b/internal/events/jest.config.ts @@ -0,0 +1,10 @@ +export default { + preset: "ts-jest", + testEnvironment: "node", + testMatch: ["**/__tests__/**/*.ts", "**/?(*.)+(spec|test).ts"], + testPathIgnorePatterns: ["/dist/"], + moduleFileExtensions: ["ts", "js", "json", "node"], + transform: { + "^.+\\.ts$": ["ts-jest", { tsconfig: "/tsconfig.jest.json" }], + }, +}; diff --git a/internal/events/package.json b/internal/events/package.json new file mode 100644 index 00000000..f9f1f9d4 --- /dev/null +++ b/internal/events/package.json @@ -0,0 +1,50 @@ +{ + "dependencies": { + "@asyncapi/bundler": "^0.6.4", + "@internal/helpers": "*", + "zod": "^4.1.11" + }, + "description": "Schemas for NHS Notify Supplier API events", + "devDependencies": { + "@stoplight/spectral-cli": "^6.15.0", + "@stylistic/eslint-plugin": "^3.1.0", + "@tsconfig/node22": "^22.0.2", + "@types/jest": "^29.5.14", + "@typescript-eslint/eslint-plugin": "^8.27.0", + "@typescript-eslint/parser": "^8.27.0", + "eslint": "^9.27.0", + "eslint-plugin-jest": "^29.0.1", + "jest": "^29.7.0", + "ts-jest": "^29.4.0", + "ts-node": "^10.9.2", + "typescript": "^5.8.3" + }, + "license": "MIT", + "main": "dist/index.js", + "name": "@nhsdigital/nhs-notify-event-schemas-supplier-api", + "private": true, + "publishConfig": { + "registry": "https://npm.pkg.github.com" + }, + "repository": "git@github.com:NHSDigital/nhs-notify-supplier-api.git", + "scripts": { + "build": "tsc", + "dev": "ts-node src/index.ts", + "gen:asyncapi": "mkdir -p ./dist/asyncapi && ts-node src/cli/bundle-asyncapi.ts", + "gen:jsonschema": "ts-node src/cli/generate-json.ts", + "lint": "npm run lint:node && npm run lint:schema", + "lint:fix": "eslint . --fix", + "lint:node": "eslint .", + "lint:schema": "spectral lint client-config/client-config.yaml", + "prebuild": "rm -rf dist && npm run gen:asyncapi", + "pregen:asyncapi": "npm run gen:jsonschema", + "pregen:jsonschema": "rm -rf ./client-config/json", + "prelint:schema": "npm run gen:jsonschema", + "pretest:unit": "npm run gen:jsonschema", + "start": "node dist/index.js", + "test": "npm run test:unit", + "test:unit": "jest" + }, + "types": "dist/index.d.ts", + "version": "1.0.0" +} diff --git a/internal/events/schemas/domain/letter.schema.json b/internal/events/schemas/domain/letter.schema.json new file mode 100644 index 00000000..e9c1dbb0 --- /dev/null +++ b/internal/events/schemas/domain/letter.schema.json @@ -0,0 +1,113 @@ +{ + "type": "object", + "properties": { + "domainId": { + "type": "string" + }, + "origin": { + "title": "Letter origin", + "description": "Identifiers captured from the original event that introduced the letter to the supplier-api domain.\n\nThe identifier will be included as the origin domain in the subject of any corresponding events emitted by the supplier-api domain.", + "examples": [ + { + "domain": "letter-rendering", + "subject": "customer/00f3b388-bbe9-41c9-9e76-052d37ee8988/letter-rendering/letter-request/0o5Fs0EELR0fUjHjbCnEtdUwQe4_0o5Fs0EELR0fUjHjbCnEtdUwQe5", + "event": "00f3b388-bbe9-41c9-9e76-052d37ee8988" + } + ], + "type": "object", + "properties": { + "domain": { + "title": "Domain ID", + "description": "The domain which requested this letter", + "type": "string" + }, + "source": { + "title": "Event source", + "description": "The source of the event which created this letter", + "type": "string" + }, + "subject": { + "title": "Event subject", + "description": "The subject of the event which created this letter, scoped to source", + "type": "string" + }, + "event": { + "title": "Event ID", + "description": "The ID of the event which created this letter", + "type": "string" + } + }, + "required": [ + "domain", + "source", + "subject", + "event" + ] + }, + "specificationId": { + "title": "Specification ID", + "description": "Reference to the letter specification which was used to produce a letter pack for this request.", + "examples": [ + "1y3q9v1zzzz" + ], + "type": "string" + }, + "groupId": { + "title": "Group ID", + "description": "Identifier for the group which this letter assigned to for reporting purposes.", + "examples": [ + "client_template", + "00f3b388-bbe9-41c9-9e76-052d37ee8988_20a1ab22-6136-47ae-ac0f-989f382be8df" + ], + "type": "string" + }, + "status": { + "title": "Letter Status", + "description": "The status of a letter in the supplier-api domain.", + "examples": [ + "ACCEPTED", + "REJECTED", + "PRINTED" + ], + "type": "string", + "enum": [ + "PENDING", + "ACCEPTED", + "REJECTED", + "PRINTED", + "ENCLOSED", + "CANCELLED", + "DISPATCHED", + "FAILED", + "RETURNED", + "FORWARDED", + "DELIVERED" + ] + }, + "reasonCode": { + "title": "Reason Code", + "description": "Optional reason code for the status change, if applicable.", + "examples": [ + "R01", + "R08" + ], + "type": "string" + }, + "reasonText": { + "title": "Reason Text", + "description": "Optional human-readable reason for the status change, if applicable.", + "examples": [ + "Undeliverable", + "Recipient moved" + ], + "type": "string" + } + }, + "required": [ + "domainId", + "origin", + "specificationId", + "groupId", + "status" + ] +} \ No newline at end of file diff --git a/internal/events/schemas/events/letter.ACCEPTED.schema.json b/internal/events/schemas/events/letter.ACCEPTED.schema.json new file mode 100644 index 00000000..61d11fe6 --- /dev/null +++ b/internal/events/schemas/events/letter.ACCEPTED.schema.json @@ -0,0 +1,329 @@ +{ + "title": "letter.ACCEPTED Event", + "description": "Event schema for letter status change to ACCEPTED", + "type": "object", + "properties": { + "specversion": { + "title": "CloudEvents spec version", + "description": "CloudEvents specification version (fixed to 1.0).", + "examples": [ + "1.0" + ], + "type": "string", + "enum": [ + "1.0" + ] + }, + "id": { + "title": "Event ID", + "description": "Unique identifier for this event instance (UUID).", + "examples": [ + "6f1c2a53-3d54-4a0a-9a0b-0e9ae2d4c111" + ], + "type": "string", + "minLength": 1, + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" + }, + "source": { + "title": "Event Source", + "description": "Logical event producer path within the supplier-api domain", + "type": "string", + "pattern": "^\\/data-plane\\/supplier-api(?:\\/.*)?$" + }, + "subject": { + "title": "Event Subject", + "description": "Resource path (no leading slash) within the source made of segments separated by '/'.", + "examples": [ + "letter-origin/letter-rendering/letter/f47ac10b-58cc-4372-a567-0e02b2c3d479" + ], + "type": "string", + "pattern": "^letter-origin\\/[a-z0-9-]+\\/letter\\/[^/]+(?:\\/.*)?" + }, + "type": { + "title": "Letter ACCEPTED event type", + "description": "Event type using reverse-DNS style", + "examples": [ + "uk.nhs.notify.supplier-api.letter.ACCEPTED.v1" + ], + "type": "string", + "enum": [ + "uk.nhs.notify.supplier-api.letter.ACCEPTED.v1" + ] + }, + "time": { + "title": "Event Time", + "description": "Timestamp when the event occurred (RFC 3339).", + "examples": [ + "2025-10-01T10:15:30.000Z" + ], + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" + }, + "datacontenttype": { + "title": "Data Content Type", + "description": "Media type for the data field (fixed to application/json).", + "examples": [ + "application/json" + ], + "type": "string", + "enum": [ + "application/json" + ] + }, + "dataschema": { + "title": "Data Schema URI", + "description": "URI of a schema that describes the event data\n\nData schema version must match the major version indicated by the type", + "examples": [ + "https://notify.nhs.uk/cloudevents/schemas/supplier-api/letter.ACCEPTED.1.0.0.schema.json" + ], + "type": "string", + "pattern": "^https:\\/\\/notify\\.nhs\\.uk\\/cloudevents\\/schemas\\/supplier-api\\/letter.ACCEPTED.1\\.\\d+\\.\\d+\\.schema.json$" + }, + "data": { + "type": "object", + "properties": { + "domainId": { + "type": "string" + }, + "origin": { + "title": "Letter origin", + "description": "Identifiers captured from the original event that introduced the letter to the supplier-api domain.\n\nThe identifier will be included as the origin domain in the subject of any corresponding events emitted by the supplier-api domain.", + "examples": [ + { + "domain": "letter-rendering", + "subject": "customer/00f3b388-bbe9-41c9-9e76-052d37ee8988/letter-rendering/letter-request/0o5Fs0EELR0fUjHjbCnEtdUwQe4_0o5Fs0EELR0fUjHjbCnEtdUwQe5", + "event": "00f3b388-bbe9-41c9-9e76-052d37ee8988" + } + ], + "type": "object", + "properties": { + "domain": { + "title": "Domain ID", + "description": "The domain which requested this letter", + "type": "string" + }, + "source": { + "title": "Event source", + "description": "The source of the event which created this letter", + "type": "string" + }, + "subject": { + "title": "Event subject", + "description": "The subject of the event which created this letter, scoped to source", + "type": "string" + }, + "event": { + "title": "Event ID", + "description": "The ID of the event which created this letter", + "type": "string" + } + }, + "required": [ + "domain", + "source", + "subject", + "event" + ] + }, + "specificationId": { + "title": "Specification ID", + "description": "Reference to the letter specification which was used to produce a letter pack for this request.", + "examples": [ + "1y3q9v1zzzz" + ], + "type": "string" + }, + "groupId": { + "title": "Group ID", + "description": "Identifier for the group which this letter assigned to for reporting purposes.", + "examples": [ + "client_template", + "00f3b388-bbe9-41c9-9e76-052d37ee8988_20a1ab22-6136-47ae-ac0f-989f382be8df" + ], + "type": "string" + }, + "status": { + "type": "string", + "enum": [ + "ACCEPTED" + ] + }, + "reasonCode": { + "title": "Reason Code", + "description": "Optional reason code for the status change, if applicable.", + "examples": [ + "R01", + "R08" + ], + "type": "string" + }, + "reasonText": { + "title": "Reason Text", + "description": "Optional human-readable reason for the status change, if applicable.", + "examples": [ + "Undeliverable", + "Recipient moved" + ], + "type": "string" + } + }, + "required": [ + "domainId", + "origin", + "specificationId", + "groupId", + "status" + ] + }, + "traceparent": { + "title": "Traceparent", + "description": "W3C Trace Context traceparent header value.", + "examples": [ + "00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01" + ], + "type": "string", + "minLength": 1, + "pattern": "^00-[0-9a-f]{32}-[0-9a-f]{16}-[0-9a-f]{2}$" + }, + "tracestate": { + "title": "Tracestate", + "description": "Optional W3C Trace Context tracestate header value.", + "examples": [ + "rojo=00f067aa0ba902b7,congo=t61rcWkgMzE" + ], + "type": "string" + }, + "partitionkey": { + "title": "Partition Key", + "description": "Partition / ordering key (lowercase alphanumerics and hyphen, 1-64 chars).", + "examples": [ + "customer-920fca11" + ], + "type": "string", + "minLength": 1, + "maxLength": 64, + "pattern": "^[a-z0-9-]+$" + }, + "recordedtime": { + "title": "Recorded Time", + "description": "Timestamp when the event was recorded/persisted (should be >= time).", + "examples": [ + "2025-10-01T10:15:30.250Z" + ], + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" + }, + "sampledrate": { + "title": "Sampled Rate", + "description": "Sampling factor: number of similar occurrences this event represents.", + "examples": [ + 5 + ], + "type": "integer", + "minimum": 1, + "maximum": 9007199254740991 + }, + "sequence": { + "title": "Sequence", + "description": "Zero-padded 20 digit numeric sequence (lexicographically sortable).", + "examples": [ + "00000000000000000042" + ], + "type": "string", + "pattern": "^\\d{20}$" + }, + "severitytext": { + "title": "Severity Text", + "description": "Log severity level name.", + "examples": [ + "DEBUG" + ], + "type": "string", + "enum": [ + "TRACE", + "DEBUG", + "INFO", + "WARN", + "ERROR", + "FATAL" + ] + }, + "severitynumber": { + "title": "Severity Number", + "description": "Numeric severity (TRACE=0, DEBUG=1, INFO=2, WARN=3, ERROR=4, FATAL=5).", + "examples": [ + 1 + ], + "type": "integer", + "minimum": 0, + "maximum": 5 + }, + "dataclassification": { + "title": "Data Classification", + "description": "Data sensitivity classification.", + "examples": [ + "restricted" + ], + "type": "string", + "enum": [ + "public", + "internal", + "confidential", + "restricted" + ] + }, + "dataregulation": { + "title": "Data Regulation", + "description": "Regulatory regime tag applied to this data.", + "examples": [ + "ISO-27001" + ], + "type": "string", + "enum": [ + "GDPR", + "HIPAA", + "PCI-DSS", + "ISO-27001", + "NIST-800-53", + "CCPA" + ] + }, + "datacategory": { + "title": "Data Category", + "description": "Data category classification (e.g. standard, special-category).", + "examples": [ + "sensitive" + ], + "type": "string", + "enum": [ + "non-sensitive", + "standard", + "sensitive", + "special-category" + ] + }, + "dataschemaversion": { + "title": "Data Schema Version", + "description": "Matches semantic versioning format with fixed major version (Not part of cloudevents spec?)", + "type": "string", + "pattern": "^1\\.\\d+\\.\\d+$" + } + }, + "required": [ + "specversion", + "id", + "source", + "subject", + "type", + "time", + "dataschema", + "data", + "traceparent", + "recordedtime", + "severitynumber", + "dataschemaversion" + ] +} \ No newline at end of file diff --git a/internal/events/schemas/events/letter.CANCELLED.schema.json b/internal/events/schemas/events/letter.CANCELLED.schema.json new file mode 100644 index 00000000..c276b168 --- /dev/null +++ b/internal/events/schemas/events/letter.CANCELLED.schema.json @@ -0,0 +1,329 @@ +{ + "title": "letter.CANCELLED Event", + "description": "Event schema for letter status change to CANCELLED", + "type": "object", + "properties": { + "specversion": { + "title": "CloudEvents spec version", + "description": "CloudEvents specification version (fixed to 1.0).", + "examples": [ + "1.0" + ], + "type": "string", + "enum": [ + "1.0" + ] + }, + "id": { + "title": "Event ID", + "description": "Unique identifier for this event instance (UUID).", + "examples": [ + "6f1c2a53-3d54-4a0a-9a0b-0e9ae2d4c111" + ], + "type": "string", + "minLength": 1, + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" + }, + "source": { + "title": "Event Source", + "description": "Logical event producer path within the supplier-api domain", + "type": "string", + "pattern": "^\\/data-plane\\/supplier-api(?:\\/.*)?$" + }, + "subject": { + "title": "Event Subject", + "description": "Resource path (no leading slash) within the source made of segments separated by '/'.", + "examples": [ + "letter-origin/letter-rendering/letter/f47ac10b-58cc-4372-a567-0e02b2c3d479" + ], + "type": "string", + "pattern": "^letter-origin\\/[a-z0-9-]+\\/letter\\/[^/]+(?:\\/.*)?" + }, + "type": { + "title": "Letter CANCELLED event type", + "description": "Event type using reverse-DNS style", + "examples": [ + "uk.nhs.notify.supplier-api.letter.CANCELLED.v1" + ], + "type": "string", + "enum": [ + "uk.nhs.notify.supplier-api.letter.CANCELLED.v1" + ] + }, + "time": { + "title": "Event Time", + "description": "Timestamp when the event occurred (RFC 3339).", + "examples": [ + "2025-10-01T10:15:30.000Z" + ], + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" + }, + "datacontenttype": { + "title": "Data Content Type", + "description": "Media type for the data field (fixed to application/json).", + "examples": [ + "application/json" + ], + "type": "string", + "enum": [ + "application/json" + ] + }, + "dataschema": { + "title": "Data Schema URI", + "description": "URI of a schema that describes the event data\n\nData schema version must match the major version indicated by the type", + "examples": [ + "https://notify.nhs.uk/cloudevents/schemas/supplier-api/letter.ACCEPTED.1.0.0.schema.json" + ], + "type": "string", + "pattern": "^https:\\/\\/notify\\.nhs\\.uk\\/cloudevents\\/schemas\\/supplier-api\\/letter.CANCELLED.1\\.\\d+\\.\\d+\\.schema.json$" + }, + "data": { + "type": "object", + "properties": { + "domainId": { + "type": "string" + }, + "origin": { + "title": "Letter origin", + "description": "Identifiers captured from the original event that introduced the letter to the supplier-api domain.\n\nThe identifier will be included as the origin domain in the subject of any corresponding events emitted by the supplier-api domain.", + "examples": [ + { + "domain": "letter-rendering", + "subject": "customer/00f3b388-bbe9-41c9-9e76-052d37ee8988/letter-rendering/letter-request/0o5Fs0EELR0fUjHjbCnEtdUwQe4_0o5Fs0EELR0fUjHjbCnEtdUwQe5", + "event": "00f3b388-bbe9-41c9-9e76-052d37ee8988" + } + ], + "type": "object", + "properties": { + "domain": { + "title": "Domain ID", + "description": "The domain which requested this letter", + "type": "string" + }, + "source": { + "title": "Event source", + "description": "The source of the event which created this letter", + "type": "string" + }, + "subject": { + "title": "Event subject", + "description": "The subject of the event which created this letter, scoped to source", + "type": "string" + }, + "event": { + "title": "Event ID", + "description": "The ID of the event which created this letter", + "type": "string" + } + }, + "required": [ + "domain", + "source", + "subject", + "event" + ] + }, + "specificationId": { + "title": "Specification ID", + "description": "Reference to the letter specification which was used to produce a letter pack for this request.", + "examples": [ + "1y3q9v1zzzz" + ], + "type": "string" + }, + "groupId": { + "title": "Group ID", + "description": "Identifier for the group which this letter assigned to for reporting purposes.", + "examples": [ + "client_template", + "00f3b388-bbe9-41c9-9e76-052d37ee8988_20a1ab22-6136-47ae-ac0f-989f382be8df" + ], + "type": "string" + }, + "status": { + "type": "string", + "enum": [ + "CANCELLED" + ] + }, + "reasonCode": { + "title": "Reason Code", + "description": "Optional reason code for the status change, if applicable.", + "examples": [ + "R01", + "R08" + ], + "type": "string" + }, + "reasonText": { + "title": "Reason Text", + "description": "Optional human-readable reason for the status change, if applicable.", + "examples": [ + "Undeliverable", + "Recipient moved" + ], + "type": "string" + } + }, + "required": [ + "domainId", + "origin", + "specificationId", + "groupId", + "status" + ] + }, + "traceparent": { + "title": "Traceparent", + "description": "W3C Trace Context traceparent header value.", + "examples": [ + "00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01" + ], + "type": "string", + "minLength": 1, + "pattern": "^00-[0-9a-f]{32}-[0-9a-f]{16}-[0-9a-f]{2}$" + }, + "tracestate": { + "title": "Tracestate", + "description": "Optional W3C Trace Context tracestate header value.", + "examples": [ + "rojo=00f067aa0ba902b7,congo=t61rcWkgMzE" + ], + "type": "string" + }, + "partitionkey": { + "title": "Partition Key", + "description": "Partition / ordering key (lowercase alphanumerics and hyphen, 1-64 chars).", + "examples": [ + "customer-920fca11" + ], + "type": "string", + "minLength": 1, + "maxLength": 64, + "pattern": "^[a-z0-9-]+$" + }, + "recordedtime": { + "title": "Recorded Time", + "description": "Timestamp when the event was recorded/persisted (should be >= time).", + "examples": [ + "2025-10-01T10:15:30.250Z" + ], + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" + }, + "sampledrate": { + "title": "Sampled Rate", + "description": "Sampling factor: number of similar occurrences this event represents.", + "examples": [ + 5 + ], + "type": "integer", + "minimum": 1, + "maximum": 9007199254740991 + }, + "sequence": { + "title": "Sequence", + "description": "Zero-padded 20 digit numeric sequence (lexicographically sortable).", + "examples": [ + "00000000000000000042" + ], + "type": "string", + "pattern": "^\\d{20}$" + }, + "severitytext": { + "title": "Severity Text", + "description": "Log severity level name.", + "examples": [ + "DEBUG" + ], + "type": "string", + "enum": [ + "TRACE", + "DEBUG", + "INFO", + "WARN", + "ERROR", + "FATAL" + ] + }, + "severitynumber": { + "title": "Severity Number", + "description": "Numeric severity (TRACE=0, DEBUG=1, INFO=2, WARN=3, ERROR=4, FATAL=5).", + "examples": [ + 1 + ], + "type": "integer", + "minimum": 0, + "maximum": 5 + }, + "dataclassification": { + "title": "Data Classification", + "description": "Data sensitivity classification.", + "examples": [ + "restricted" + ], + "type": "string", + "enum": [ + "public", + "internal", + "confidential", + "restricted" + ] + }, + "dataregulation": { + "title": "Data Regulation", + "description": "Regulatory regime tag applied to this data.", + "examples": [ + "ISO-27001" + ], + "type": "string", + "enum": [ + "GDPR", + "HIPAA", + "PCI-DSS", + "ISO-27001", + "NIST-800-53", + "CCPA" + ] + }, + "datacategory": { + "title": "Data Category", + "description": "Data category classification (e.g. standard, special-category).", + "examples": [ + "sensitive" + ], + "type": "string", + "enum": [ + "non-sensitive", + "standard", + "sensitive", + "special-category" + ] + }, + "dataschemaversion": { + "title": "Data Schema Version", + "description": "Matches semantic versioning format with fixed major version (Not part of cloudevents spec?)", + "type": "string", + "pattern": "^1\\.\\d+\\.\\d+$" + } + }, + "required": [ + "specversion", + "id", + "source", + "subject", + "type", + "time", + "dataschema", + "data", + "traceparent", + "recordedtime", + "severitynumber", + "dataschemaversion" + ] +} \ No newline at end of file diff --git a/internal/events/schemas/events/letter.DELIVERED.schema.json b/internal/events/schemas/events/letter.DELIVERED.schema.json new file mode 100644 index 00000000..62faa382 --- /dev/null +++ b/internal/events/schemas/events/letter.DELIVERED.schema.json @@ -0,0 +1,329 @@ +{ + "title": "letter.DELIVERED Event", + "description": "Event schema for letter status change to DELIVERED", + "type": "object", + "properties": { + "specversion": { + "title": "CloudEvents spec version", + "description": "CloudEvents specification version (fixed to 1.0).", + "examples": [ + "1.0" + ], + "type": "string", + "enum": [ + "1.0" + ] + }, + "id": { + "title": "Event ID", + "description": "Unique identifier for this event instance (UUID).", + "examples": [ + "6f1c2a53-3d54-4a0a-9a0b-0e9ae2d4c111" + ], + "type": "string", + "minLength": 1, + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" + }, + "source": { + "title": "Event Source", + "description": "Logical event producer path within the supplier-api domain", + "type": "string", + "pattern": "^\\/data-plane\\/supplier-api(?:\\/.*)?$" + }, + "subject": { + "title": "Event Subject", + "description": "Resource path (no leading slash) within the source made of segments separated by '/'.", + "examples": [ + "letter-origin/letter-rendering/letter/f47ac10b-58cc-4372-a567-0e02b2c3d479" + ], + "type": "string", + "pattern": "^letter-origin\\/[a-z0-9-]+\\/letter\\/[^/]+(?:\\/.*)?" + }, + "type": { + "title": "Letter DELIVERED event type", + "description": "Event type using reverse-DNS style", + "examples": [ + "uk.nhs.notify.supplier-api.letter.DELIVERED.v1" + ], + "type": "string", + "enum": [ + "uk.nhs.notify.supplier-api.letter.DELIVERED.v1" + ] + }, + "time": { + "title": "Event Time", + "description": "Timestamp when the event occurred (RFC 3339).", + "examples": [ + "2025-10-01T10:15:30.000Z" + ], + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" + }, + "datacontenttype": { + "title": "Data Content Type", + "description": "Media type for the data field (fixed to application/json).", + "examples": [ + "application/json" + ], + "type": "string", + "enum": [ + "application/json" + ] + }, + "dataschema": { + "title": "Data Schema URI", + "description": "URI of a schema that describes the event data\n\nData schema version must match the major version indicated by the type", + "examples": [ + "https://notify.nhs.uk/cloudevents/schemas/supplier-api/letter.ACCEPTED.1.0.0.schema.json" + ], + "type": "string", + "pattern": "^https:\\/\\/notify\\.nhs\\.uk\\/cloudevents\\/schemas\\/supplier-api\\/letter.DELIVERED.1\\.\\d+\\.\\d+\\.schema.json$" + }, + "data": { + "type": "object", + "properties": { + "domainId": { + "type": "string" + }, + "origin": { + "title": "Letter origin", + "description": "Identifiers captured from the original event that introduced the letter to the supplier-api domain.\n\nThe identifier will be included as the origin domain in the subject of any corresponding events emitted by the supplier-api domain.", + "examples": [ + { + "domain": "letter-rendering", + "subject": "customer/00f3b388-bbe9-41c9-9e76-052d37ee8988/letter-rendering/letter-request/0o5Fs0EELR0fUjHjbCnEtdUwQe4_0o5Fs0EELR0fUjHjbCnEtdUwQe5", + "event": "00f3b388-bbe9-41c9-9e76-052d37ee8988" + } + ], + "type": "object", + "properties": { + "domain": { + "title": "Domain ID", + "description": "The domain which requested this letter", + "type": "string" + }, + "source": { + "title": "Event source", + "description": "The source of the event which created this letter", + "type": "string" + }, + "subject": { + "title": "Event subject", + "description": "The subject of the event which created this letter, scoped to source", + "type": "string" + }, + "event": { + "title": "Event ID", + "description": "The ID of the event which created this letter", + "type": "string" + } + }, + "required": [ + "domain", + "source", + "subject", + "event" + ] + }, + "specificationId": { + "title": "Specification ID", + "description": "Reference to the letter specification which was used to produce a letter pack for this request.", + "examples": [ + "1y3q9v1zzzz" + ], + "type": "string" + }, + "groupId": { + "title": "Group ID", + "description": "Identifier for the group which this letter assigned to for reporting purposes.", + "examples": [ + "client_template", + "00f3b388-bbe9-41c9-9e76-052d37ee8988_20a1ab22-6136-47ae-ac0f-989f382be8df" + ], + "type": "string" + }, + "status": { + "type": "string", + "enum": [ + "DELIVERED" + ] + }, + "reasonCode": { + "title": "Reason Code", + "description": "Optional reason code for the status change, if applicable.", + "examples": [ + "R01", + "R08" + ], + "type": "string" + }, + "reasonText": { + "title": "Reason Text", + "description": "Optional human-readable reason for the status change, if applicable.", + "examples": [ + "Undeliverable", + "Recipient moved" + ], + "type": "string" + } + }, + "required": [ + "domainId", + "origin", + "specificationId", + "groupId", + "status" + ] + }, + "traceparent": { + "title": "Traceparent", + "description": "W3C Trace Context traceparent header value.", + "examples": [ + "00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01" + ], + "type": "string", + "minLength": 1, + "pattern": "^00-[0-9a-f]{32}-[0-9a-f]{16}-[0-9a-f]{2}$" + }, + "tracestate": { + "title": "Tracestate", + "description": "Optional W3C Trace Context tracestate header value.", + "examples": [ + "rojo=00f067aa0ba902b7,congo=t61rcWkgMzE" + ], + "type": "string" + }, + "partitionkey": { + "title": "Partition Key", + "description": "Partition / ordering key (lowercase alphanumerics and hyphen, 1-64 chars).", + "examples": [ + "customer-920fca11" + ], + "type": "string", + "minLength": 1, + "maxLength": 64, + "pattern": "^[a-z0-9-]+$" + }, + "recordedtime": { + "title": "Recorded Time", + "description": "Timestamp when the event was recorded/persisted (should be >= time).", + "examples": [ + "2025-10-01T10:15:30.250Z" + ], + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" + }, + "sampledrate": { + "title": "Sampled Rate", + "description": "Sampling factor: number of similar occurrences this event represents.", + "examples": [ + 5 + ], + "type": "integer", + "minimum": 1, + "maximum": 9007199254740991 + }, + "sequence": { + "title": "Sequence", + "description": "Zero-padded 20 digit numeric sequence (lexicographically sortable).", + "examples": [ + "00000000000000000042" + ], + "type": "string", + "pattern": "^\\d{20}$" + }, + "severitytext": { + "title": "Severity Text", + "description": "Log severity level name.", + "examples": [ + "DEBUG" + ], + "type": "string", + "enum": [ + "TRACE", + "DEBUG", + "INFO", + "WARN", + "ERROR", + "FATAL" + ] + }, + "severitynumber": { + "title": "Severity Number", + "description": "Numeric severity (TRACE=0, DEBUG=1, INFO=2, WARN=3, ERROR=4, FATAL=5).", + "examples": [ + 1 + ], + "type": "integer", + "minimum": 0, + "maximum": 5 + }, + "dataclassification": { + "title": "Data Classification", + "description": "Data sensitivity classification.", + "examples": [ + "restricted" + ], + "type": "string", + "enum": [ + "public", + "internal", + "confidential", + "restricted" + ] + }, + "dataregulation": { + "title": "Data Regulation", + "description": "Regulatory regime tag applied to this data.", + "examples": [ + "ISO-27001" + ], + "type": "string", + "enum": [ + "GDPR", + "HIPAA", + "PCI-DSS", + "ISO-27001", + "NIST-800-53", + "CCPA" + ] + }, + "datacategory": { + "title": "Data Category", + "description": "Data category classification (e.g. standard, special-category).", + "examples": [ + "sensitive" + ], + "type": "string", + "enum": [ + "non-sensitive", + "standard", + "sensitive", + "special-category" + ] + }, + "dataschemaversion": { + "title": "Data Schema Version", + "description": "Matches semantic versioning format with fixed major version (Not part of cloudevents spec?)", + "type": "string", + "pattern": "^1\\.\\d+\\.\\d+$" + } + }, + "required": [ + "specversion", + "id", + "source", + "subject", + "type", + "time", + "dataschema", + "data", + "traceparent", + "recordedtime", + "severitynumber", + "dataschemaversion" + ] +} \ No newline at end of file diff --git a/internal/events/schemas/events/letter.DISPATCHED.schema.json b/internal/events/schemas/events/letter.DISPATCHED.schema.json new file mode 100644 index 00000000..6ada6b74 --- /dev/null +++ b/internal/events/schemas/events/letter.DISPATCHED.schema.json @@ -0,0 +1,329 @@ +{ + "title": "letter.DISPATCHED Event", + "description": "Event schema for letter status change to DISPATCHED", + "type": "object", + "properties": { + "specversion": { + "title": "CloudEvents spec version", + "description": "CloudEvents specification version (fixed to 1.0).", + "examples": [ + "1.0" + ], + "type": "string", + "enum": [ + "1.0" + ] + }, + "id": { + "title": "Event ID", + "description": "Unique identifier for this event instance (UUID).", + "examples": [ + "6f1c2a53-3d54-4a0a-9a0b-0e9ae2d4c111" + ], + "type": "string", + "minLength": 1, + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" + }, + "source": { + "title": "Event Source", + "description": "Logical event producer path within the supplier-api domain", + "type": "string", + "pattern": "^\\/data-plane\\/supplier-api(?:\\/.*)?$" + }, + "subject": { + "title": "Event Subject", + "description": "Resource path (no leading slash) within the source made of segments separated by '/'.", + "examples": [ + "letter-origin/letter-rendering/letter/f47ac10b-58cc-4372-a567-0e02b2c3d479" + ], + "type": "string", + "pattern": "^letter-origin\\/[a-z0-9-]+\\/letter\\/[^/]+(?:\\/.*)?" + }, + "type": { + "title": "Letter DISPATCHED event type", + "description": "Event type using reverse-DNS style", + "examples": [ + "uk.nhs.notify.supplier-api.letter.DISPATCHED.v1" + ], + "type": "string", + "enum": [ + "uk.nhs.notify.supplier-api.letter.DISPATCHED.v1" + ] + }, + "time": { + "title": "Event Time", + "description": "Timestamp when the event occurred (RFC 3339).", + "examples": [ + "2025-10-01T10:15:30.000Z" + ], + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" + }, + "datacontenttype": { + "title": "Data Content Type", + "description": "Media type for the data field (fixed to application/json).", + "examples": [ + "application/json" + ], + "type": "string", + "enum": [ + "application/json" + ] + }, + "dataschema": { + "title": "Data Schema URI", + "description": "URI of a schema that describes the event data\n\nData schema version must match the major version indicated by the type", + "examples": [ + "https://notify.nhs.uk/cloudevents/schemas/supplier-api/letter.ACCEPTED.1.0.0.schema.json" + ], + "type": "string", + "pattern": "^https:\\/\\/notify\\.nhs\\.uk\\/cloudevents\\/schemas\\/supplier-api\\/letter.DISPATCHED.1\\.\\d+\\.\\d+\\.schema.json$" + }, + "data": { + "type": "object", + "properties": { + "domainId": { + "type": "string" + }, + "origin": { + "title": "Letter origin", + "description": "Identifiers captured from the original event that introduced the letter to the supplier-api domain.\n\nThe identifier will be included as the origin domain in the subject of any corresponding events emitted by the supplier-api domain.", + "examples": [ + { + "domain": "letter-rendering", + "subject": "customer/00f3b388-bbe9-41c9-9e76-052d37ee8988/letter-rendering/letter-request/0o5Fs0EELR0fUjHjbCnEtdUwQe4_0o5Fs0EELR0fUjHjbCnEtdUwQe5", + "event": "00f3b388-bbe9-41c9-9e76-052d37ee8988" + } + ], + "type": "object", + "properties": { + "domain": { + "title": "Domain ID", + "description": "The domain which requested this letter", + "type": "string" + }, + "source": { + "title": "Event source", + "description": "The source of the event which created this letter", + "type": "string" + }, + "subject": { + "title": "Event subject", + "description": "The subject of the event which created this letter, scoped to source", + "type": "string" + }, + "event": { + "title": "Event ID", + "description": "The ID of the event which created this letter", + "type": "string" + } + }, + "required": [ + "domain", + "source", + "subject", + "event" + ] + }, + "specificationId": { + "title": "Specification ID", + "description": "Reference to the letter specification which was used to produce a letter pack for this request.", + "examples": [ + "1y3q9v1zzzz" + ], + "type": "string" + }, + "groupId": { + "title": "Group ID", + "description": "Identifier for the group which this letter assigned to for reporting purposes.", + "examples": [ + "client_template", + "00f3b388-bbe9-41c9-9e76-052d37ee8988_20a1ab22-6136-47ae-ac0f-989f382be8df" + ], + "type": "string" + }, + "status": { + "type": "string", + "enum": [ + "DISPATCHED" + ] + }, + "reasonCode": { + "title": "Reason Code", + "description": "Optional reason code for the status change, if applicable.", + "examples": [ + "R01", + "R08" + ], + "type": "string" + }, + "reasonText": { + "title": "Reason Text", + "description": "Optional human-readable reason for the status change, if applicable.", + "examples": [ + "Undeliverable", + "Recipient moved" + ], + "type": "string" + } + }, + "required": [ + "domainId", + "origin", + "specificationId", + "groupId", + "status" + ] + }, + "traceparent": { + "title": "Traceparent", + "description": "W3C Trace Context traceparent header value.", + "examples": [ + "00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01" + ], + "type": "string", + "minLength": 1, + "pattern": "^00-[0-9a-f]{32}-[0-9a-f]{16}-[0-9a-f]{2}$" + }, + "tracestate": { + "title": "Tracestate", + "description": "Optional W3C Trace Context tracestate header value.", + "examples": [ + "rojo=00f067aa0ba902b7,congo=t61rcWkgMzE" + ], + "type": "string" + }, + "partitionkey": { + "title": "Partition Key", + "description": "Partition / ordering key (lowercase alphanumerics and hyphen, 1-64 chars).", + "examples": [ + "customer-920fca11" + ], + "type": "string", + "minLength": 1, + "maxLength": 64, + "pattern": "^[a-z0-9-]+$" + }, + "recordedtime": { + "title": "Recorded Time", + "description": "Timestamp when the event was recorded/persisted (should be >= time).", + "examples": [ + "2025-10-01T10:15:30.250Z" + ], + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" + }, + "sampledrate": { + "title": "Sampled Rate", + "description": "Sampling factor: number of similar occurrences this event represents.", + "examples": [ + 5 + ], + "type": "integer", + "minimum": 1, + "maximum": 9007199254740991 + }, + "sequence": { + "title": "Sequence", + "description": "Zero-padded 20 digit numeric sequence (lexicographically sortable).", + "examples": [ + "00000000000000000042" + ], + "type": "string", + "pattern": "^\\d{20}$" + }, + "severitytext": { + "title": "Severity Text", + "description": "Log severity level name.", + "examples": [ + "DEBUG" + ], + "type": "string", + "enum": [ + "TRACE", + "DEBUG", + "INFO", + "WARN", + "ERROR", + "FATAL" + ] + }, + "severitynumber": { + "title": "Severity Number", + "description": "Numeric severity (TRACE=0, DEBUG=1, INFO=2, WARN=3, ERROR=4, FATAL=5).", + "examples": [ + 1 + ], + "type": "integer", + "minimum": 0, + "maximum": 5 + }, + "dataclassification": { + "title": "Data Classification", + "description": "Data sensitivity classification.", + "examples": [ + "restricted" + ], + "type": "string", + "enum": [ + "public", + "internal", + "confidential", + "restricted" + ] + }, + "dataregulation": { + "title": "Data Regulation", + "description": "Regulatory regime tag applied to this data.", + "examples": [ + "ISO-27001" + ], + "type": "string", + "enum": [ + "GDPR", + "HIPAA", + "PCI-DSS", + "ISO-27001", + "NIST-800-53", + "CCPA" + ] + }, + "datacategory": { + "title": "Data Category", + "description": "Data category classification (e.g. standard, special-category).", + "examples": [ + "sensitive" + ], + "type": "string", + "enum": [ + "non-sensitive", + "standard", + "sensitive", + "special-category" + ] + }, + "dataschemaversion": { + "title": "Data Schema Version", + "description": "Matches semantic versioning format with fixed major version (Not part of cloudevents spec?)", + "type": "string", + "pattern": "^1\\.\\d+\\.\\d+$" + } + }, + "required": [ + "specversion", + "id", + "source", + "subject", + "type", + "time", + "dataschema", + "data", + "traceparent", + "recordedtime", + "severitynumber", + "dataschemaversion" + ] +} \ No newline at end of file diff --git a/internal/events/schemas/events/letter.ENCLOSED.schema.json b/internal/events/schemas/events/letter.ENCLOSED.schema.json new file mode 100644 index 00000000..ea0c9a8d --- /dev/null +++ b/internal/events/schemas/events/letter.ENCLOSED.schema.json @@ -0,0 +1,329 @@ +{ + "title": "letter.ENCLOSED Event", + "description": "Event schema for letter status change to ENCLOSED", + "type": "object", + "properties": { + "specversion": { + "title": "CloudEvents spec version", + "description": "CloudEvents specification version (fixed to 1.0).", + "examples": [ + "1.0" + ], + "type": "string", + "enum": [ + "1.0" + ] + }, + "id": { + "title": "Event ID", + "description": "Unique identifier for this event instance (UUID).", + "examples": [ + "6f1c2a53-3d54-4a0a-9a0b-0e9ae2d4c111" + ], + "type": "string", + "minLength": 1, + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" + }, + "source": { + "title": "Event Source", + "description": "Logical event producer path within the supplier-api domain", + "type": "string", + "pattern": "^\\/data-plane\\/supplier-api(?:\\/.*)?$" + }, + "subject": { + "title": "Event Subject", + "description": "Resource path (no leading slash) within the source made of segments separated by '/'.", + "examples": [ + "letter-origin/letter-rendering/letter/f47ac10b-58cc-4372-a567-0e02b2c3d479" + ], + "type": "string", + "pattern": "^letter-origin\\/[a-z0-9-]+\\/letter\\/[^/]+(?:\\/.*)?" + }, + "type": { + "title": "Letter ENCLOSED event type", + "description": "Event type using reverse-DNS style", + "examples": [ + "uk.nhs.notify.supplier-api.letter.ENCLOSED.v1" + ], + "type": "string", + "enum": [ + "uk.nhs.notify.supplier-api.letter.ENCLOSED.v1" + ] + }, + "time": { + "title": "Event Time", + "description": "Timestamp when the event occurred (RFC 3339).", + "examples": [ + "2025-10-01T10:15:30.000Z" + ], + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" + }, + "datacontenttype": { + "title": "Data Content Type", + "description": "Media type for the data field (fixed to application/json).", + "examples": [ + "application/json" + ], + "type": "string", + "enum": [ + "application/json" + ] + }, + "dataschema": { + "title": "Data Schema URI", + "description": "URI of a schema that describes the event data\n\nData schema version must match the major version indicated by the type", + "examples": [ + "https://notify.nhs.uk/cloudevents/schemas/supplier-api/letter.ACCEPTED.1.0.0.schema.json" + ], + "type": "string", + "pattern": "^https:\\/\\/notify\\.nhs\\.uk\\/cloudevents\\/schemas\\/supplier-api\\/letter.ENCLOSED.1\\.\\d+\\.\\d+\\.schema.json$" + }, + "data": { + "type": "object", + "properties": { + "domainId": { + "type": "string" + }, + "origin": { + "title": "Letter origin", + "description": "Identifiers captured from the original event that introduced the letter to the supplier-api domain.\n\nThe identifier will be included as the origin domain in the subject of any corresponding events emitted by the supplier-api domain.", + "examples": [ + { + "domain": "letter-rendering", + "subject": "customer/00f3b388-bbe9-41c9-9e76-052d37ee8988/letter-rendering/letter-request/0o5Fs0EELR0fUjHjbCnEtdUwQe4_0o5Fs0EELR0fUjHjbCnEtdUwQe5", + "event": "00f3b388-bbe9-41c9-9e76-052d37ee8988" + } + ], + "type": "object", + "properties": { + "domain": { + "title": "Domain ID", + "description": "The domain which requested this letter", + "type": "string" + }, + "source": { + "title": "Event source", + "description": "The source of the event which created this letter", + "type": "string" + }, + "subject": { + "title": "Event subject", + "description": "The subject of the event which created this letter, scoped to source", + "type": "string" + }, + "event": { + "title": "Event ID", + "description": "The ID of the event which created this letter", + "type": "string" + } + }, + "required": [ + "domain", + "source", + "subject", + "event" + ] + }, + "specificationId": { + "title": "Specification ID", + "description": "Reference to the letter specification which was used to produce a letter pack for this request.", + "examples": [ + "1y3q9v1zzzz" + ], + "type": "string" + }, + "groupId": { + "title": "Group ID", + "description": "Identifier for the group which this letter assigned to for reporting purposes.", + "examples": [ + "client_template", + "00f3b388-bbe9-41c9-9e76-052d37ee8988_20a1ab22-6136-47ae-ac0f-989f382be8df" + ], + "type": "string" + }, + "status": { + "type": "string", + "enum": [ + "ENCLOSED" + ] + }, + "reasonCode": { + "title": "Reason Code", + "description": "Optional reason code for the status change, if applicable.", + "examples": [ + "R01", + "R08" + ], + "type": "string" + }, + "reasonText": { + "title": "Reason Text", + "description": "Optional human-readable reason for the status change, if applicable.", + "examples": [ + "Undeliverable", + "Recipient moved" + ], + "type": "string" + } + }, + "required": [ + "domainId", + "origin", + "specificationId", + "groupId", + "status" + ] + }, + "traceparent": { + "title": "Traceparent", + "description": "W3C Trace Context traceparent header value.", + "examples": [ + "00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01" + ], + "type": "string", + "minLength": 1, + "pattern": "^00-[0-9a-f]{32}-[0-9a-f]{16}-[0-9a-f]{2}$" + }, + "tracestate": { + "title": "Tracestate", + "description": "Optional W3C Trace Context tracestate header value.", + "examples": [ + "rojo=00f067aa0ba902b7,congo=t61rcWkgMzE" + ], + "type": "string" + }, + "partitionkey": { + "title": "Partition Key", + "description": "Partition / ordering key (lowercase alphanumerics and hyphen, 1-64 chars).", + "examples": [ + "customer-920fca11" + ], + "type": "string", + "minLength": 1, + "maxLength": 64, + "pattern": "^[a-z0-9-]+$" + }, + "recordedtime": { + "title": "Recorded Time", + "description": "Timestamp when the event was recorded/persisted (should be >= time).", + "examples": [ + "2025-10-01T10:15:30.250Z" + ], + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" + }, + "sampledrate": { + "title": "Sampled Rate", + "description": "Sampling factor: number of similar occurrences this event represents.", + "examples": [ + 5 + ], + "type": "integer", + "minimum": 1, + "maximum": 9007199254740991 + }, + "sequence": { + "title": "Sequence", + "description": "Zero-padded 20 digit numeric sequence (lexicographically sortable).", + "examples": [ + "00000000000000000042" + ], + "type": "string", + "pattern": "^\\d{20}$" + }, + "severitytext": { + "title": "Severity Text", + "description": "Log severity level name.", + "examples": [ + "DEBUG" + ], + "type": "string", + "enum": [ + "TRACE", + "DEBUG", + "INFO", + "WARN", + "ERROR", + "FATAL" + ] + }, + "severitynumber": { + "title": "Severity Number", + "description": "Numeric severity (TRACE=0, DEBUG=1, INFO=2, WARN=3, ERROR=4, FATAL=5).", + "examples": [ + 1 + ], + "type": "integer", + "minimum": 0, + "maximum": 5 + }, + "dataclassification": { + "title": "Data Classification", + "description": "Data sensitivity classification.", + "examples": [ + "restricted" + ], + "type": "string", + "enum": [ + "public", + "internal", + "confidential", + "restricted" + ] + }, + "dataregulation": { + "title": "Data Regulation", + "description": "Regulatory regime tag applied to this data.", + "examples": [ + "ISO-27001" + ], + "type": "string", + "enum": [ + "GDPR", + "HIPAA", + "PCI-DSS", + "ISO-27001", + "NIST-800-53", + "CCPA" + ] + }, + "datacategory": { + "title": "Data Category", + "description": "Data category classification (e.g. standard, special-category).", + "examples": [ + "sensitive" + ], + "type": "string", + "enum": [ + "non-sensitive", + "standard", + "sensitive", + "special-category" + ] + }, + "dataschemaversion": { + "title": "Data Schema Version", + "description": "Matches semantic versioning format with fixed major version (Not part of cloudevents spec?)", + "type": "string", + "pattern": "^1\\.\\d+\\.\\d+$" + } + }, + "required": [ + "specversion", + "id", + "source", + "subject", + "type", + "time", + "dataschema", + "data", + "traceparent", + "recordedtime", + "severitynumber", + "dataschemaversion" + ] +} \ No newline at end of file diff --git a/internal/events/schemas/events/letter.FAILED.schema.json b/internal/events/schemas/events/letter.FAILED.schema.json new file mode 100644 index 00000000..29ef0665 --- /dev/null +++ b/internal/events/schemas/events/letter.FAILED.schema.json @@ -0,0 +1,329 @@ +{ + "title": "letter.FAILED Event", + "description": "Event schema for letter status change to FAILED", + "type": "object", + "properties": { + "specversion": { + "title": "CloudEvents spec version", + "description": "CloudEvents specification version (fixed to 1.0).", + "examples": [ + "1.0" + ], + "type": "string", + "enum": [ + "1.0" + ] + }, + "id": { + "title": "Event ID", + "description": "Unique identifier for this event instance (UUID).", + "examples": [ + "6f1c2a53-3d54-4a0a-9a0b-0e9ae2d4c111" + ], + "type": "string", + "minLength": 1, + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" + }, + "source": { + "title": "Event Source", + "description": "Logical event producer path within the supplier-api domain", + "type": "string", + "pattern": "^\\/data-plane\\/supplier-api(?:\\/.*)?$" + }, + "subject": { + "title": "Event Subject", + "description": "Resource path (no leading slash) within the source made of segments separated by '/'.", + "examples": [ + "letter-origin/letter-rendering/letter/f47ac10b-58cc-4372-a567-0e02b2c3d479" + ], + "type": "string", + "pattern": "^letter-origin\\/[a-z0-9-]+\\/letter\\/[^/]+(?:\\/.*)?" + }, + "type": { + "title": "Letter FAILED event type", + "description": "Event type using reverse-DNS style", + "examples": [ + "uk.nhs.notify.supplier-api.letter.FAILED.v1" + ], + "type": "string", + "enum": [ + "uk.nhs.notify.supplier-api.letter.FAILED.v1" + ] + }, + "time": { + "title": "Event Time", + "description": "Timestamp when the event occurred (RFC 3339).", + "examples": [ + "2025-10-01T10:15:30.000Z" + ], + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" + }, + "datacontenttype": { + "title": "Data Content Type", + "description": "Media type for the data field (fixed to application/json).", + "examples": [ + "application/json" + ], + "type": "string", + "enum": [ + "application/json" + ] + }, + "dataschema": { + "title": "Data Schema URI", + "description": "URI of a schema that describes the event data\n\nData schema version must match the major version indicated by the type", + "examples": [ + "https://notify.nhs.uk/cloudevents/schemas/supplier-api/letter.ACCEPTED.1.0.0.schema.json" + ], + "type": "string", + "pattern": "^https:\\/\\/notify\\.nhs\\.uk\\/cloudevents\\/schemas\\/supplier-api\\/letter.FAILED.1\\.\\d+\\.\\d+\\.schema.json$" + }, + "data": { + "type": "object", + "properties": { + "domainId": { + "type": "string" + }, + "origin": { + "title": "Letter origin", + "description": "Identifiers captured from the original event that introduced the letter to the supplier-api domain.\n\nThe identifier will be included as the origin domain in the subject of any corresponding events emitted by the supplier-api domain.", + "examples": [ + { + "domain": "letter-rendering", + "subject": "customer/00f3b388-bbe9-41c9-9e76-052d37ee8988/letter-rendering/letter-request/0o5Fs0EELR0fUjHjbCnEtdUwQe4_0o5Fs0EELR0fUjHjbCnEtdUwQe5", + "event": "00f3b388-bbe9-41c9-9e76-052d37ee8988" + } + ], + "type": "object", + "properties": { + "domain": { + "title": "Domain ID", + "description": "The domain which requested this letter", + "type": "string" + }, + "source": { + "title": "Event source", + "description": "The source of the event which created this letter", + "type": "string" + }, + "subject": { + "title": "Event subject", + "description": "The subject of the event which created this letter, scoped to source", + "type": "string" + }, + "event": { + "title": "Event ID", + "description": "The ID of the event which created this letter", + "type": "string" + } + }, + "required": [ + "domain", + "source", + "subject", + "event" + ] + }, + "specificationId": { + "title": "Specification ID", + "description": "Reference to the letter specification which was used to produce a letter pack for this request.", + "examples": [ + "1y3q9v1zzzz" + ], + "type": "string" + }, + "groupId": { + "title": "Group ID", + "description": "Identifier for the group which this letter assigned to for reporting purposes.", + "examples": [ + "client_template", + "00f3b388-bbe9-41c9-9e76-052d37ee8988_20a1ab22-6136-47ae-ac0f-989f382be8df" + ], + "type": "string" + }, + "status": { + "type": "string", + "enum": [ + "FAILED" + ] + }, + "reasonCode": { + "title": "Reason Code", + "description": "Optional reason code for the status change, if applicable.", + "examples": [ + "R01", + "R08" + ], + "type": "string" + }, + "reasonText": { + "title": "Reason Text", + "description": "Optional human-readable reason for the status change, if applicable.", + "examples": [ + "Undeliverable", + "Recipient moved" + ], + "type": "string" + } + }, + "required": [ + "domainId", + "origin", + "specificationId", + "groupId", + "status" + ] + }, + "traceparent": { + "title": "Traceparent", + "description": "W3C Trace Context traceparent header value.", + "examples": [ + "00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01" + ], + "type": "string", + "minLength": 1, + "pattern": "^00-[0-9a-f]{32}-[0-9a-f]{16}-[0-9a-f]{2}$" + }, + "tracestate": { + "title": "Tracestate", + "description": "Optional W3C Trace Context tracestate header value.", + "examples": [ + "rojo=00f067aa0ba902b7,congo=t61rcWkgMzE" + ], + "type": "string" + }, + "partitionkey": { + "title": "Partition Key", + "description": "Partition / ordering key (lowercase alphanumerics and hyphen, 1-64 chars).", + "examples": [ + "customer-920fca11" + ], + "type": "string", + "minLength": 1, + "maxLength": 64, + "pattern": "^[a-z0-9-]+$" + }, + "recordedtime": { + "title": "Recorded Time", + "description": "Timestamp when the event was recorded/persisted (should be >= time).", + "examples": [ + "2025-10-01T10:15:30.250Z" + ], + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" + }, + "sampledrate": { + "title": "Sampled Rate", + "description": "Sampling factor: number of similar occurrences this event represents.", + "examples": [ + 5 + ], + "type": "integer", + "minimum": 1, + "maximum": 9007199254740991 + }, + "sequence": { + "title": "Sequence", + "description": "Zero-padded 20 digit numeric sequence (lexicographically sortable).", + "examples": [ + "00000000000000000042" + ], + "type": "string", + "pattern": "^\\d{20}$" + }, + "severitytext": { + "title": "Severity Text", + "description": "Log severity level name.", + "examples": [ + "DEBUG" + ], + "type": "string", + "enum": [ + "TRACE", + "DEBUG", + "INFO", + "WARN", + "ERROR", + "FATAL" + ] + }, + "severitynumber": { + "title": "Severity Number", + "description": "Numeric severity (TRACE=0, DEBUG=1, INFO=2, WARN=3, ERROR=4, FATAL=5).", + "examples": [ + 1 + ], + "type": "integer", + "minimum": 0, + "maximum": 5 + }, + "dataclassification": { + "title": "Data Classification", + "description": "Data sensitivity classification.", + "examples": [ + "restricted" + ], + "type": "string", + "enum": [ + "public", + "internal", + "confidential", + "restricted" + ] + }, + "dataregulation": { + "title": "Data Regulation", + "description": "Regulatory regime tag applied to this data.", + "examples": [ + "ISO-27001" + ], + "type": "string", + "enum": [ + "GDPR", + "HIPAA", + "PCI-DSS", + "ISO-27001", + "NIST-800-53", + "CCPA" + ] + }, + "datacategory": { + "title": "Data Category", + "description": "Data category classification (e.g. standard, special-category).", + "examples": [ + "sensitive" + ], + "type": "string", + "enum": [ + "non-sensitive", + "standard", + "sensitive", + "special-category" + ] + }, + "dataschemaversion": { + "title": "Data Schema Version", + "description": "Matches semantic versioning format with fixed major version (Not part of cloudevents spec?)", + "type": "string", + "pattern": "^1\\.\\d+\\.\\d+$" + } + }, + "required": [ + "specversion", + "id", + "source", + "subject", + "type", + "time", + "dataschema", + "data", + "traceparent", + "recordedtime", + "severitynumber", + "dataschemaversion" + ] +} \ No newline at end of file diff --git a/internal/events/schemas/events/letter.FORWARDED.schema.json b/internal/events/schemas/events/letter.FORWARDED.schema.json new file mode 100644 index 00000000..36c89ab2 --- /dev/null +++ b/internal/events/schemas/events/letter.FORWARDED.schema.json @@ -0,0 +1,329 @@ +{ + "title": "letter.FORWARDED Event", + "description": "Event schema for letter status change to FORWARDED", + "type": "object", + "properties": { + "specversion": { + "title": "CloudEvents spec version", + "description": "CloudEvents specification version (fixed to 1.0).", + "examples": [ + "1.0" + ], + "type": "string", + "enum": [ + "1.0" + ] + }, + "id": { + "title": "Event ID", + "description": "Unique identifier for this event instance (UUID).", + "examples": [ + "6f1c2a53-3d54-4a0a-9a0b-0e9ae2d4c111" + ], + "type": "string", + "minLength": 1, + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" + }, + "source": { + "title": "Event Source", + "description": "Logical event producer path within the supplier-api domain", + "type": "string", + "pattern": "^\\/data-plane\\/supplier-api(?:\\/.*)?$" + }, + "subject": { + "title": "Event Subject", + "description": "Resource path (no leading slash) within the source made of segments separated by '/'.", + "examples": [ + "letter-origin/letter-rendering/letter/f47ac10b-58cc-4372-a567-0e02b2c3d479" + ], + "type": "string", + "pattern": "^letter-origin\\/[a-z0-9-]+\\/letter\\/[^/]+(?:\\/.*)?" + }, + "type": { + "title": "Letter FORWARDED event type", + "description": "Event type using reverse-DNS style", + "examples": [ + "uk.nhs.notify.supplier-api.letter.FORWARDED.v1" + ], + "type": "string", + "enum": [ + "uk.nhs.notify.supplier-api.letter.FORWARDED.v1" + ] + }, + "time": { + "title": "Event Time", + "description": "Timestamp when the event occurred (RFC 3339).", + "examples": [ + "2025-10-01T10:15:30.000Z" + ], + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" + }, + "datacontenttype": { + "title": "Data Content Type", + "description": "Media type for the data field (fixed to application/json).", + "examples": [ + "application/json" + ], + "type": "string", + "enum": [ + "application/json" + ] + }, + "dataschema": { + "title": "Data Schema URI", + "description": "URI of a schema that describes the event data\n\nData schema version must match the major version indicated by the type", + "examples": [ + "https://notify.nhs.uk/cloudevents/schemas/supplier-api/letter.ACCEPTED.1.0.0.schema.json" + ], + "type": "string", + "pattern": "^https:\\/\\/notify\\.nhs\\.uk\\/cloudevents\\/schemas\\/supplier-api\\/letter.FORWARDED.1\\.\\d+\\.\\d+\\.schema.json$" + }, + "data": { + "type": "object", + "properties": { + "domainId": { + "type": "string" + }, + "origin": { + "title": "Letter origin", + "description": "Identifiers captured from the original event that introduced the letter to the supplier-api domain.\n\nThe identifier will be included as the origin domain in the subject of any corresponding events emitted by the supplier-api domain.", + "examples": [ + { + "domain": "letter-rendering", + "subject": "customer/00f3b388-bbe9-41c9-9e76-052d37ee8988/letter-rendering/letter-request/0o5Fs0EELR0fUjHjbCnEtdUwQe4_0o5Fs0EELR0fUjHjbCnEtdUwQe5", + "event": "00f3b388-bbe9-41c9-9e76-052d37ee8988" + } + ], + "type": "object", + "properties": { + "domain": { + "title": "Domain ID", + "description": "The domain which requested this letter", + "type": "string" + }, + "source": { + "title": "Event source", + "description": "The source of the event which created this letter", + "type": "string" + }, + "subject": { + "title": "Event subject", + "description": "The subject of the event which created this letter, scoped to source", + "type": "string" + }, + "event": { + "title": "Event ID", + "description": "The ID of the event which created this letter", + "type": "string" + } + }, + "required": [ + "domain", + "source", + "subject", + "event" + ] + }, + "specificationId": { + "title": "Specification ID", + "description": "Reference to the letter specification which was used to produce a letter pack for this request.", + "examples": [ + "1y3q9v1zzzz" + ], + "type": "string" + }, + "groupId": { + "title": "Group ID", + "description": "Identifier for the group which this letter assigned to for reporting purposes.", + "examples": [ + "client_template", + "00f3b388-bbe9-41c9-9e76-052d37ee8988_20a1ab22-6136-47ae-ac0f-989f382be8df" + ], + "type": "string" + }, + "status": { + "type": "string", + "enum": [ + "FORWARDED" + ] + }, + "reasonCode": { + "title": "Reason Code", + "description": "Optional reason code for the status change, if applicable.", + "examples": [ + "R01", + "R08" + ], + "type": "string" + }, + "reasonText": { + "title": "Reason Text", + "description": "Optional human-readable reason for the status change, if applicable.", + "examples": [ + "Undeliverable", + "Recipient moved" + ], + "type": "string" + } + }, + "required": [ + "domainId", + "origin", + "specificationId", + "groupId", + "status" + ] + }, + "traceparent": { + "title": "Traceparent", + "description": "W3C Trace Context traceparent header value.", + "examples": [ + "00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01" + ], + "type": "string", + "minLength": 1, + "pattern": "^00-[0-9a-f]{32}-[0-9a-f]{16}-[0-9a-f]{2}$" + }, + "tracestate": { + "title": "Tracestate", + "description": "Optional W3C Trace Context tracestate header value.", + "examples": [ + "rojo=00f067aa0ba902b7,congo=t61rcWkgMzE" + ], + "type": "string" + }, + "partitionkey": { + "title": "Partition Key", + "description": "Partition / ordering key (lowercase alphanumerics and hyphen, 1-64 chars).", + "examples": [ + "customer-920fca11" + ], + "type": "string", + "minLength": 1, + "maxLength": 64, + "pattern": "^[a-z0-9-]+$" + }, + "recordedtime": { + "title": "Recorded Time", + "description": "Timestamp when the event was recorded/persisted (should be >= time).", + "examples": [ + "2025-10-01T10:15:30.250Z" + ], + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" + }, + "sampledrate": { + "title": "Sampled Rate", + "description": "Sampling factor: number of similar occurrences this event represents.", + "examples": [ + 5 + ], + "type": "integer", + "minimum": 1, + "maximum": 9007199254740991 + }, + "sequence": { + "title": "Sequence", + "description": "Zero-padded 20 digit numeric sequence (lexicographically sortable).", + "examples": [ + "00000000000000000042" + ], + "type": "string", + "pattern": "^\\d{20}$" + }, + "severitytext": { + "title": "Severity Text", + "description": "Log severity level name.", + "examples": [ + "DEBUG" + ], + "type": "string", + "enum": [ + "TRACE", + "DEBUG", + "INFO", + "WARN", + "ERROR", + "FATAL" + ] + }, + "severitynumber": { + "title": "Severity Number", + "description": "Numeric severity (TRACE=0, DEBUG=1, INFO=2, WARN=3, ERROR=4, FATAL=5).", + "examples": [ + 1 + ], + "type": "integer", + "minimum": 0, + "maximum": 5 + }, + "dataclassification": { + "title": "Data Classification", + "description": "Data sensitivity classification.", + "examples": [ + "restricted" + ], + "type": "string", + "enum": [ + "public", + "internal", + "confidential", + "restricted" + ] + }, + "dataregulation": { + "title": "Data Regulation", + "description": "Regulatory regime tag applied to this data.", + "examples": [ + "ISO-27001" + ], + "type": "string", + "enum": [ + "GDPR", + "HIPAA", + "PCI-DSS", + "ISO-27001", + "NIST-800-53", + "CCPA" + ] + }, + "datacategory": { + "title": "Data Category", + "description": "Data category classification (e.g. standard, special-category).", + "examples": [ + "sensitive" + ], + "type": "string", + "enum": [ + "non-sensitive", + "standard", + "sensitive", + "special-category" + ] + }, + "dataschemaversion": { + "title": "Data Schema Version", + "description": "Matches semantic versioning format with fixed major version (Not part of cloudevents spec?)", + "type": "string", + "pattern": "^1\\.\\d+\\.\\d+$" + } + }, + "required": [ + "specversion", + "id", + "source", + "subject", + "type", + "time", + "dataschema", + "data", + "traceparent", + "recordedtime", + "severitynumber", + "dataschemaversion" + ] +} \ No newline at end of file diff --git a/internal/events/schemas/events/letter.PENDING.schema.json b/internal/events/schemas/events/letter.PENDING.schema.json new file mode 100644 index 00000000..852166a5 --- /dev/null +++ b/internal/events/schemas/events/letter.PENDING.schema.json @@ -0,0 +1,329 @@ +{ + "title": "letter.PENDING Event", + "description": "Event schema for letter status change to PENDING", + "type": "object", + "properties": { + "specversion": { + "title": "CloudEvents spec version", + "description": "CloudEvents specification version (fixed to 1.0).", + "examples": [ + "1.0" + ], + "type": "string", + "enum": [ + "1.0" + ] + }, + "id": { + "title": "Event ID", + "description": "Unique identifier for this event instance (UUID).", + "examples": [ + "6f1c2a53-3d54-4a0a-9a0b-0e9ae2d4c111" + ], + "type": "string", + "minLength": 1, + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" + }, + "source": { + "title": "Event Source", + "description": "Logical event producer path within the supplier-api domain", + "type": "string", + "pattern": "^\\/data-plane\\/supplier-api(?:\\/.*)?$" + }, + "subject": { + "title": "Event Subject", + "description": "Resource path (no leading slash) within the source made of segments separated by '/'.", + "examples": [ + "letter-origin/letter-rendering/letter/f47ac10b-58cc-4372-a567-0e02b2c3d479" + ], + "type": "string", + "pattern": "^letter-origin\\/[a-z0-9-]+\\/letter\\/[^/]+(?:\\/.*)?" + }, + "type": { + "title": "Letter PENDING event type", + "description": "Event type using reverse-DNS style", + "examples": [ + "uk.nhs.notify.supplier-api.letter.PENDING.v1" + ], + "type": "string", + "enum": [ + "uk.nhs.notify.supplier-api.letter.PENDING.v1" + ] + }, + "time": { + "title": "Event Time", + "description": "Timestamp when the event occurred (RFC 3339).", + "examples": [ + "2025-10-01T10:15:30.000Z" + ], + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" + }, + "datacontenttype": { + "title": "Data Content Type", + "description": "Media type for the data field (fixed to application/json).", + "examples": [ + "application/json" + ], + "type": "string", + "enum": [ + "application/json" + ] + }, + "dataschema": { + "title": "Data Schema URI", + "description": "URI of a schema that describes the event data\n\nData schema version must match the major version indicated by the type", + "examples": [ + "https://notify.nhs.uk/cloudevents/schemas/supplier-api/letter.ACCEPTED.1.0.0.schema.json" + ], + "type": "string", + "pattern": "^https:\\/\\/notify\\.nhs\\.uk\\/cloudevents\\/schemas\\/supplier-api\\/letter.PENDING.1\\.\\d+\\.\\d+\\.schema.json$" + }, + "data": { + "type": "object", + "properties": { + "domainId": { + "type": "string" + }, + "origin": { + "title": "Letter origin", + "description": "Identifiers captured from the original event that introduced the letter to the supplier-api domain.\n\nThe identifier will be included as the origin domain in the subject of any corresponding events emitted by the supplier-api domain.", + "examples": [ + { + "domain": "letter-rendering", + "subject": "customer/00f3b388-bbe9-41c9-9e76-052d37ee8988/letter-rendering/letter-request/0o5Fs0EELR0fUjHjbCnEtdUwQe4_0o5Fs0EELR0fUjHjbCnEtdUwQe5", + "event": "00f3b388-bbe9-41c9-9e76-052d37ee8988" + } + ], + "type": "object", + "properties": { + "domain": { + "title": "Domain ID", + "description": "The domain which requested this letter", + "type": "string" + }, + "source": { + "title": "Event source", + "description": "The source of the event which created this letter", + "type": "string" + }, + "subject": { + "title": "Event subject", + "description": "The subject of the event which created this letter, scoped to source", + "type": "string" + }, + "event": { + "title": "Event ID", + "description": "The ID of the event which created this letter", + "type": "string" + } + }, + "required": [ + "domain", + "source", + "subject", + "event" + ] + }, + "specificationId": { + "title": "Specification ID", + "description": "Reference to the letter specification which was used to produce a letter pack for this request.", + "examples": [ + "1y3q9v1zzzz" + ], + "type": "string" + }, + "groupId": { + "title": "Group ID", + "description": "Identifier for the group which this letter assigned to for reporting purposes.", + "examples": [ + "client_template", + "00f3b388-bbe9-41c9-9e76-052d37ee8988_20a1ab22-6136-47ae-ac0f-989f382be8df" + ], + "type": "string" + }, + "status": { + "type": "string", + "enum": [ + "PENDING" + ] + }, + "reasonCode": { + "title": "Reason Code", + "description": "Optional reason code for the status change, if applicable.", + "examples": [ + "R01", + "R08" + ], + "type": "string" + }, + "reasonText": { + "title": "Reason Text", + "description": "Optional human-readable reason for the status change, if applicable.", + "examples": [ + "Undeliverable", + "Recipient moved" + ], + "type": "string" + } + }, + "required": [ + "domainId", + "origin", + "specificationId", + "groupId", + "status" + ] + }, + "traceparent": { + "title": "Traceparent", + "description": "W3C Trace Context traceparent header value.", + "examples": [ + "00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01" + ], + "type": "string", + "minLength": 1, + "pattern": "^00-[0-9a-f]{32}-[0-9a-f]{16}-[0-9a-f]{2}$" + }, + "tracestate": { + "title": "Tracestate", + "description": "Optional W3C Trace Context tracestate header value.", + "examples": [ + "rojo=00f067aa0ba902b7,congo=t61rcWkgMzE" + ], + "type": "string" + }, + "partitionkey": { + "title": "Partition Key", + "description": "Partition / ordering key (lowercase alphanumerics and hyphen, 1-64 chars).", + "examples": [ + "customer-920fca11" + ], + "type": "string", + "minLength": 1, + "maxLength": 64, + "pattern": "^[a-z0-9-]+$" + }, + "recordedtime": { + "title": "Recorded Time", + "description": "Timestamp when the event was recorded/persisted (should be >= time).", + "examples": [ + "2025-10-01T10:15:30.250Z" + ], + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" + }, + "sampledrate": { + "title": "Sampled Rate", + "description": "Sampling factor: number of similar occurrences this event represents.", + "examples": [ + 5 + ], + "type": "integer", + "minimum": 1, + "maximum": 9007199254740991 + }, + "sequence": { + "title": "Sequence", + "description": "Zero-padded 20 digit numeric sequence (lexicographically sortable).", + "examples": [ + "00000000000000000042" + ], + "type": "string", + "pattern": "^\\d{20}$" + }, + "severitytext": { + "title": "Severity Text", + "description": "Log severity level name.", + "examples": [ + "DEBUG" + ], + "type": "string", + "enum": [ + "TRACE", + "DEBUG", + "INFO", + "WARN", + "ERROR", + "FATAL" + ] + }, + "severitynumber": { + "title": "Severity Number", + "description": "Numeric severity (TRACE=0, DEBUG=1, INFO=2, WARN=3, ERROR=4, FATAL=5).", + "examples": [ + 1 + ], + "type": "integer", + "minimum": 0, + "maximum": 5 + }, + "dataclassification": { + "title": "Data Classification", + "description": "Data sensitivity classification.", + "examples": [ + "restricted" + ], + "type": "string", + "enum": [ + "public", + "internal", + "confidential", + "restricted" + ] + }, + "dataregulation": { + "title": "Data Regulation", + "description": "Regulatory regime tag applied to this data.", + "examples": [ + "ISO-27001" + ], + "type": "string", + "enum": [ + "GDPR", + "HIPAA", + "PCI-DSS", + "ISO-27001", + "NIST-800-53", + "CCPA" + ] + }, + "datacategory": { + "title": "Data Category", + "description": "Data category classification (e.g. standard, special-category).", + "examples": [ + "sensitive" + ], + "type": "string", + "enum": [ + "non-sensitive", + "standard", + "sensitive", + "special-category" + ] + }, + "dataschemaversion": { + "title": "Data Schema Version", + "description": "Matches semantic versioning format with fixed major version (Not part of cloudevents spec?)", + "type": "string", + "pattern": "^1\\.\\d+\\.\\d+$" + } + }, + "required": [ + "specversion", + "id", + "source", + "subject", + "type", + "time", + "dataschema", + "data", + "traceparent", + "recordedtime", + "severitynumber", + "dataschemaversion" + ] +} \ No newline at end of file diff --git a/internal/events/schemas/events/letter.PRINTED.schema.json b/internal/events/schemas/events/letter.PRINTED.schema.json new file mode 100644 index 00000000..cb013e4b --- /dev/null +++ b/internal/events/schemas/events/letter.PRINTED.schema.json @@ -0,0 +1,329 @@ +{ + "title": "letter.PRINTED Event", + "description": "Event schema for letter status change to PRINTED", + "type": "object", + "properties": { + "specversion": { + "title": "CloudEvents spec version", + "description": "CloudEvents specification version (fixed to 1.0).", + "examples": [ + "1.0" + ], + "type": "string", + "enum": [ + "1.0" + ] + }, + "id": { + "title": "Event ID", + "description": "Unique identifier for this event instance (UUID).", + "examples": [ + "6f1c2a53-3d54-4a0a-9a0b-0e9ae2d4c111" + ], + "type": "string", + "minLength": 1, + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" + }, + "source": { + "title": "Event Source", + "description": "Logical event producer path within the supplier-api domain", + "type": "string", + "pattern": "^\\/data-plane\\/supplier-api(?:\\/.*)?$" + }, + "subject": { + "title": "Event Subject", + "description": "Resource path (no leading slash) within the source made of segments separated by '/'.", + "examples": [ + "letter-origin/letter-rendering/letter/f47ac10b-58cc-4372-a567-0e02b2c3d479" + ], + "type": "string", + "pattern": "^letter-origin\\/[a-z0-9-]+\\/letter\\/[^/]+(?:\\/.*)?" + }, + "type": { + "title": "Letter PRINTED event type", + "description": "Event type using reverse-DNS style", + "examples": [ + "uk.nhs.notify.supplier-api.letter.PRINTED.v1" + ], + "type": "string", + "enum": [ + "uk.nhs.notify.supplier-api.letter.PRINTED.v1" + ] + }, + "time": { + "title": "Event Time", + "description": "Timestamp when the event occurred (RFC 3339).", + "examples": [ + "2025-10-01T10:15:30.000Z" + ], + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" + }, + "datacontenttype": { + "title": "Data Content Type", + "description": "Media type for the data field (fixed to application/json).", + "examples": [ + "application/json" + ], + "type": "string", + "enum": [ + "application/json" + ] + }, + "dataschema": { + "title": "Data Schema URI", + "description": "URI of a schema that describes the event data\n\nData schema version must match the major version indicated by the type", + "examples": [ + "https://notify.nhs.uk/cloudevents/schemas/supplier-api/letter.ACCEPTED.1.0.0.schema.json" + ], + "type": "string", + "pattern": "^https:\\/\\/notify\\.nhs\\.uk\\/cloudevents\\/schemas\\/supplier-api\\/letter.PRINTED.1\\.\\d+\\.\\d+\\.schema.json$" + }, + "data": { + "type": "object", + "properties": { + "domainId": { + "type": "string" + }, + "origin": { + "title": "Letter origin", + "description": "Identifiers captured from the original event that introduced the letter to the supplier-api domain.\n\nThe identifier will be included as the origin domain in the subject of any corresponding events emitted by the supplier-api domain.", + "examples": [ + { + "domain": "letter-rendering", + "subject": "customer/00f3b388-bbe9-41c9-9e76-052d37ee8988/letter-rendering/letter-request/0o5Fs0EELR0fUjHjbCnEtdUwQe4_0o5Fs0EELR0fUjHjbCnEtdUwQe5", + "event": "00f3b388-bbe9-41c9-9e76-052d37ee8988" + } + ], + "type": "object", + "properties": { + "domain": { + "title": "Domain ID", + "description": "The domain which requested this letter", + "type": "string" + }, + "source": { + "title": "Event source", + "description": "The source of the event which created this letter", + "type": "string" + }, + "subject": { + "title": "Event subject", + "description": "The subject of the event which created this letter, scoped to source", + "type": "string" + }, + "event": { + "title": "Event ID", + "description": "The ID of the event which created this letter", + "type": "string" + } + }, + "required": [ + "domain", + "source", + "subject", + "event" + ] + }, + "specificationId": { + "title": "Specification ID", + "description": "Reference to the letter specification which was used to produce a letter pack for this request.", + "examples": [ + "1y3q9v1zzzz" + ], + "type": "string" + }, + "groupId": { + "title": "Group ID", + "description": "Identifier for the group which this letter assigned to for reporting purposes.", + "examples": [ + "client_template", + "00f3b388-bbe9-41c9-9e76-052d37ee8988_20a1ab22-6136-47ae-ac0f-989f382be8df" + ], + "type": "string" + }, + "status": { + "type": "string", + "enum": [ + "PRINTED" + ] + }, + "reasonCode": { + "title": "Reason Code", + "description": "Optional reason code for the status change, if applicable.", + "examples": [ + "R01", + "R08" + ], + "type": "string" + }, + "reasonText": { + "title": "Reason Text", + "description": "Optional human-readable reason for the status change, if applicable.", + "examples": [ + "Undeliverable", + "Recipient moved" + ], + "type": "string" + } + }, + "required": [ + "domainId", + "origin", + "specificationId", + "groupId", + "status" + ] + }, + "traceparent": { + "title": "Traceparent", + "description": "W3C Trace Context traceparent header value.", + "examples": [ + "00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01" + ], + "type": "string", + "minLength": 1, + "pattern": "^00-[0-9a-f]{32}-[0-9a-f]{16}-[0-9a-f]{2}$" + }, + "tracestate": { + "title": "Tracestate", + "description": "Optional W3C Trace Context tracestate header value.", + "examples": [ + "rojo=00f067aa0ba902b7,congo=t61rcWkgMzE" + ], + "type": "string" + }, + "partitionkey": { + "title": "Partition Key", + "description": "Partition / ordering key (lowercase alphanumerics and hyphen, 1-64 chars).", + "examples": [ + "customer-920fca11" + ], + "type": "string", + "minLength": 1, + "maxLength": 64, + "pattern": "^[a-z0-9-]+$" + }, + "recordedtime": { + "title": "Recorded Time", + "description": "Timestamp when the event was recorded/persisted (should be >= time).", + "examples": [ + "2025-10-01T10:15:30.250Z" + ], + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" + }, + "sampledrate": { + "title": "Sampled Rate", + "description": "Sampling factor: number of similar occurrences this event represents.", + "examples": [ + 5 + ], + "type": "integer", + "minimum": 1, + "maximum": 9007199254740991 + }, + "sequence": { + "title": "Sequence", + "description": "Zero-padded 20 digit numeric sequence (lexicographically sortable).", + "examples": [ + "00000000000000000042" + ], + "type": "string", + "pattern": "^\\d{20}$" + }, + "severitytext": { + "title": "Severity Text", + "description": "Log severity level name.", + "examples": [ + "DEBUG" + ], + "type": "string", + "enum": [ + "TRACE", + "DEBUG", + "INFO", + "WARN", + "ERROR", + "FATAL" + ] + }, + "severitynumber": { + "title": "Severity Number", + "description": "Numeric severity (TRACE=0, DEBUG=1, INFO=2, WARN=3, ERROR=4, FATAL=5).", + "examples": [ + 1 + ], + "type": "integer", + "minimum": 0, + "maximum": 5 + }, + "dataclassification": { + "title": "Data Classification", + "description": "Data sensitivity classification.", + "examples": [ + "restricted" + ], + "type": "string", + "enum": [ + "public", + "internal", + "confidential", + "restricted" + ] + }, + "dataregulation": { + "title": "Data Regulation", + "description": "Regulatory regime tag applied to this data.", + "examples": [ + "ISO-27001" + ], + "type": "string", + "enum": [ + "GDPR", + "HIPAA", + "PCI-DSS", + "ISO-27001", + "NIST-800-53", + "CCPA" + ] + }, + "datacategory": { + "title": "Data Category", + "description": "Data category classification (e.g. standard, special-category).", + "examples": [ + "sensitive" + ], + "type": "string", + "enum": [ + "non-sensitive", + "standard", + "sensitive", + "special-category" + ] + }, + "dataschemaversion": { + "title": "Data Schema Version", + "description": "Matches semantic versioning format with fixed major version (Not part of cloudevents spec?)", + "type": "string", + "pattern": "^1\\.\\d+\\.\\d+$" + } + }, + "required": [ + "specversion", + "id", + "source", + "subject", + "type", + "time", + "dataschema", + "data", + "traceparent", + "recordedtime", + "severitynumber", + "dataschemaversion" + ] +} \ No newline at end of file diff --git a/internal/events/schemas/events/letter.REJECTED.schema.json b/internal/events/schemas/events/letter.REJECTED.schema.json new file mode 100644 index 00000000..ae24a582 --- /dev/null +++ b/internal/events/schemas/events/letter.REJECTED.schema.json @@ -0,0 +1,329 @@ +{ + "title": "letter.REJECTED Event", + "description": "Event schema for letter status change to REJECTED", + "type": "object", + "properties": { + "specversion": { + "title": "CloudEvents spec version", + "description": "CloudEvents specification version (fixed to 1.0).", + "examples": [ + "1.0" + ], + "type": "string", + "enum": [ + "1.0" + ] + }, + "id": { + "title": "Event ID", + "description": "Unique identifier for this event instance (UUID).", + "examples": [ + "6f1c2a53-3d54-4a0a-9a0b-0e9ae2d4c111" + ], + "type": "string", + "minLength": 1, + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" + }, + "source": { + "title": "Event Source", + "description": "Logical event producer path within the supplier-api domain", + "type": "string", + "pattern": "^\\/data-plane\\/supplier-api(?:\\/.*)?$" + }, + "subject": { + "title": "Event Subject", + "description": "Resource path (no leading slash) within the source made of segments separated by '/'.", + "examples": [ + "letter-origin/letter-rendering/letter/f47ac10b-58cc-4372-a567-0e02b2c3d479" + ], + "type": "string", + "pattern": "^letter-origin\\/[a-z0-9-]+\\/letter\\/[^/]+(?:\\/.*)?" + }, + "type": { + "title": "Letter REJECTED event type", + "description": "Event type using reverse-DNS style", + "examples": [ + "uk.nhs.notify.supplier-api.letter.REJECTED.v1" + ], + "type": "string", + "enum": [ + "uk.nhs.notify.supplier-api.letter.REJECTED.v1" + ] + }, + "time": { + "title": "Event Time", + "description": "Timestamp when the event occurred (RFC 3339).", + "examples": [ + "2025-10-01T10:15:30.000Z" + ], + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" + }, + "datacontenttype": { + "title": "Data Content Type", + "description": "Media type for the data field (fixed to application/json).", + "examples": [ + "application/json" + ], + "type": "string", + "enum": [ + "application/json" + ] + }, + "dataschema": { + "title": "Data Schema URI", + "description": "URI of a schema that describes the event data\n\nData schema version must match the major version indicated by the type", + "examples": [ + "https://notify.nhs.uk/cloudevents/schemas/supplier-api/letter.ACCEPTED.1.0.0.schema.json" + ], + "type": "string", + "pattern": "^https:\\/\\/notify\\.nhs\\.uk\\/cloudevents\\/schemas\\/supplier-api\\/letter.REJECTED.1\\.\\d+\\.\\d+\\.schema.json$" + }, + "data": { + "type": "object", + "properties": { + "domainId": { + "type": "string" + }, + "origin": { + "title": "Letter origin", + "description": "Identifiers captured from the original event that introduced the letter to the supplier-api domain.\n\nThe identifier will be included as the origin domain in the subject of any corresponding events emitted by the supplier-api domain.", + "examples": [ + { + "domain": "letter-rendering", + "subject": "customer/00f3b388-bbe9-41c9-9e76-052d37ee8988/letter-rendering/letter-request/0o5Fs0EELR0fUjHjbCnEtdUwQe4_0o5Fs0EELR0fUjHjbCnEtdUwQe5", + "event": "00f3b388-bbe9-41c9-9e76-052d37ee8988" + } + ], + "type": "object", + "properties": { + "domain": { + "title": "Domain ID", + "description": "The domain which requested this letter", + "type": "string" + }, + "source": { + "title": "Event source", + "description": "The source of the event which created this letter", + "type": "string" + }, + "subject": { + "title": "Event subject", + "description": "The subject of the event which created this letter, scoped to source", + "type": "string" + }, + "event": { + "title": "Event ID", + "description": "The ID of the event which created this letter", + "type": "string" + } + }, + "required": [ + "domain", + "source", + "subject", + "event" + ] + }, + "specificationId": { + "title": "Specification ID", + "description": "Reference to the letter specification which was used to produce a letter pack for this request.", + "examples": [ + "1y3q9v1zzzz" + ], + "type": "string" + }, + "groupId": { + "title": "Group ID", + "description": "Identifier for the group which this letter assigned to for reporting purposes.", + "examples": [ + "client_template", + "00f3b388-bbe9-41c9-9e76-052d37ee8988_20a1ab22-6136-47ae-ac0f-989f382be8df" + ], + "type": "string" + }, + "status": { + "type": "string", + "enum": [ + "REJECTED" + ] + }, + "reasonCode": { + "title": "Reason Code", + "description": "Optional reason code for the status change, if applicable.", + "examples": [ + "R01", + "R08" + ], + "type": "string" + }, + "reasonText": { + "title": "Reason Text", + "description": "Optional human-readable reason for the status change, if applicable.", + "examples": [ + "Undeliverable", + "Recipient moved" + ], + "type": "string" + } + }, + "required": [ + "domainId", + "origin", + "specificationId", + "groupId", + "status" + ] + }, + "traceparent": { + "title": "Traceparent", + "description": "W3C Trace Context traceparent header value.", + "examples": [ + "00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01" + ], + "type": "string", + "minLength": 1, + "pattern": "^00-[0-9a-f]{32}-[0-9a-f]{16}-[0-9a-f]{2}$" + }, + "tracestate": { + "title": "Tracestate", + "description": "Optional W3C Trace Context tracestate header value.", + "examples": [ + "rojo=00f067aa0ba902b7,congo=t61rcWkgMzE" + ], + "type": "string" + }, + "partitionkey": { + "title": "Partition Key", + "description": "Partition / ordering key (lowercase alphanumerics and hyphen, 1-64 chars).", + "examples": [ + "customer-920fca11" + ], + "type": "string", + "minLength": 1, + "maxLength": 64, + "pattern": "^[a-z0-9-]+$" + }, + "recordedtime": { + "title": "Recorded Time", + "description": "Timestamp when the event was recorded/persisted (should be >= time).", + "examples": [ + "2025-10-01T10:15:30.250Z" + ], + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" + }, + "sampledrate": { + "title": "Sampled Rate", + "description": "Sampling factor: number of similar occurrences this event represents.", + "examples": [ + 5 + ], + "type": "integer", + "minimum": 1, + "maximum": 9007199254740991 + }, + "sequence": { + "title": "Sequence", + "description": "Zero-padded 20 digit numeric sequence (lexicographically sortable).", + "examples": [ + "00000000000000000042" + ], + "type": "string", + "pattern": "^\\d{20}$" + }, + "severitytext": { + "title": "Severity Text", + "description": "Log severity level name.", + "examples": [ + "DEBUG" + ], + "type": "string", + "enum": [ + "TRACE", + "DEBUG", + "INFO", + "WARN", + "ERROR", + "FATAL" + ] + }, + "severitynumber": { + "title": "Severity Number", + "description": "Numeric severity (TRACE=0, DEBUG=1, INFO=2, WARN=3, ERROR=4, FATAL=5).", + "examples": [ + 1 + ], + "type": "integer", + "minimum": 0, + "maximum": 5 + }, + "dataclassification": { + "title": "Data Classification", + "description": "Data sensitivity classification.", + "examples": [ + "restricted" + ], + "type": "string", + "enum": [ + "public", + "internal", + "confidential", + "restricted" + ] + }, + "dataregulation": { + "title": "Data Regulation", + "description": "Regulatory regime tag applied to this data.", + "examples": [ + "ISO-27001" + ], + "type": "string", + "enum": [ + "GDPR", + "HIPAA", + "PCI-DSS", + "ISO-27001", + "NIST-800-53", + "CCPA" + ] + }, + "datacategory": { + "title": "Data Category", + "description": "Data category classification (e.g. standard, special-category).", + "examples": [ + "sensitive" + ], + "type": "string", + "enum": [ + "non-sensitive", + "standard", + "sensitive", + "special-category" + ] + }, + "dataschemaversion": { + "title": "Data Schema Version", + "description": "Matches semantic versioning format with fixed major version (Not part of cloudevents spec?)", + "type": "string", + "pattern": "^1\\.\\d+\\.\\d+$" + } + }, + "required": [ + "specversion", + "id", + "source", + "subject", + "type", + "time", + "dataschema", + "data", + "traceparent", + "recordedtime", + "severitynumber", + "dataschemaversion" + ] +} \ No newline at end of file diff --git a/internal/events/schemas/events/letter.RETURNED.schema.json b/internal/events/schemas/events/letter.RETURNED.schema.json new file mode 100644 index 00000000..ca0f8fbf --- /dev/null +++ b/internal/events/schemas/events/letter.RETURNED.schema.json @@ -0,0 +1,329 @@ +{ + "title": "letter.RETURNED Event", + "description": "Event schema for letter status change to RETURNED", + "type": "object", + "properties": { + "specversion": { + "title": "CloudEvents spec version", + "description": "CloudEvents specification version (fixed to 1.0).", + "examples": [ + "1.0" + ], + "type": "string", + "enum": [ + "1.0" + ] + }, + "id": { + "title": "Event ID", + "description": "Unique identifier for this event instance (UUID).", + "examples": [ + "6f1c2a53-3d54-4a0a-9a0b-0e9ae2d4c111" + ], + "type": "string", + "minLength": 1, + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" + }, + "source": { + "title": "Event Source", + "description": "Logical event producer path within the supplier-api domain", + "type": "string", + "pattern": "^\\/data-plane\\/supplier-api(?:\\/.*)?$" + }, + "subject": { + "title": "Event Subject", + "description": "Resource path (no leading slash) within the source made of segments separated by '/'.", + "examples": [ + "letter-origin/letter-rendering/letter/f47ac10b-58cc-4372-a567-0e02b2c3d479" + ], + "type": "string", + "pattern": "^letter-origin\\/[a-z0-9-]+\\/letter\\/[^/]+(?:\\/.*)?" + }, + "type": { + "title": "Letter RETURNED event type", + "description": "Event type using reverse-DNS style", + "examples": [ + "uk.nhs.notify.supplier-api.letter.RETURNED.v1" + ], + "type": "string", + "enum": [ + "uk.nhs.notify.supplier-api.letter.RETURNED.v1" + ] + }, + "time": { + "title": "Event Time", + "description": "Timestamp when the event occurred (RFC 3339).", + "examples": [ + "2025-10-01T10:15:30.000Z" + ], + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" + }, + "datacontenttype": { + "title": "Data Content Type", + "description": "Media type for the data field (fixed to application/json).", + "examples": [ + "application/json" + ], + "type": "string", + "enum": [ + "application/json" + ] + }, + "dataschema": { + "title": "Data Schema URI", + "description": "URI of a schema that describes the event data\n\nData schema version must match the major version indicated by the type", + "examples": [ + "https://notify.nhs.uk/cloudevents/schemas/supplier-api/letter.ACCEPTED.1.0.0.schema.json" + ], + "type": "string", + "pattern": "^https:\\/\\/notify\\.nhs\\.uk\\/cloudevents\\/schemas\\/supplier-api\\/letter.RETURNED.1\\.\\d+\\.\\d+\\.schema.json$" + }, + "data": { + "type": "object", + "properties": { + "domainId": { + "type": "string" + }, + "origin": { + "title": "Letter origin", + "description": "Identifiers captured from the original event that introduced the letter to the supplier-api domain.\n\nThe identifier will be included as the origin domain in the subject of any corresponding events emitted by the supplier-api domain.", + "examples": [ + { + "domain": "letter-rendering", + "subject": "customer/00f3b388-bbe9-41c9-9e76-052d37ee8988/letter-rendering/letter-request/0o5Fs0EELR0fUjHjbCnEtdUwQe4_0o5Fs0EELR0fUjHjbCnEtdUwQe5", + "event": "00f3b388-bbe9-41c9-9e76-052d37ee8988" + } + ], + "type": "object", + "properties": { + "domain": { + "title": "Domain ID", + "description": "The domain which requested this letter", + "type": "string" + }, + "source": { + "title": "Event source", + "description": "The source of the event which created this letter", + "type": "string" + }, + "subject": { + "title": "Event subject", + "description": "The subject of the event which created this letter, scoped to source", + "type": "string" + }, + "event": { + "title": "Event ID", + "description": "The ID of the event which created this letter", + "type": "string" + } + }, + "required": [ + "domain", + "source", + "subject", + "event" + ] + }, + "specificationId": { + "title": "Specification ID", + "description": "Reference to the letter specification which was used to produce a letter pack for this request.", + "examples": [ + "1y3q9v1zzzz" + ], + "type": "string" + }, + "groupId": { + "title": "Group ID", + "description": "Identifier for the group which this letter assigned to for reporting purposes.", + "examples": [ + "client_template", + "00f3b388-bbe9-41c9-9e76-052d37ee8988_20a1ab22-6136-47ae-ac0f-989f382be8df" + ], + "type": "string" + }, + "status": { + "type": "string", + "enum": [ + "RETURNED" + ] + }, + "reasonCode": { + "title": "Reason Code", + "description": "Optional reason code for the status change, if applicable.", + "examples": [ + "R01", + "R08" + ], + "type": "string" + }, + "reasonText": { + "title": "Reason Text", + "description": "Optional human-readable reason for the status change, if applicable.", + "examples": [ + "Undeliverable", + "Recipient moved" + ], + "type": "string" + } + }, + "required": [ + "domainId", + "origin", + "specificationId", + "groupId", + "status" + ] + }, + "traceparent": { + "title": "Traceparent", + "description": "W3C Trace Context traceparent header value.", + "examples": [ + "00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01" + ], + "type": "string", + "minLength": 1, + "pattern": "^00-[0-9a-f]{32}-[0-9a-f]{16}-[0-9a-f]{2}$" + }, + "tracestate": { + "title": "Tracestate", + "description": "Optional W3C Trace Context tracestate header value.", + "examples": [ + "rojo=00f067aa0ba902b7,congo=t61rcWkgMzE" + ], + "type": "string" + }, + "partitionkey": { + "title": "Partition Key", + "description": "Partition / ordering key (lowercase alphanumerics and hyphen, 1-64 chars).", + "examples": [ + "customer-920fca11" + ], + "type": "string", + "minLength": 1, + "maxLength": 64, + "pattern": "^[a-z0-9-]+$" + }, + "recordedtime": { + "title": "Recorded Time", + "description": "Timestamp when the event was recorded/persisted (should be >= time).", + "examples": [ + "2025-10-01T10:15:30.250Z" + ], + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" + }, + "sampledrate": { + "title": "Sampled Rate", + "description": "Sampling factor: number of similar occurrences this event represents.", + "examples": [ + 5 + ], + "type": "integer", + "minimum": 1, + "maximum": 9007199254740991 + }, + "sequence": { + "title": "Sequence", + "description": "Zero-padded 20 digit numeric sequence (lexicographically sortable).", + "examples": [ + "00000000000000000042" + ], + "type": "string", + "pattern": "^\\d{20}$" + }, + "severitytext": { + "title": "Severity Text", + "description": "Log severity level name.", + "examples": [ + "DEBUG" + ], + "type": "string", + "enum": [ + "TRACE", + "DEBUG", + "INFO", + "WARN", + "ERROR", + "FATAL" + ] + }, + "severitynumber": { + "title": "Severity Number", + "description": "Numeric severity (TRACE=0, DEBUG=1, INFO=2, WARN=3, ERROR=4, FATAL=5).", + "examples": [ + 1 + ], + "type": "integer", + "minimum": 0, + "maximum": 5 + }, + "dataclassification": { + "title": "Data Classification", + "description": "Data sensitivity classification.", + "examples": [ + "restricted" + ], + "type": "string", + "enum": [ + "public", + "internal", + "confidential", + "restricted" + ] + }, + "dataregulation": { + "title": "Data Regulation", + "description": "Regulatory regime tag applied to this data.", + "examples": [ + "ISO-27001" + ], + "type": "string", + "enum": [ + "GDPR", + "HIPAA", + "PCI-DSS", + "ISO-27001", + "NIST-800-53", + "CCPA" + ] + }, + "datacategory": { + "title": "Data Category", + "description": "Data category classification (e.g. standard, special-category).", + "examples": [ + "sensitive" + ], + "type": "string", + "enum": [ + "non-sensitive", + "standard", + "sensitive", + "special-category" + ] + }, + "dataschemaversion": { + "title": "Data Schema Version", + "description": "Matches semantic versioning format with fixed major version (Not part of cloudevents spec?)", + "type": "string", + "pattern": "^1\\.\\d+\\.\\d+$" + } + }, + "required": [ + "specversion", + "id", + "source", + "subject", + "type", + "time", + "dataschema", + "data", + "traceparent", + "recordedtime", + "severitynumber", + "dataschemaversion" + ] +} \ No newline at end of file diff --git a/internal/events/schemas/events/letter.any.schema.json b/internal/events/schemas/events/letter.any.schema.json new file mode 100644 index 00000000..b5771b7a --- /dev/null +++ b/internal/events/schemas/events/letter.any.schema.json @@ -0,0 +1,358 @@ +{ + "title": "letter.* Event", + "description": "Event schema for generic letter status change", + "type": "object", + "properties": { + "specversion": { + "title": "CloudEvents spec version", + "description": "CloudEvents specification version (fixed to 1.0).", + "examples": [ + "1.0" + ], + "type": "string", + "enum": [ + "1.0" + ] + }, + "id": { + "title": "Event ID", + "description": "Unique identifier for this event instance (UUID).", + "examples": [ + "6f1c2a53-3d54-4a0a-9a0b-0e9ae2d4c111" + ], + "type": "string", + "minLength": 1, + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" + }, + "source": { + "title": "Event Source", + "description": "Logical event producer path within the supplier-api domain", + "type": "string", + "pattern": "^\\/data-plane\\/supplier-api(?:\\/.*)?$" + }, + "subject": { + "title": "Event Subject", + "description": "Resource path (no leading slash) within the source made of segments separated by '/'.", + "examples": [ + "letter-origin/letter-rendering/letter/f47ac10b-58cc-4372-a567-0e02b2c3d479" + ], + "type": "string", + "pattern": "^letter-origin\\/[a-z0-9-]+\\/letter\\/[^/]+(?:\\/.*)?" + }, + "type": { + "title": "Letter event type", + "description": "Event type using reverse-DNS style", + "examples": [ + "uk.nhs.notify.supplier-api.letter.PENDING.v1", + "uk.nhs.notify.supplier-api.letter.ACCEPTED.v1", + "uk.nhs.notify.supplier-api.letter.DISPATCHED.v1" + ], + "type": "string", + "enum": [ + "uk.nhs.notify.supplier-api.letter.PENDING.v1", + "uk.nhs.notify.supplier-api.letter.ACCEPTED.v1", + "uk.nhs.notify.supplier-api.letter.REJECTED.v1", + "uk.nhs.notify.supplier-api.letter.PRINTED.v1", + "uk.nhs.notify.supplier-api.letter.ENCLOSED.v1", + "uk.nhs.notify.supplier-api.letter.CANCELLED.v1", + "uk.nhs.notify.supplier-api.letter.DISPATCHED.v1", + "uk.nhs.notify.supplier-api.letter.FAILED.v1", + "uk.nhs.notify.supplier-api.letter.RETURNED.v1", + "uk.nhs.notify.supplier-api.letter.FORWARDED.v1", + "uk.nhs.notify.supplier-api.letter.DELIVERED.v1" + ] + }, + "time": { + "title": "Event Time", + "description": "Timestamp when the event occurred (RFC 3339).", + "examples": [ + "2025-10-01T10:15:30.000Z" + ], + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" + }, + "datacontenttype": { + "title": "Data Content Type", + "description": "Media type for the data field (fixed to application/json).", + "examples": [ + "application/json" + ], + "type": "string", + "enum": [ + "application/json" + ] + }, + "dataschema": { + "title": "Data Schema URI", + "description": "URI of a schema that describes the event data\n\nData schema version must match the major version indicated by the type", + "examples": [ + "https://notify.nhs.uk/cloudevents/schemas/supplier-api/letter.ACCEPTED.1.0.0.schema.json" + ], + "type": "string", + "pattern": "^https:\\/\\/notify\\.nhs\\.uk\\/cloudevents\\/schemas\\/supplier-api\\/letter\\.(?PENDING|ACCEPTED|REJECTED|PRINTED|ENCLOSED|CANCELLED|DISPATCHED|FAILED|RETURNED|FORWARDED|DELIVERED)\\.1\\.\\d+\\.\\d+\\.schema.json$" + }, + "data": { + "type": "object", + "properties": { + "domainId": { + "type": "string" + }, + "origin": { + "title": "Letter origin", + "description": "Identifiers captured from the original event that introduced the letter to the supplier-api domain.\n\nThe identifier will be included as the origin domain in the subject of any corresponding events emitted by the supplier-api domain.", + "examples": [ + { + "domain": "letter-rendering", + "subject": "customer/00f3b388-bbe9-41c9-9e76-052d37ee8988/letter-rendering/letter-request/0o5Fs0EELR0fUjHjbCnEtdUwQe4_0o5Fs0EELR0fUjHjbCnEtdUwQe5", + "event": "00f3b388-bbe9-41c9-9e76-052d37ee8988" + } + ], + "type": "object", + "properties": { + "domain": { + "title": "Domain ID", + "description": "The domain which requested this letter", + "type": "string" + }, + "source": { + "title": "Event source", + "description": "The source of the event which created this letter", + "type": "string" + }, + "subject": { + "title": "Event subject", + "description": "The subject of the event which created this letter, scoped to source", + "type": "string" + }, + "event": { + "title": "Event ID", + "description": "The ID of the event which created this letter", + "type": "string" + } + }, + "required": [ + "domain", + "source", + "subject", + "event" + ] + }, + "specificationId": { + "title": "Specification ID", + "description": "Reference to the letter specification which was used to produce a letter pack for this request.", + "examples": [ + "1y3q9v1zzzz" + ], + "type": "string" + }, + "groupId": { + "title": "Group ID", + "description": "Identifier for the group which this letter assigned to for reporting purposes.", + "examples": [ + "client_template", + "00f3b388-bbe9-41c9-9e76-052d37ee8988_20a1ab22-6136-47ae-ac0f-989f382be8df" + ], + "type": "string" + }, + "status": { + "title": "Letter Status", + "description": "The status of a letter in the supplier-api domain.", + "examples": [ + "ACCEPTED", + "REJECTED", + "PRINTED" + ], + "type": "string", + "enum": [ + "PENDING", + "ACCEPTED", + "REJECTED", + "PRINTED", + "ENCLOSED", + "CANCELLED", + "DISPATCHED", + "FAILED", + "RETURNED", + "FORWARDED", + "DELIVERED" + ] + }, + "reasonCode": { + "title": "Reason Code", + "description": "Optional reason code for the status change, if applicable.", + "examples": [ + "R01", + "R08" + ], + "type": "string" + }, + "reasonText": { + "title": "Reason Text", + "description": "Optional human-readable reason for the status change, if applicable.", + "examples": [ + "Undeliverable", + "Recipient moved" + ], + "type": "string" + } + }, + "required": [ + "domainId", + "origin", + "specificationId", + "groupId", + "status" + ] + }, + "traceparent": { + "title": "Traceparent", + "description": "W3C Trace Context traceparent header value.", + "examples": [ + "00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01" + ], + "type": "string", + "minLength": 1, + "pattern": "^00-[0-9a-f]{32}-[0-9a-f]{16}-[0-9a-f]{2}$" + }, + "tracestate": { + "title": "Tracestate", + "description": "Optional W3C Trace Context tracestate header value.", + "examples": [ + "rojo=00f067aa0ba902b7,congo=t61rcWkgMzE" + ], + "type": "string" + }, + "partitionkey": { + "title": "Partition Key", + "description": "Partition / ordering key (lowercase alphanumerics and hyphen, 1-64 chars).", + "examples": [ + "customer-920fca11" + ], + "type": "string", + "minLength": 1, + "maxLength": 64, + "pattern": "^[a-z0-9-]+$" + }, + "recordedtime": { + "title": "Recorded Time", + "description": "Timestamp when the event was recorded/persisted (should be >= time).", + "examples": [ + "2025-10-01T10:15:30.250Z" + ], + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" + }, + "sampledrate": { + "title": "Sampled Rate", + "description": "Sampling factor: number of similar occurrences this event represents.", + "examples": [ + 5 + ], + "type": "integer", + "minimum": 1, + "maximum": 9007199254740991 + }, + "sequence": { + "title": "Sequence", + "description": "Zero-padded 20 digit numeric sequence (lexicographically sortable).", + "examples": [ + "00000000000000000042" + ], + "type": "string", + "pattern": "^\\d{20}$" + }, + "severitytext": { + "title": "Severity Text", + "description": "Log severity level name.", + "examples": [ + "DEBUG" + ], + "type": "string", + "enum": [ + "TRACE", + "DEBUG", + "INFO", + "WARN", + "ERROR", + "FATAL" + ] + }, + "severitynumber": { + "title": "Severity Number", + "description": "Numeric severity (TRACE=0, DEBUG=1, INFO=2, WARN=3, ERROR=4, FATAL=5).", + "examples": [ + 1 + ], + "type": "integer", + "minimum": 0, + "maximum": 5 + }, + "dataclassification": { + "title": "Data Classification", + "description": "Data sensitivity classification.", + "examples": [ + "restricted" + ], + "type": "string", + "enum": [ + "public", + "internal", + "confidential", + "restricted" + ] + }, + "dataregulation": { + "title": "Data Regulation", + "description": "Regulatory regime tag applied to this data.", + "examples": [ + "ISO-27001" + ], + "type": "string", + "enum": [ + "GDPR", + "HIPAA", + "PCI-DSS", + "ISO-27001", + "NIST-800-53", + "CCPA" + ] + }, + "datacategory": { + "title": "Data Category", + "description": "Data category classification (e.g. standard, special-category).", + "examples": [ + "sensitive" + ], + "type": "string", + "enum": [ + "non-sensitive", + "standard", + "sensitive", + "special-category" + ] + }, + "dataschemaversion": { + "title": "Data Schema Version", + "description": "Matches semantic versioning format with fixed major version (Not part of cloudevents spec?)", + "type": "string", + "pattern": "^1\\.\\d+\\.\\d+$" + } + }, + "required": [ + "specversion", + "id", + "source", + "subject", + "type", + "time", + "dataschema", + "data", + "traceparent", + "recordedtime", + "severitynumber", + "dataschemaversion" + ] +} \ No newline at end of file diff --git a/internal/events/schemas/examples/letter.ACCEPTED.json b/internal/events/schemas/examples/letter.ACCEPTED.json new file mode 100644 index 00000000..7d22e413 --- /dev/null +++ b/internal/events/schemas/examples/letter.ACCEPTED.json @@ -0,0 +1,27 @@ +{ + "data": { + "domainId": "f47ac10b-58cc-4372-a567-0e02b2c3d479", + "groupId": "client_template", + "origin": { + "domain": "letter-rendering", + "event": "f47ac10b-58cc-4372-a567-0e02b2c3d479", + "source": "/data-plane/letter-rendering/prod/render-pdf", + "subject": "client/00f3b388-bbe9-41c9-9e76-052d37ee8988/letter-request/0o5Fs0EELR0fUjHjbCnEtdUwQe4_0o5Fs0EELR0fUjHjbCnEtdUwQe5" + }, + "specificationId": "1y3q9v1zzzz", + "status": "ACCEPTED" + }, + "datacontenttype": "application/json", + "dataschema": "https://notify.nhs.uk/cloudevents/schemas/supplier-api/letter.ACCEPTED.1.0.0.schema.json", + "dataschemaversion": "1.0.0", + "id": "23f1f09c-a555-4d9b-8405-0b33490bc920", + "recordedtime": "2025-08-28T08:45:00.000Z", + "severitynumber": 2, + "severitytext": "INFO", + "source": "/data-plane/supplier-api/prod/update-status", + "specversion": "1.0", + "subject": "letter-origin/letter-rendering/letter/f47ac10b-58cc-4372-a567-0e02b2c3d479", + "time": "2025-08-28T08:45:00.000Z", + "traceparent": "00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01", + "type": "uk.nhs.notify.supplier-api.letter.ACCEPTED.v1" +} diff --git a/internal/events/schemas/examples/letter.FORWARDED.json b/internal/events/schemas/examples/letter.FORWARDED.json new file mode 100644 index 00000000..0f21ca06 --- /dev/null +++ b/internal/events/schemas/examples/letter.FORWARDED.json @@ -0,0 +1,29 @@ +{ + "data": { + "domainId": "f47ac10b-58cc-4372-a567-0e02b2c3d479", + "groupId": "client_template", + "origin": { + "domain": "letter-rendering", + "event": "f47ac10b-58cc-4372-a567-0e02b2c3d479", + "source": "/data-plane/letter-rendering/prod/render-pdf", + "subject": "client/00f3b388-bbe9-41c9-9e76-052d37ee8988/letter-request/0o5Fs0EELR0fUjHjbCnEtdUwQe4_0o5Fs0EELR0fUjHjbCnEtdUwQe5" + }, + "reasonCode": "RNIB", + "reasonText": "RNIB", + "specificationId": "1y3q9v1zzzz", + "status": "FORWARDED" + }, + "datacontenttype": "application/json", + "dataschema": "https://notify.nhs.uk/cloudevents/schemas/supplier-api/letter.FORWARDED.1.0.0.schema.json", + "dataschemaversion": "1.0.0", + "id": "23f1f09c-a555-4d9b-8405-0b33490bc920", + "recordedtime": "2025-08-28T08:45:00.000Z", + "severitynumber": 2, + "severitytext": "INFO", + "source": "/data-plane/supplier-api/prod/update-status", + "specversion": "1.0", + "subject": "letter-origin/letter-rendering/letter/f47ac10b-58cc-4372-a567-0e02b2c3d479", + "time": "2025-08-28T08:45:00.000Z", + "traceparent": "00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01", + "type": "uk.nhs.notify.supplier-api.letter.FORWARDED.v1" +} diff --git a/internal/events/schemas/examples/letter.RETURNED.json b/internal/events/schemas/examples/letter.RETURNED.json new file mode 100644 index 00000000..ba818ef6 --- /dev/null +++ b/internal/events/schemas/examples/letter.RETURNED.json @@ -0,0 +1,29 @@ +{ + "data": { + "domainId": "f47ac10b-58cc-4372-a567-0e02b2c3d479", + "groupId": "client_template", + "origin": { + "domain": "letter-rendering", + "event": "f47ac10b-58cc-4372-a567-0e02b2c3d479", + "source": "/data-plane/letter-rendering/prod/render-pdf", + "subject": "client/00f3b388-bbe9-41c9-9e76-052d37ee8988/letter-request/0o5Fs0EELR0fUjHjbCnEtdUwQe4_0o5Fs0EELR0fUjHjbCnEtdUwQe5" + }, + "reasonCode": "R07", + "reasonText": "No such address", + "specificationId": "1y3q9v1zzzz", + "status": "RETURNED" + }, + "datacontenttype": "application/json", + "dataschema": "https://notify.nhs.uk/cloudevents/schemas/supplier-api/letter.RETURNED.1.0.0.schema.json", + "dataschemaversion": "1.0.0", + "id": "23f1f09c-a555-4d9b-8405-0b33490bc920", + "recordedtime": "2025-08-28T08:45:00.000Z", + "severitynumber": 2, + "severitytext": "INFO", + "source": "/data-plane/supplier-api/prod/update-status", + "specversion": "1.0", + "subject": "letter-origin/letter-rendering/letter/f47ac10b-58cc-4372-a567-0e02b2c3d479", + "time": "2025-08-28T08:45:00.000Z", + "traceparent": "00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01", + "type": "uk.nhs.notify.supplier-api.letter.RETURNED.v1" +} diff --git a/internal/events/schemas/supplier-api.yaml b/internal/events/schemas/supplier-api.yaml new file mode 100644 index 00000000..d9d660da --- /dev/null +++ b/internal/events/schemas/supplier-api.yaml @@ -0,0 +1,184 @@ +--- +asyncapi: '3.0.0' +info: + title: NHS Notify Supplier API Events + version: 1.x + description: Events generated by the supplier-api bounded context +defaultContentType: application/json + +channels: + data-plane: + title: Data Plane + description: Events relating to message delivery + messages: + letter-accepted: + $ref: '#/components/messages/letter-accepted' + letter-cancelled: + $ref: '#/components/messages/letter-cancelled' + letter-delivered: + $ref: '#/components/messages/letter-delivered' + letter-dispatched: + $ref: '#/components/messages/letter-dispatched' + letter-enclosed: + $ref: '#/components/messages/letter-enclosed' + letter-failed: + $ref: '#/components/messages/letter-failed' + letter-forwarded: + $ref: '#/components/messages/letter-forwarded' + letter-pending: + $ref: '#/components/messages/letter-pending' + letter-printed: + $ref: '#/components/messages/letter-printed' + letter-rejected: + $ref: '#/components/messages/letter-rejected' + letter-returned: + $ref: '#/components/messages/letter-returned' + letter-any: + $ref: '#/components/messages/letter-any' + +components: + messages: + letter-accepted: + name: letter-accepted + title: Letter Status Accepted + summary: | + A letter status has been updated to accepted. + + This indicates that a letter has been accepted for processing by a supplier. + contentType: application/json + payload: + $ref: './events/letter.ACCEPTED.schema.json' + examples: + - payload: + $ref: './examples/letter.ACCEPTED.json' + + letter-cancelled: + name: letter-cancelled + title: Letter Status Cancelled + summary: | + A letter status has been updated to cancelled. + + This indicates that a letter has been cancelled and will not be printed or dispatched. + contentType: application/json + payload: + $ref: './events/letter.CANCELLED.schema.json' + + letter-delivered: + name: letter-delivered + title: Letter Status Delivered + summary: | + A letter status has been updated to delivered. + + This indicates that a letter has been delivered to the recipient. + contentType: application/json + payload: + $ref: './events/letter.DELIVERED.schema.json' + + letter-dispatched: + name: letter-dispatched + title: Letter Status Dispatched + summary: | + A letter status has been updated to dispatched. + + This indicates that a letter has been dispatched from the supplier to a down-stream access (DSA) provider. + contentType: application/json + payload: + $ref: './events/letter.DISPATCHED.schema.json' + + letter-enclosed: + name: letter-enclosed + title: Letter Status Enclosed + summary: | + A letter status has been updated to enclosed. + + This indicates that a letter has been printed and packaged in an envelope. + contentType: application/json + payload: + $ref: './events/letter.ENCLOSED.schema.json' + + letter-failed: + name: letter-failed + title: Letter Status Failed + summary: | + A letter status has been updated to failed. + + This indicates that a letter has failed to be processed by a supplier. + contentType: application/json + payload: + $ref: './events/letter.FAILED.schema.json' + + letter-forwarded: + name: letter-forwarded + title: Letter Status Forwarded + summary: | + A letter status has been updated to forwarded. + + This indicates that a letter has been forwarded to another supplier for processing. + contentType: application/json + payload: + $ref: './events/letter.FORWARDED.schema.json' + examples: + - payload: + $ref: './examples/letter.FORWARDED.json' + + letter-pending: + name: letter-pending + title: Letter Status Pending + summary: | + A letter status has been updated to pending. + + This indicates that a letter has been queued for processing by a supplier. + contentType: application/json + payload: + $ref: './events/letter.PENDING.schema.json' + + letter-printed: + name: letter-printed + title: Letter Status Printed + summary: | + A letter status has been updated to printed. + + This indicates that a letter has been printed by the supplier. + contentType: application/json + payload: + $ref: './events/letter.PRINTED.schema.json' + + letter-rejected: + name: letter-rejected + title: Letter Status Rejected + summary: | + A letter status has been updated to rejected. + + This indicates that a letter has been rejected by the supplier and will not be processed. + contentType: application/json + payload: + $ref: './events/letter.REJECTED.schema.json' + + letter-returned: + name: letter-returned + title: Letter Status Returned + summary: | + A letter status has been updated to returned. + + This indicates that a letter has been returned to the supplier. + contentType: application/json + payload: + $ref: './events/letter.RETURNED.schema.json' + examples: + - payload: + $ref: './examples/letter.RETURNED.json' + + letter-any: + name: letter-any + title: Letter Status Changed + summary: | + A letter status has been updated. + + This is a generic schema which matches any status change. + contentType: application/json + payload: + $ref: './events/letter.any.schema.json' + + schemas: + letter: + $ref: './domain/letter.schema.json' diff --git a/internal/events/src/cli/bundle-asyncapi.ts b/internal/events/src/cli/bundle-asyncapi.ts new file mode 100644 index 00000000..48a130ae --- /dev/null +++ b/internal/events/src/cli/bundle-asyncapi.ts @@ -0,0 +1,22 @@ +import { writeFileSync } from "node:fs"; +import bundle from "@asyncapi/bundler"; +import path from "node:path"; +import { version as packageVersion } from "@nhsdigital/nhs-notify-event-schemas-supplier-api/package.json"; + +async function main() { + const baseDir = path.resolve(process.cwd(), ".."); + const document = await bundle(["events/schemas/supplier-api.yaml"], { + baseDir, + xOrigin: true, + }); + const info = document.json()?.info; + if (info) { + info.version = packageVersion; + } + const bundledOutput = document.yml(); + if (bundledOutput) { + writeFileSync("dist/asyncapi/supplier-api.yaml", bundledOutput); // the complete bundled AsyncAPI document + } +} + +main().catch((error) => console.error(error)); diff --git a/internal/events/src/cli/generate-json.ts b/internal/events/src/cli/generate-json.ts new file mode 100644 index 00000000..42d4edf7 --- /dev/null +++ b/internal/events/src/cli/generate-json.ts @@ -0,0 +1,44 @@ +import { z } from "zod"; +import * as fs from "node:fs"; +import { $Letter } from "@nhsdigital/nhs-notify-event-schemas-supplier-api/src/domain/letter"; +import { + $LetterEvent, + letterEventMap, +} from "@nhsdigital/nhs-notify-event-schemas-supplier-api/src/events/letter-events"; + +for (const [key, schema] of Object.entries({ + letter: $Letter, +})) { + const json = z.toJSONSchema(schema, { + io: "input", + target: "openapi-3.0", + reused: "ref", + }); + fs.mkdirSync("schemas/domain", { recursive: true }); + const file = `schemas/domain/${key}.schema.json`; + fs.writeFileSync(file, JSON.stringify(json, null, 2)); + console.info(`Wrote JSON schema for ${key} to ${file}`); +} + +for (const [key, schema] of Object.entries(letterEventMap)) { + const json = z.toJSONSchema(schema, { + io: "input", + target: "openapi-3.0", + reused: "ref", + }); + fs.mkdirSync("schemas/events", { recursive: true }); + const file = `schemas/events/${key}.schema.json`; + fs.writeFileSync(file, JSON.stringify(json, null, 2)); + console.info(`Wrote JSON schema for ${key} to ${file}`); +} + +// Generic letter status change event schema +const json = z.toJSONSchema($LetterEvent, { + io: "input", + target: "openapi-3.0", + reused: "ref", +}); +fs.mkdirSync("schemas/events", { recursive: true }); +const file = `schemas/events/letter.any.schema.json`; +fs.writeFileSync(file, JSON.stringify(json, null, 2)); +console.info(`Wrote JSON schema for letter.any to ${file}`); diff --git a/internal/events/src/domain/letter.ts b/internal/events/src/domain/letter.ts new file mode 100644 index 00000000..46590ce2 --- /dev/null +++ b/internal/events/src/domain/letter.ts @@ -0,0 +1,110 @@ +import { z } from "zod"; +import { DomainBase } from "@internal/helpers"; + +/** + * Status values for letters in the supplier-api domain + */ +export const $LetterStatus = z + .enum([ + "PENDING", + "ACCEPTED", + "REJECTED", + "PRINTED", + "ENCLOSED", + "CANCELLED", + "DISPATCHED", + "FAILED", + "RETURNED", + "FORWARDED", + "DELIVERED", + ]) + .meta({ + title: "Letter Status", + description: "The status of a letter in the supplier-api domain.", + examples: ["ACCEPTED", "REJECTED", "PRINTED"], + }); + +export type LetterStatus = z.infer; + +/** + * Schema for letter status change events + */ +export const $Letter = DomainBase("Letter") + .extend({ + origin: z + .object({ + domain: z.string().meta({ + title: "Domain ID", + description: "The domain which requested this letter", + }), + source: z.string().meta({ + title: "Event source", + description: "The source of the event which created this letter", + }), + subject: z.string().meta({ + title: "Event subject", + description: + "The subject of the event which created this letter, scoped to source", + }), + event: z.string().meta({ + title: "Event ID", + description: "The ID of the event which created this letter", + }), + }) + .meta({ + title: "Letter origin", + description: `Identifiers captured from the original event that introduced the letter to the supplier-api domain. + +The identifier will be included as the origin domain in the subject of any corresponding events emitted by the supplier-api domain.`, + examples: [ + { + domain: "letter-rendering", + subject: + "customer/00f3b388-bbe9-41c9-9e76-052d37ee8988/letter-rendering/letter-request/0o5Fs0EELR0fUjHjbCnEtdUwQe4_0o5Fs0EELR0fUjHjbCnEtdUwQe5", + event: "00f3b388-bbe9-41c9-9e76-052d37ee8988", + }, + ], + }), + specificationId: z.string().meta({ + title: "Specification ID", + description: + "Reference to the letter specification which was used to produce a letter pack for this request.", + examples: ["1y3q9v1zzzz"], + }), + groupId: z.string().meta({ + title: "Group ID", + description: + "Identifier for the group which this letter assigned to for reporting purposes.", + examples: [ + "client_template", + "00f3b388-bbe9-41c9-9e76-052d37ee8988_20a1ab22-6136-47ae-ac0f-989f382be8df", + ], + }), + status: $LetterStatus, + reasonCode: z + .string() + .optional() + .meta({ + title: "Reason Code", + description: + "Optional reason code for the status change, if applicable.", + examples: ["R01", "R08"], + }), + reasonText: z + .string() + .optional() + .meta({ + title: "Reason Text", + description: + "Optional human-readable reason for the status change, if applicable.", + examples: ["Undeliverable", "Recipient moved"], + }), + }) + .meta({ + title: "Letter", + description: `The status of a letter in the supplier-api domain. + +This will include the current production status, any reason provided for the status, if applicable, and identifiers used for grouping in reports.`, + }); + +export type Letter = z.infer; diff --git a/internal/events/src/events/__tests__/letter-status-change-events.test.ts b/internal/events/src/events/__tests__/letter-status-change-events.test.ts new file mode 100644 index 00000000..37a781e0 --- /dev/null +++ b/internal/events/src/events/__tests__/letter-status-change-events.test.ts @@ -0,0 +1,88 @@ +import fs from "node:fs"; +import path from "node:path"; +import { letterEventMap } from "@nhsdigital/nhs-notify-event-schemas-supplier-api/src/events/letter-events"; + +function readJson(filename: string): unknown { + const filePath = path.resolve(__dirname, "./testData/", filename); + + return JSON.parse(fs.readFileSync(filePath, "utf8")); +} + +describe("LetterStatus event validations", () => { + it.each(["ACCEPTED", "FORWARDED", "RETURNED"])( + "should parse %s letter statuses successfully", + (status) => { + const json = readJson(`letter.${status}.json`); + + const event = letterEventMap[`letter.${status}`].parse(json); + expect(event).toBeDefined(); + expect(event).toEqual( + expect.objectContaining({ + type: `uk.nhs.notify.supplier-api.letter.${status}.v1`, + specversion: "1.0", + source: "/data-plane/supplier-api/prod/update-status", + id: "23f1f09c-a555-4d9b-8405-0b33490bc920", + time: "2025-08-28T08:45:00.000Z", + datacontenttype: "application/json", + dataschema: `https://notify.nhs.uk/cloudevents/schemas/supplier-api/letter.${status}.1.0.0.schema.json`, + dataschemaversion: "1.0.0", + subject: + "letter-origin/letter-rendering/letter/f47ac10b-58cc-4372-a567-0e02b2c3d479", + data: expect.objectContaining({ + origin: expect.objectContaining({ + subject: + "client/00f3b388-bbe9-41c9-9e76-052d37ee8988/letter-request/0o5Fs0EELR0fUjHjbCnEtdUwQe4_0o5Fs0EELR0fUjHjbCnEtdUwQe5", + event: "f47ac10b-58cc-4372-a567-0e02b2c3d479", + }), + domainId: "f47ac10b-58cc-4372-a567-0e02b2c3d479", + specificationId: "1y3q9v1zzzz", + groupId: "client_template", + status, + }), + }), + ); + }, + ); + + it("should parse reason code and text correctly for returned mail", () => { + const json = readJson("letter.RETURNED.json"); + + const event = letterEventMap["letter.RETURNED"].parse(json); + expect(event).toBeDefined(); + expect(event.data).toEqual( + expect.objectContaining({ + reasonCode: "R07", + reasonText: "No such address", + }), + ); + }); + + it("should parse reason code and text correctly for forwarded mail", () => { + const json = readJson("letter.FORWARDED.json"); + + const event = letterEventMap["letter.FORWARDED"].parse(json); + expect(event).toBeDefined(); + expect(event.data).toEqual( + expect.objectContaining({ + reasonCode: "RNIB", + reasonText: "RNIB", + }), + ); + }); + + it("should throw error for letter.ACCEPTED event with missing sourceSubject", () => { + const json = readJson("letter.ACCEPTED-with-missing-fields.json"); + + expect(() => letterEventMap["letter.ACCEPTED"].parse(json)).toThrow( + "subject", + ); + }); + + it("should throw error for letter.ACCEPTED event with invalid major schema version", () => { + const json = readJson("letter.ACCEPTED-with-invalid-major-version.json"); + + expect(() => letterEventMap["letter.ACCEPTED"].parse(json)).toThrow( + "dataschemaversion", + ); + }); +}); diff --git a/internal/events/src/events/__tests__/testData/letter.ACCEPTED-with-invalid-major-version.json b/internal/events/src/events/__tests__/testData/letter.ACCEPTED-with-invalid-major-version.json new file mode 100644 index 00000000..137734a2 --- /dev/null +++ b/internal/events/src/events/__tests__/testData/letter.ACCEPTED-with-invalid-major-version.json @@ -0,0 +1,27 @@ +{ + "data": { + "domainId": "f47ac10b-58cc-4372-a567-0e02b2c3d479", + "groupId": "client_template", + "origin": { + "domain": "letter-rendering", + "event": "f47ac10b-58cc-4372-a567-0e02b2c3d479", + "source": "/data-plane/letter-rendering/prod/render-pdf", + "subject": "client/00f3b388-bbe9-41c9-9e76-052d37ee8988/letter-request/0o5Fs0EELR0fUjHjbCnEtdUwQe4_0o5Fs0EELR0fUjHjbCnEtdUwQe5" + }, + "specificationId": "1y3q9v1zzzz", + "status": "ACCEPTED" + }, + "datacontenttype": "application/json", + "dataschema": "https://notify.nhs.uk/cloudevents/schemas/supplier-api/letter.ACCEPTED.1.0.0.schema.json", + "dataschemaversion": "0.1.0", + "id": "23f1f09c-a555-4d9b-8405-0b33490bc920", + "recordedtime": "2025-08-28T08:45:00.000Z", + "severitynumber": 2, + "severitytext": "INFO", + "source": "/data-plane/supplier-api/prod/update-status", + "specversion": "1.0", + "subject": "letter-origin/letter-rendering/letter/f47ac10b-58cc-4372-a567-0e02b2c3d479", + "time": "2025-08-28T08:45:00.000Z", + "traceparent": "00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01", + "type": "uk.nhs.notify.supplier-api.letter.ACCEPTED.v1" +} diff --git a/internal/events/src/events/__tests__/testData/letter.ACCEPTED-with-missing-fields.json b/internal/events/src/events/__tests__/testData/letter.ACCEPTED-with-missing-fields.json new file mode 100644 index 00000000..61872468 --- /dev/null +++ b/internal/events/src/events/__tests__/testData/letter.ACCEPTED-with-missing-fields.json @@ -0,0 +1,26 @@ +{ + "data": { + "domainId": "f47ac10b-58cc-4372-a567-0e02b2c3d479", + "groupId": "client_template", + "origin": { + "domain": "letter-rendering", + "event": "f47ac10b-58cc-4372-a567-0e02b2c3d479", + "source": "/data-plane/letter-rendering/prod/render-pdf" + }, + "specificationId": "1y3q9v1zzzz", + "status": "ACCEPTED" + }, + "datacontenttype": "application/json", + "dataschema": "https://notify.nhs.uk/cloudevents/schemas/supplier-api/letter.ACCEPTED.1.0.0.schema.json", + "dataschemaversion": "1.0.0", + "id": "23f1f09c-a555-4d9b-8405-0b33490bc920", + "recordedtime": "2025-08-28T08:45:00.000Z", + "severitynumber": 2, + "severitytext": "INFO", + "source": "/data-plane/supplier-api/prod/update-status", + "specversion": "1.0", + "subject": "letter-origin/letter-rendering/letter/f47ac10b-58cc-4372-a567-0e02b2c3d479", + "time": "2025-08-28T08:45:00.000Z", + "traceparent": "00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01", + "type": "uk.nhs.notify.supplier-api.letter.ACCEPTED.v1" +} diff --git a/internal/events/src/events/__tests__/testData/letter.ACCEPTED.json b/internal/events/src/events/__tests__/testData/letter.ACCEPTED.json new file mode 100644 index 00000000..7d22e413 --- /dev/null +++ b/internal/events/src/events/__tests__/testData/letter.ACCEPTED.json @@ -0,0 +1,27 @@ +{ + "data": { + "domainId": "f47ac10b-58cc-4372-a567-0e02b2c3d479", + "groupId": "client_template", + "origin": { + "domain": "letter-rendering", + "event": "f47ac10b-58cc-4372-a567-0e02b2c3d479", + "source": "/data-plane/letter-rendering/prod/render-pdf", + "subject": "client/00f3b388-bbe9-41c9-9e76-052d37ee8988/letter-request/0o5Fs0EELR0fUjHjbCnEtdUwQe4_0o5Fs0EELR0fUjHjbCnEtdUwQe5" + }, + "specificationId": "1y3q9v1zzzz", + "status": "ACCEPTED" + }, + "datacontenttype": "application/json", + "dataschema": "https://notify.nhs.uk/cloudevents/schemas/supplier-api/letter.ACCEPTED.1.0.0.schema.json", + "dataschemaversion": "1.0.0", + "id": "23f1f09c-a555-4d9b-8405-0b33490bc920", + "recordedtime": "2025-08-28T08:45:00.000Z", + "severitynumber": 2, + "severitytext": "INFO", + "source": "/data-plane/supplier-api/prod/update-status", + "specversion": "1.0", + "subject": "letter-origin/letter-rendering/letter/f47ac10b-58cc-4372-a567-0e02b2c3d479", + "time": "2025-08-28T08:45:00.000Z", + "traceparent": "00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01", + "type": "uk.nhs.notify.supplier-api.letter.ACCEPTED.v1" +} diff --git a/internal/events/src/events/__tests__/testData/letter.FORWARDED.json b/internal/events/src/events/__tests__/testData/letter.FORWARDED.json new file mode 100644 index 00000000..0f21ca06 --- /dev/null +++ b/internal/events/src/events/__tests__/testData/letter.FORWARDED.json @@ -0,0 +1,29 @@ +{ + "data": { + "domainId": "f47ac10b-58cc-4372-a567-0e02b2c3d479", + "groupId": "client_template", + "origin": { + "domain": "letter-rendering", + "event": "f47ac10b-58cc-4372-a567-0e02b2c3d479", + "source": "/data-plane/letter-rendering/prod/render-pdf", + "subject": "client/00f3b388-bbe9-41c9-9e76-052d37ee8988/letter-request/0o5Fs0EELR0fUjHjbCnEtdUwQe4_0o5Fs0EELR0fUjHjbCnEtdUwQe5" + }, + "reasonCode": "RNIB", + "reasonText": "RNIB", + "specificationId": "1y3q9v1zzzz", + "status": "FORWARDED" + }, + "datacontenttype": "application/json", + "dataschema": "https://notify.nhs.uk/cloudevents/schemas/supplier-api/letter.FORWARDED.1.0.0.schema.json", + "dataschemaversion": "1.0.0", + "id": "23f1f09c-a555-4d9b-8405-0b33490bc920", + "recordedtime": "2025-08-28T08:45:00.000Z", + "severitynumber": 2, + "severitytext": "INFO", + "source": "/data-plane/supplier-api/prod/update-status", + "specversion": "1.0", + "subject": "letter-origin/letter-rendering/letter/f47ac10b-58cc-4372-a567-0e02b2c3d479", + "time": "2025-08-28T08:45:00.000Z", + "traceparent": "00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01", + "type": "uk.nhs.notify.supplier-api.letter.FORWARDED.v1" +} diff --git a/internal/events/src/events/__tests__/testData/letter.RETURNED.json b/internal/events/src/events/__tests__/testData/letter.RETURNED.json new file mode 100644 index 00000000..ba818ef6 --- /dev/null +++ b/internal/events/src/events/__tests__/testData/letter.RETURNED.json @@ -0,0 +1,29 @@ +{ + "data": { + "domainId": "f47ac10b-58cc-4372-a567-0e02b2c3d479", + "groupId": "client_template", + "origin": { + "domain": "letter-rendering", + "event": "f47ac10b-58cc-4372-a567-0e02b2c3d479", + "source": "/data-plane/letter-rendering/prod/render-pdf", + "subject": "client/00f3b388-bbe9-41c9-9e76-052d37ee8988/letter-request/0o5Fs0EELR0fUjHjbCnEtdUwQe4_0o5Fs0EELR0fUjHjbCnEtdUwQe5" + }, + "reasonCode": "R07", + "reasonText": "No such address", + "specificationId": "1y3q9v1zzzz", + "status": "RETURNED" + }, + "datacontenttype": "application/json", + "dataschema": "https://notify.nhs.uk/cloudevents/schemas/supplier-api/letter.RETURNED.1.0.0.schema.json", + "dataschemaversion": "1.0.0", + "id": "23f1f09c-a555-4d9b-8405-0b33490bc920", + "recordedtime": "2025-08-28T08:45:00.000Z", + "severitynumber": 2, + "severitytext": "INFO", + "source": "/data-plane/supplier-api/prod/update-status", + "specversion": "1.0", + "subject": "letter-origin/letter-rendering/letter/f47ac10b-58cc-4372-a567-0e02b2c3d479", + "time": "2025-08-28T08:45:00.000Z", + "traceparent": "00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01", + "type": "uk.nhs.notify.supplier-api.letter.RETURNED.v1" +} diff --git a/internal/events/src/events/envelope-profile.ts b/internal/events/src/events/envelope-profile.ts new file mode 100644 index 00000000..06535b90 --- /dev/null +++ b/internal/events/src/events/envelope-profile.ts @@ -0,0 +1,237 @@ +import { z } from "zod"; + +export const $EnvelopeProfile = z + .object({ + specversion: z.literal("1.0").meta({ + title: "CloudEvents spec version", + description: "CloudEvents specification version (fixed to 1.0).", + examples: ["1.0"], + }), + id: z + .uuid() + .min(1) + .meta({ + title: "Event ID", + description: "Unique identifier for this event instance (UUID).", + examples: ["6f1c2a53-3d54-4a0a-9a0b-0e9ae2d4c111"], + }), + source: z + .string() + .min(12) + .regex(/^\/(data-plane|control-plane)(?:\/[a-z0-9-]+)*$/) + .meta({ + title: "Event Source", + description: + "Logical event producer path starting /data-plane or /control-plane followed by lowercase segments.", + examples: ["/data-plane/ordering", "/control-plane/audit"], + }), + subject: z + .string() + .min(5) + .regex(/^[^/]+(\/[^/]+)*$/) + .meta({ + title: "Event Subject", + description: + "Resource path (no leading slash) within the source made of segments separated by '/'.", + examples: [ + "origin/920fca11-596a-4eca-9c47-99f624614658/order/769acdd4-6a47-496f-999f-76a6fd2c3959/item/4f5e17c0-ec57-4cee-9a86-14580cf5af7d", + ], + }), + type: z + .string() + .min(1) + .regex( + // eslint-disable-next-line sonarjs/regex-complexity + /^(?!.*(?:^|\.|\/)(completed|finished|updated|changed|processed|handled|status|started|failed)(?:\.|\/|$))uk\.nhs\.notify\.[a-z0-9]+(\.[a-z0-9]+)*$/, + { + message: + "Event type must match uk.nhs.notify.* and must not contain any of: completed, finished, updated, changed, processed, handled, status, started, failed.", + }, + ) + .meta({ + title: "Event Type", + description: + "Event type (uk.nhs.notify.*) using reverse-DNS style; ambiguous verbs (completed, finished, updated, changed, processed, handled, status, started, failed) disallowed.", + examples: ["uk.nhs.notify.ordering.order.read"], + }), + time: z.iso.datetime().meta({ + title: "Event Time", + description: "Timestamp when the event occurred (RFC 3339).", + examples: ["2025-10-01T10:15:30.000Z"], + }), + datacontenttype: z.optional( + z.literal("application/json").meta({ + title: "Data Content Type", + description: + "Media type for the data field (fixed to application/json).", + examples: ["application/json"], + }), + ), + dataschema: z.optional( + z.string().meta({ + title: "Data Schema URI", + description: + "URI of a schema that describes the event payload (notify-payload).", + examples: [ + "https://nhsdigital.github.io/nhs-notify-standards/cloudevents/nhs-notify-example-event-data.schema.json", + ], + }), + ), + data: z.record(z.string(), z.unknown()).meta({ + title: "Event Data", + description: "Container object wrapping the structured Notify payload.", + examples: [ + { + "notify-payload": { + "notify-data": { nhsNumber: "9434765919" }, + "notify-metadata": { + teamResponsible: "Team 1", + notifyDomain: "Ordering", + version: "1.3.0", + }, + }, + }, + ], + }), + traceparent: z + .string() + .min(1) + .regex(/^00-[0-9a-f]{32}-[0-9a-f]{16}-[0-9a-f]{2}$/) + .meta({ + title: "Traceparent", + description: "W3C Trace Context traceparent header value.", + examples: ["00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01"], + }), + tracestate: z.optional( + z.string().meta({ + title: "Tracestate", + description: "Optional W3C Trace Context tracestate header value.", + examples: ["rojo=00f067aa0ba902b7,congo=t61rcWkgMzE"], + }), + ), + partitionkey: z.optional( + z + .string() + .min(1) + .max(64) + .regex(/^[a-z0-9-]+$/) + .meta({ + title: "Partition Key", + description: + "Partition / ordering key (lowercase alphanumerics and hyphen, 1-64 chars).", + examples: ["customer-920fca11"], + }), + ), + recordedtime: z.iso.datetime().meta({ + title: "Recorded Time", + description: + "Timestamp when the event was recorded/persisted (should be >= time).", + examples: ["2025-10-01T10:15:30.250Z"], + }), + sampledrate: z.optional( + z + .number() + .int() + .min(1) + .meta({ + title: "Sampled Rate", + description: + "Sampling factor: number of similar occurrences this event represents.", + examples: [5], + }), + ), + sequence: z.optional( + z + .string() + .regex(/^\d{20}$/) + .meta({ + title: "Sequence", + description: + "Zero-padded 20 digit numeric sequence (lexicographically sortable).", + examples: ["00000000000000000042"], + }), + ), + severitytext: z.optional( + z.enum(["TRACE", "DEBUG", "INFO", "WARN", "ERROR", "FATAL"]).meta({ + title: "Severity Text", + description: "Log severity level name.", + examples: ["DEBUG"], + }), + ), + severitynumber: z + .number() + .int() + .min(0) + .max(5) + .meta({ + title: "Severity Number", + description: + "Numeric severity (TRACE=0, DEBUG=1, INFO=2, WARN=3, ERROR=4, FATAL=5).", + examples: [1], + }), + dataclassification: z.optional( + z.enum(["public", "internal", "confidential", "restricted"]).meta({ + title: "Data Classification", + description: "Data sensitivity classification.", + examples: ["restricted"], + }), + ), + dataregulation: z.optional( + z + .enum(["GDPR", "HIPAA", "PCI-DSS", "ISO-27001", "NIST-800-53", "CCPA"]) + .meta({ + title: "Data Regulation", + description: "Regulatory regime tag applied to this data.", + examples: ["ISO-27001"], + }), + ), + datacategory: z.optional( + z + .enum(["non-sensitive", "standard", "sensitive", "special-category"]) + .meta({ + title: "Data Category", + description: + "Data category classification (e.g. standard, special-category).", + examples: ["sensitive"], + }), + ), + }) + .superRefine((obj, ctx) => { + if ( + /^\/data-plane/.test(obj.source) && + !/^[a-z0-9-]+(\/[^/]+)+$/.test(obj.subject) + ) { + ctx.addIssue({ + code: "custom", + message: + "For /data-plane sources, subject must start with a {namespace}/{id} and may have further segments separated by '/'.", + path: ["subject"], + }); + } + if (obj.severitytext !== undefined) { + const mapping = { + TRACE: 0, + DEBUG: 1, + INFO: 2, + WARN: 3, + ERROR: 4, + FATAL: 5, + }; + if (obj.severitynumber !== mapping[obj.severitytext]) { + ctx.addIssue({ + code: "custom", + message: `severitynumber must be ${mapping[obj.severitytext]} when severitytext is ${obj.severitytext}`, + path: ["severitynumber"], + }); + } + } + if (obj.severitynumber && obj.severitytext === undefined) { + ctx.addIssue({ + code: "custom", + message: "severitytext is required when severitynumber is present", + path: ["severitytext"], + }); + } + }); + +export type EnvelopeProfile = z.infer; diff --git a/internal/events/src/events/letter-events.ts b/internal/events/src/events/letter-events.ts new file mode 100644 index 00000000..b26ffac2 --- /dev/null +++ b/internal/events/src/events/letter-events.ts @@ -0,0 +1,144 @@ +import { z } from "zod"; +import { + $Letter, + $LetterStatus, + LetterStatus, +} from "@nhsdigital/nhs-notify-event-schemas-supplier-api/src/domain/letter"; +import { $EnvelopeProfile } from "@nhsdigital/nhs-notify-event-schemas-supplier-api/src/events/envelope-profile"; + +/** + * A generic schema for parsing any letter status change event + */ +export const $LetterEvent = $EnvelopeProfile + .safeExtend({ + type: z + .enum( + $LetterStatus.options.map( + (status) => `uk.nhs.notify.supplier-api.letter.${status}.v1`, + ), + ) + .meta({ + title: `Letter event type`, + description: "Event type using reverse-DNS style", + examples: [ + "uk.nhs.notify.supplier-api.letter.PENDING.v1", + "uk.nhs.notify.supplier-api.letter.ACCEPTED.v1", + "uk.nhs.notify.supplier-api.letter.DISPATCHED.v1", + ], + }), + + dataschema: z + .string() + .regex( + new RegExp( + `^https:\\/\\/notify\\.nhs\\.uk\\/cloudevents\\/schemas\\/supplier-api\\/letter\\.(?${$LetterStatus.options.join("|")})\\.1\\.\\d+\\.\\d+\\.schema.json$`, + ), + ) + .meta({ + title: "Data Schema URI", + description: `URI of a schema that describes the event data + +Data schema version must match the major version indicated by the type`, + examples: [ + "https://notify.nhs.uk/cloudevents/schemas/supplier-api/letter.ACCEPTED.1.0.0.schema.json", + ], + }), + + dataschemaversion: z + .string() + .regex(/^1\.\d+\.\d+$/) + .meta({ + title: "Data Schema Version", + description: + "Matches semantic versioning format with fixed major version (Not part of cloudevents spec?)", + }), + + source: z + .string() + .regex(/^\/data-plane\/supplier-api(?:\/.*)?$/) + .meta({ + title: "Event Source", + description: + "Logical event producer path within the supplier-api domain", + }), + + subject: z + .string() + .regex(/^letter-origin\/[a-z0-9-]+\/letter\/[^/]+(?:\/.*)?/) + .meta({ + title: "Event Subject", + description: + "Resource path (no leading slash) within the source made of segments separated by '/'.", + examples: [ + "letter-origin/letter-rendering/letter/f47ac10b-58cc-4372-a567-0e02b2c3d479", + ], + }), + + // This replaces the data definition from EnvelopeProfile rather than extending it + data: $Letter.meta({ + title: "Letter", + description: `The status of a letter in the supplier-api domain. + +This will include the current production status, any reason provided for the status, if applicable, and identifiers used for grouping in reports.`, + }), + }) + .meta({ + title: `letter.* Event`, + description: `Event schema for generic letter status change`, + }); +export type LetterEvent = z.infer; + +/** + * Specialise the generic event schema for a single status + * @param status + */ +const eventSchema = (status: LetterStatus) => + $LetterEvent + .safeExtend({ + type: z.literal(`uk.nhs.notify.supplier-api.letter.${status}.v1`).meta({ + title: `Letter ${status} event type`, + description: "Event type using reverse-DNS style", + examples: [`uk.nhs.notify.supplier-api.letter.${status}.v1`], + }), + + dataschema: z + .string() + .regex( + new RegExp( + `^https:\\/\\/notify\\.nhs\\.uk\\/cloudevents\\/schemas\\/supplier-api\\/letter.${status}.1\\.\\d+\\.\\d+\\.schema.json$`, + ), + ) + .meta({ + title: "Data Schema URI", + description: `URI of a schema that describes the event data + +Data schema version must match the major version indicated by the type`, + examples: [ + "https://notify.nhs.uk/cloudevents/schemas/supplier-api/letter.ACCEPTED.1.0.0.schema.json", + ], + }), + + data: $Letter + .extend({ + status: z.literal(status), + }) + .meta({ + title: "Letter", + description: `The status of a letter in the supplier-api domain. + +This will include the current production status, any reason provided for the status, if applicable, and identifiers used for grouping in reports. + +For this event the status is always \`${status}\``, + }), + }) + .meta({ + title: `letter.${status} Event`, + description: `Event schema for letter status change to ${status}`, + }); + +export const letterEventMap = Object.fromEntries( + $LetterStatus.options.map((status) => [ + `letter.${status}`, + eventSchema(status), + ]), +); diff --git a/internal/events/src/index.ts b/internal/events/src/index.ts new file mode 100644 index 00000000..3de8cf31 --- /dev/null +++ b/internal/events/src/index.ts @@ -0,0 +1,34 @@ +/** + * NHS Notify Supplier API Event Schemas + * + * This entrypoint re-exports the Zod schemas and associated TypeScript types + * for letter status change events and supporting domain models. + * + * Public exports: + * - Envelope / CloudEvent profile base schema + * - Letter status domain enum & schema + * - Letter status change domain schema + * - Individual letter status change event schemas (statusChangeEvents map) + * - Generic letter status change event schema + */ + +// Envelope / CloudEvents base profile +export { + $EnvelopeProfile, + type EnvelopeProfile, +} from "./events/envelope-profile"; + +// Domain schemas +export { + $LetterStatus, + type LetterStatus, + $Letter, + type Letter, +} from "./domain/letter"; + +// Event schemas (collection & generic) +export { + letterEventMap, + $LetterEvent, + type LetterEvent, +} from "./events/letter-events"; diff --git a/internal/events/tsconfig.jest.json b/internal/events/tsconfig.jest.json new file mode 100644 index 00000000..b6126778 --- /dev/null +++ b/internal/events/tsconfig.jest.json @@ -0,0 +1,9 @@ +{ + "exclude": [ + "./dist/" + ], + "extends": "./tsconfig.json", + "include": [ + "." + ] +} diff --git a/internal/events/tsconfig.json b/internal/events/tsconfig.json new file mode 100644 index 00000000..27dbdb0d --- /dev/null +++ b/internal/events/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "declaration": true, + "isolatedModules": true, + "module": "commonjs", + "noEmit": false, + "outDir": "dist", + "resolveJsonModule": true + }, + "exclude": [ + "node_modules", + "dist" + ], + "extends": "../../tsconfig.base.json", + "include": [ + "src/**/*", + "jest.config.ts", + "package.json" + ] +} diff --git a/package-lock.json b/package-lock.json index fc7a73a8..0dd021ca 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,8 @@ "lambdas/*", "internal/*", "scripts/test-data", - "docs" + "docs", + "tests" ], "dependencies": { "@aws-sdk/client-api-gateway": "^3.906.0", @@ -54,7 +55,8 @@ "ts-jest": "^29.4.0", "ts-node": "^10.9.2", "tsx": "^4.20.6", - "typescript": "^5.8.3" + "typescript": "^5.8.3", + "typescript-eslint": "^8.27.0" } }, "docs": { @@ -101,14 +103,17 @@ "url": "https://github.com/sponsors/colinhacks" } }, - "internal/helpers": { - "name": "@internal/helpers", - "version": "0.1.0", + "internal/events": { + "name": "@nhsdigital/nhs-notify-event-schemas-supplier-api", + "version": "1.0.0", "license": "MIT", "dependencies": { + "@asyncapi/bundler": "^0.6.4", + "@internal/helpers": "*", "zod": "^4.1.11" }, "devDependencies": { + "@stoplight/spectral-cli": "^6.15.0", "@stylistic/eslint-plugin": "^3.1.0", "@tsconfig/node22": "^22.0.2", "@types/jest": "^29.5.14", @@ -116,14 +121,16 @@ "@typescript-eslint/parser": "^8.27.0", "eslint": "^9.27.0", "eslint-plugin-jest": "^29.0.1", - "jest": "^30.1.3", + "jest": "^29.7.0", "ts-jest": "^29.4.0", "ts-node": "^10.9.2", "typescript": "^5.8.3" } }, - "internal/helpers/node_modules/@jest/core": { + "internal/events/node_modules/@jest/core": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", "dev": true, "license": "MIT", "dependencies": { @@ -168,8 +175,10 @@ } } }, - "internal/helpers/node_modules/@jest/environment": { + "internal/events/node_modules/@jest/environment": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dev": true, "license": "MIT", "dependencies": { @@ -182,8 +191,10 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "internal/helpers/node_modules/@jest/expect": { + "internal/events/node_modules/@jest/expect": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", "dev": true, "license": "MIT", "dependencies": { @@ -194,8 +205,10 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "internal/helpers/node_modules/@jest/fake-timers": { + "internal/events/node_modules/@jest/fake-timers": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dev": true, "license": "MIT", "dependencies": { @@ -210,8 +223,10 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "internal/helpers/node_modules/@jest/globals": { + "internal/events/node_modules/@jest/globals": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", "dev": true, "license": "MIT", "dependencies": { @@ -224,8 +239,10 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "internal/helpers/node_modules/@jest/reporters": { + "internal/events/node_modules/@jest/reporters": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", "dev": true, "license": "MIT", "dependencies": { @@ -266,8 +283,10 @@ } } }, - "internal/helpers/node_modules/@jest/source-map": { + "internal/events/node_modules/@jest/source-map": { "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", "dev": true, "license": "MIT", "dependencies": { @@ -279,8 +298,10 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "internal/helpers/node_modules/@jest/test-sequencer": { + "internal/events/node_modules/@jest/test-sequencer": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", "dev": true, "license": "MIT", "dependencies": { @@ -293,8 +314,10 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "internal/helpers/node_modules/@jest/transform": { + "internal/events/node_modules/@jest/transform": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, "license": "MIT", "dependencies": { @@ -318,16 +341,20 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "internal/helpers/node_modules/@sinonjs/fake-timers": { + "internal/events/node_modules/@sinonjs/fake-timers": { "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dev": true, "license": "BSD-3-Clause", "dependencies": { "@sinonjs/commons": "^3.0.0" } }, - "internal/helpers/node_modules/@types/jest": { + "internal/events/node_modules/@types/jest": { "version": "29.5.14", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.14.tgz", + "integrity": "sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==", "dev": true, "license": "MIT", "dependencies": { @@ -335,8 +362,10 @@ "pretty-format": "^29.0.0" } }, - "internal/helpers/node_modules/babel-jest": { + "internal/events/node_modules/babel-jest": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dev": true, "license": "MIT", "dependencies": { @@ -355,8 +384,10 @@ "@babel/core": "^7.8.0" } }, - "internal/helpers/node_modules/babel-plugin-istanbul": { + "internal/events/node_modules/babel-plugin-istanbul": { "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -370,8 +401,10 @@ "node": ">=8" } }, - "internal/helpers/node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "internal/events/node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -385,16 +418,20 @@ "node": ">=8" } }, - "internal/helpers/node_modules/babel-plugin-istanbul/node_modules/semver": { + "internal/events/node_modules/babel-plugin-istanbul/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, "license": "ISC", "bin": { "semver": "bin/semver.js" } }, - "internal/helpers/node_modules/babel-plugin-jest-hoist": { + "internal/events/node_modules/babel-plugin-jest-hoist": { "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", "dev": true, "license": "MIT", "dependencies": { @@ -407,8 +444,10 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "internal/helpers/node_modules/babel-preset-jest": { + "internal/events/node_modules/babel-preset-jest": { "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", "dev": true, "license": "MIT", "dependencies": { @@ -422,8 +461,10 @@ "@babel/core": "^7.0.0" } }, - "internal/helpers/node_modules/brace-expansion": { + "internal/events/node_modules/brace-expansion": { "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", "dependencies": { @@ -431,8 +472,10 @@ "concat-map": "0.0.1" } }, - "internal/helpers/node_modules/camelcase": { + "internal/events/node_modules/camelcase": { "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true, "license": "MIT", "engines": { @@ -442,8 +485,10 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "internal/helpers/node_modules/ci-info": { + "internal/events/node_modules/ci-info": { "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", "dev": true, "funding": [ { @@ -456,13 +501,17 @@ "node": ">=8" } }, - "internal/helpers/node_modules/cjs-module-lexer": { + "internal/events/node_modules/cjs-module-lexer": { "version": "1.4.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", + "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", "dev": true, "license": "MIT" }, - "internal/helpers/node_modules/cliui": { + "internal/events/node_modules/cliui": { "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, "license": "ISC", "dependencies": { @@ -474,8 +523,11 @@ "node": ">=12" } }, - "internal/helpers/node_modules/glob": { + "internal/events/node_modules/glob": { "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "license": "ISC", "dependencies": { @@ -493,8 +545,10 @@ "url": "https://github.com/sponsors/isaacs" } }, - "internal/helpers/node_modules/istanbul-lib-source-maps": { + "internal/events/node_modules/istanbul-lib-source-maps": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -506,8 +560,10 @@ "node": ">=10" } }, - "internal/helpers/node_modules/jest": { + "internal/events/node_modules/jest": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", "dev": true, "license": "MIT", "dependencies": { @@ -531,8 +587,10 @@ } } }, - "internal/helpers/node_modules/jest-changed-files": { + "internal/events/node_modules/jest-changed-files": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", "dev": true, "license": "MIT", "dependencies": { @@ -544,8 +602,10 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "internal/helpers/node_modules/jest-circus": { + "internal/events/node_modules/jest-circus": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", "dev": true, "license": "MIT", "dependencies": { @@ -574,8 +634,10 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "internal/helpers/node_modules/jest-cli": { + "internal/events/node_modules/jest-cli": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", "dev": true, "license": "MIT", "dependencies": { @@ -606,8 +668,10 @@ } } }, - "internal/helpers/node_modules/jest-config": { + "internal/events/node_modules/jest-config": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", "dev": true, "license": "MIT", "dependencies": { @@ -650,8 +714,10 @@ } } }, - "internal/helpers/node_modules/jest-docblock": { + "internal/events/node_modules/jest-docblock": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", "dev": true, "license": "MIT", "dependencies": { @@ -661,8 +727,10 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "internal/helpers/node_modules/jest-each": { + "internal/events/node_modules/jest-each": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", "dev": true, "license": "MIT", "dependencies": { @@ -676,8 +744,10 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "internal/helpers/node_modules/jest-environment-node": { + "internal/events/node_modules/jest-environment-node": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, "license": "MIT", "dependencies": { @@ -692,8 +762,10 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "internal/helpers/node_modules/jest-haste-map": { + "internal/events/node_modules/jest-haste-map": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, "license": "MIT", "dependencies": { @@ -716,8 +788,10 @@ "fsevents": "^2.3.2" } }, - "internal/helpers/node_modules/jest-leak-detector": { + "internal/events/node_modules/jest-leak-detector": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", "dev": true, "license": "MIT", "dependencies": { @@ -728,8 +802,10 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "internal/helpers/node_modules/jest-mock": { + "internal/events/node_modules/jest-mock": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, "license": "MIT", "dependencies": { @@ -741,16 +817,20 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "internal/helpers/node_modules/jest-regex-util": { + "internal/events/node_modules/jest-regex-util": { "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", "dev": true, "license": "MIT", "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "internal/helpers/node_modules/jest-resolve": { + "internal/events/node_modules/jest-resolve": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", "dev": true, "license": "MIT", "dependencies": { @@ -768,8 +848,10 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "internal/helpers/node_modules/jest-resolve-dependencies": { + "internal/events/node_modules/jest-resolve-dependencies": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", "dev": true, "license": "MIT", "dependencies": { @@ -780,8 +862,10 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "internal/helpers/node_modules/jest-runner": { + "internal/events/node_modules/jest-runner": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", "dev": true, "license": "MIT", "dependencies": { @@ -811,8 +895,10 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "internal/helpers/node_modules/jest-runtime": { + "internal/events/node_modules/jest-runtime": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", "dev": true, "license": "MIT", "dependencies": { @@ -843,8 +929,10 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "internal/helpers/node_modules/jest-snapshot": { + "internal/events/node_modules/jest-snapshot": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", "dev": true, "license": "MIT", "dependencies": { @@ -873,8 +961,10 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "internal/helpers/node_modules/jest-validate": { + "internal/events/node_modules/jest-validate": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, "license": "MIT", "dependencies": { @@ -889,8 +979,10 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "internal/helpers/node_modules/jest-watcher": { + "internal/events/node_modules/jest-watcher": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", "dev": true, "license": "MIT", "dependencies": { @@ -907,8 +999,10 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "internal/helpers/node_modules/jest-worker": { + "internal/events/node_modules/jest-worker": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, "license": "MIT", "dependencies": { @@ -921,8 +1015,10 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "internal/helpers/node_modules/minimatch": { + "internal/events/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": { @@ -932,8 +1028,10 @@ "node": "*" } }, - "internal/helpers/node_modules/pure-rand": { + "internal/events/node_modules/pure-rand": { "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", "dev": true, "funding": [ { @@ -947,13 +1045,17 @@ ], "license": "MIT" }, - "internal/helpers/node_modules/signal-exit": { + "internal/events/node_modules/signal-exit": { "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true, "license": "ISC" }, - "internal/helpers/node_modules/supports-color": { + "internal/events/node_modules/supports-color": { "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "license": "MIT", "dependencies": { @@ -966,8 +1068,10 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "internal/helpers/node_modules/wrap-ansi": { + "internal/events/node_modules/wrap-ansi": { "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "license": "MIT", "dependencies": { @@ -982,8 +1086,10 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "internal/helpers/node_modules/write-file-atomic": { + "internal/events/node_modules/write-file-atomic": { "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", "dev": true, "license": "ISC", "dependencies": { @@ -994,8 +1100,10 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "internal/helpers/node_modules/yargs": { + "internal/events/node_modules/yargs": { "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, "license": "MIT", "dependencies": { @@ -1011,34 +1119,37 @@ "node": ">=12" } }, - "internal/helpers/node_modules/zod": { + "internal/events/node_modules/zod": { "version": "4.1.12", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.12.tgz", + "integrity": "sha512-JInaHOamG8pt5+Ey8kGmdcAcg3OL9reK8ltczgHTAwNhMys/6ThXHityHxVV2p3fkw/c+MAvBHFVYHFZDmjMCQ==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" } }, - "lambdas/api-handler": { - "name": "nhs-notify-supplier-api-handler", - "version": "0.0.1", + "internal/helpers": { + "name": "@internal/helpers", + "version": "0.1.0", + "license": "MIT", "dependencies": { - "@internal/datastore": "*", - "@internal/helpers": "*", - "esbuild": "^0.25.11", - "pino": "^9.7.0" + "zod": "^4.1.11" }, "devDependencies": { - "@aws-sdk/s3-request-presigner": "^3.901.0", + "@stylistic/eslint-plugin": "^3.1.0", "@tsconfig/node22": "^22.0.2", - "@types/aws-lambda": "^8.10.148", "@types/jest": "^29.5.14", - "jest": "^30.2.0", - "jest-mock-extended": "^3.0.7", - "typescript": "^5.8.3", - "zod": "^4.1.11" + "@typescript-eslint/eslint-plugin": "^8.27.0", + "@typescript-eslint/parser": "^8.27.0", + "eslint": "^9.27.0", + "eslint-plugin-jest": "^29.0.1", + "jest": "^30.1.3", + "ts-jest": "^29.4.0", + "ts-node": "^10.9.2", + "typescript": "^5.8.3" } }, - "lambdas/api-handler/node_modules/@jest/core": { + "internal/helpers/node_modules/@jest/core": { "version": "29.7.0", "dev": true, "license": "MIT", @@ -1084,7 +1195,7 @@ } } }, - "lambdas/api-handler/node_modules/@jest/environment": { + "internal/helpers/node_modules/@jest/environment": { "version": "29.7.0", "dev": true, "license": "MIT", @@ -1098,7 +1209,7 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "lambdas/api-handler/node_modules/@jest/expect": { + "internal/helpers/node_modules/@jest/expect": { "version": "29.7.0", "dev": true, "license": "MIT", @@ -1110,7 +1221,7 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "lambdas/api-handler/node_modules/@jest/fake-timers": { + "internal/helpers/node_modules/@jest/fake-timers": { "version": "29.7.0", "dev": true, "license": "MIT", @@ -1126,7 +1237,7 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "lambdas/api-handler/node_modules/@jest/globals": { + "internal/helpers/node_modules/@jest/globals": { "version": "29.7.0", "dev": true, "license": "MIT", @@ -1140,7 +1251,7 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "lambdas/api-handler/node_modules/@jest/reporters": { + "internal/helpers/node_modules/@jest/reporters": { "version": "29.7.0", "dev": true, "license": "MIT", @@ -1182,7 +1293,7 @@ } } }, - "lambdas/api-handler/node_modules/@jest/source-map": { + "internal/helpers/node_modules/@jest/source-map": { "version": "29.6.3", "dev": true, "license": "MIT", @@ -1195,7 +1306,7 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "lambdas/api-handler/node_modules/@jest/test-sequencer": { + "internal/helpers/node_modules/@jest/test-sequencer": { "version": "29.7.0", "dev": true, "license": "MIT", @@ -1209,7 +1320,7 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "lambdas/api-handler/node_modules/@jest/transform": { + "internal/helpers/node_modules/@jest/transform": { "version": "29.7.0", "dev": true, "license": "MIT", @@ -1234,7 +1345,7 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "lambdas/api-handler/node_modules/@sinonjs/fake-timers": { + "internal/helpers/node_modules/@sinonjs/fake-timers": { "version": "10.3.0", "dev": true, "license": "BSD-3-Clause", @@ -1242,7 +1353,7 @@ "@sinonjs/commons": "^3.0.0" } }, - "lambdas/api-handler/node_modules/@types/jest": { + "internal/helpers/node_modules/@types/jest": { "version": "29.5.14", "dev": true, "license": "MIT", @@ -1251,7 +1362,7 @@ "pretty-format": "^29.0.0" } }, - "lambdas/api-handler/node_modules/babel-jest": { + "internal/helpers/node_modules/babel-jest": { "version": "29.7.0", "dev": true, "license": "MIT", @@ -1271,7 +1382,7 @@ "@babel/core": "^7.8.0" } }, - "lambdas/api-handler/node_modules/babel-plugin-istanbul": { + "internal/helpers/node_modules/babel-plugin-istanbul": { "version": "6.1.1", "dev": true, "license": "BSD-3-Clause", @@ -1286,7 +1397,7 @@ "node": ">=8" } }, - "lambdas/api-handler/node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "internal/helpers/node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { "version": "5.2.1", "dev": true, "license": "BSD-3-Clause", @@ -1301,7 +1412,7 @@ "node": ">=8" } }, - "lambdas/api-handler/node_modules/babel-plugin-istanbul/node_modules/semver": { + "internal/helpers/node_modules/babel-plugin-istanbul/node_modules/semver": { "version": "6.3.1", "dev": true, "license": "ISC", @@ -1309,7 +1420,7 @@ "semver": "bin/semver.js" } }, - "lambdas/api-handler/node_modules/babel-plugin-jest-hoist": { + "internal/helpers/node_modules/babel-plugin-jest-hoist": { "version": "29.6.3", "dev": true, "license": "MIT", @@ -1323,7 +1434,7 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "lambdas/api-handler/node_modules/babel-preset-jest": { + "internal/helpers/node_modules/babel-preset-jest": { "version": "29.6.3", "dev": true, "license": "MIT", @@ -1338,7 +1449,7 @@ "@babel/core": "^7.0.0" } }, - "lambdas/api-handler/node_modules/brace-expansion": { + "internal/helpers/node_modules/brace-expansion": { "version": "1.1.12", "dev": true, "license": "MIT", @@ -1347,7 +1458,7 @@ "concat-map": "0.0.1" } }, - "lambdas/api-handler/node_modules/camelcase": { + "internal/helpers/node_modules/camelcase": { "version": "6.3.0", "dev": true, "license": "MIT", @@ -1358,7 +1469,7 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "lambdas/api-handler/node_modules/ci-info": { + "internal/helpers/node_modules/ci-info": { "version": "3.9.0", "dev": true, "funding": [ @@ -1372,12 +1483,12 @@ "node": ">=8" } }, - "lambdas/api-handler/node_modules/cjs-module-lexer": { + "internal/helpers/node_modules/cjs-module-lexer": { "version": "1.4.3", "dev": true, "license": "MIT" }, - "lambdas/api-handler/node_modules/cliui": { + "internal/helpers/node_modules/cliui": { "version": "8.0.1", "dev": true, "license": "ISC", @@ -1390,7 +1501,7 @@ "node": ">=12" } }, - "lambdas/api-handler/node_modules/glob": { + "internal/helpers/node_modules/glob": { "version": "7.2.3", "dev": true, "license": "ISC", @@ -1409,7 +1520,7 @@ "url": "https://github.com/sponsors/isaacs" } }, - "lambdas/api-handler/node_modules/istanbul-lib-source-maps": { + "internal/helpers/node_modules/istanbul-lib-source-maps": { "version": "4.0.1", "dev": true, "license": "BSD-3-Clause", @@ -1422,7 +1533,7 @@ "node": ">=10" } }, - "lambdas/api-handler/node_modules/jest": { + "internal/helpers/node_modules/jest": { "version": "29.7.0", "dev": true, "license": "MIT", @@ -1447,7 +1558,7 @@ } } }, - "lambdas/api-handler/node_modules/jest-changed-files": { + "internal/helpers/node_modules/jest-changed-files": { "version": "29.7.0", "dev": true, "license": "MIT", @@ -1460,7 +1571,7 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "lambdas/api-handler/node_modules/jest-circus": { + "internal/helpers/node_modules/jest-circus": { "version": "29.7.0", "dev": true, "license": "MIT", @@ -1490,7 +1601,7 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "lambdas/api-handler/node_modules/jest-cli": { + "internal/helpers/node_modules/jest-cli": { "version": "29.7.0", "dev": true, "license": "MIT", @@ -1522,7 +1633,7 @@ } } }, - "lambdas/api-handler/node_modules/jest-config": { + "internal/helpers/node_modules/jest-config": { "version": "29.7.0", "dev": true, "license": "MIT", @@ -1566,7 +1677,7 @@ } } }, - "lambdas/api-handler/node_modules/jest-docblock": { + "internal/helpers/node_modules/jest-docblock": { "version": "29.7.0", "dev": true, "license": "MIT", @@ -1577,7 +1688,7 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "lambdas/api-handler/node_modules/jest-each": { + "internal/helpers/node_modules/jest-each": { "version": "29.7.0", "dev": true, "license": "MIT", @@ -1592,7 +1703,7 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "lambdas/api-handler/node_modules/jest-environment-node": { + "internal/helpers/node_modules/jest-environment-node": { "version": "29.7.0", "dev": true, "license": "MIT", @@ -1608,7 +1719,7 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "lambdas/api-handler/node_modules/jest-haste-map": { + "internal/helpers/node_modules/jest-haste-map": { "version": "29.7.0", "dev": true, "license": "MIT", @@ -1632,7 +1743,7 @@ "fsevents": "^2.3.2" } }, - "lambdas/api-handler/node_modules/jest-leak-detector": { + "internal/helpers/node_modules/jest-leak-detector": { "version": "29.7.0", "dev": true, "license": "MIT", @@ -1644,7 +1755,7 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "lambdas/api-handler/node_modules/jest-mock": { + "internal/helpers/node_modules/jest-mock": { "version": "29.7.0", "dev": true, "license": "MIT", @@ -1657,19 +1768,7 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "lambdas/api-handler/node_modules/jest-mock-extended": { - "version": "3.0.7", - "dev": true, - "license": "MIT", - "dependencies": { - "ts-essentials": "^10.0.0" - }, - "peerDependencies": { - "jest": "^24.0.0 || ^25.0.0 || ^26.0.0 || ^27.0.0 || ^28.0.0 || ^29.0.0", - "typescript": "^3.0.0 || ^4.0.0 || ^5.0.0" - } - }, - "lambdas/api-handler/node_modules/jest-regex-util": { + "internal/helpers/node_modules/jest-regex-util": { "version": "29.6.3", "dev": true, "license": "MIT", @@ -1677,7 +1776,7 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "lambdas/api-handler/node_modules/jest-resolve": { + "internal/helpers/node_modules/jest-resolve": { "version": "29.7.0", "dev": true, "license": "MIT", @@ -1696,7 +1795,7 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "lambdas/api-handler/node_modules/jest-resolve-dependencies": { + "internal/helpers/node_modules/jest-resolve-dependencies": { "version": "29.7.0", "dev": true, "license": "MIT", @@ -1708,7 +1807,7 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "lambdas/api-handler/node_modules/jest-runner": { + "internal/helpers/node_modules/jest-runner": { "version": "29.7.0", "dev": true, "license": "MIT", @@ -1739,7 +1838,7 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "lambdas/api-handler/node_modules/jest-runtime": { + "internal/helpers/node_modules/jest-runtime": { "version": "29.7.0", "dev": true, "license": "MIT", @@ -1771,7 +1870,7 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "lambdas/api-handler/node_modules/jest-snapshot": { + "internal/helpers/node_modules/jest-snapshot": { "version": "29.7.0", "dev": true, "license": "MIT", @@ -1801,7 +1900,7 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "lambdas/api-handler/node_modules/jest-validate": { + "internal/helpers/node_modules/jest-validate": { "version": "29.7.0", "dev": true, "license": "MIT", @@ -1817,7 +1916,7 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "lambdas/api-handler/node_modules/jest-watcher": { + "internal/helpers/node_modules/jest-watcher": { "version": "29.7.0", "dev": true, "license": "MIT", @@ -1835,7 +1934,7 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "lambdas/api-handler/node_modules/jest-worker": { + "internal/helpers/node_modules/jest-worker": { "version": "29.7.0", "dev": true, "license": "MIT", @@ -1849,7 +1948,7 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "lambdas/api-handler/node_modules/minimatch": { + "internal/helpers/node_modules/minimatch": { "version": "3.1.2", "dev": true, "license": "ISC", @@ -1860,7 +1959,7 @@ "node": "*" } }, - "lambdas/api-handler/node_modules/pure-rand": { + "internal/helpers/node_modules/pure-rand": { "version": "6.1.0", "dev": true, "funding": [ @@ -1875,12 +1974,12 @@ ], "license": "MIT" }, - "lambdas/api-handler/node_modules/signal-exit": { + "internal/helpers/node_modules/signal-exit": { "version": "3.0.7", "dev": true, "license": "ISC" }, - "lambdas/api-handler/node_modules/supports-color": { + "internal/helpers/node_modules/supports-color": { "version": "8.1.1", "dev": true, "license": "MIT", @@ -1894,7 +1993,7 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "lambdas/api-handler/node_modules/wrap-ansi": { + "internal/helpers/node_modules/wrap-ansi": { "version": "7.0.0", "dev": true, "license": "MIT", @@ -1910,7 +2009,7 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "lambdas/api-handler/node_modules/write-file-atomic": { + "internal/helpers/node_modules/write-file-atomic": { "version": "4.0.2", "dev": true, "license": "ISC", @@ -1922,7 +2021,7 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "lambdas/api-handler/node_modules/yargs": { + "internal/helpers/node_modules/yargs": { "version": "17.7.2", "dev": true, "license": "MIT", @@ -1939,206 +2038,1174 @@ "node": ">=12" } }, - "lambdas/api-handler/node_modules/zod": { + "internal/helpers/node_modules/zod": { "version": "4.1.12", - "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" } }, - "lambdas/authorizer": { - "name": "nhs-notify-supplier-authorizer", + "lambdas/api-handler": { + "name": "nhs-notify-supplier-api-handler", "version": "0.0.1", "dependencies": { - "esbuild": "^0.25.11" + "@internal/datastore": "*", + "@internal/helpers": "*", + "esbuild": "^0.25.11", + "pino": "^9.7.0" }, "devDependencies": { + "@aws-sdk/s3-request-presigner": "^3.901.0", "@tsconfig/node22": "^22.0.2", "@types/aws-lambda": "^8.10.148", - "@types/jest": "^30.0.0", + "@types/jest": "^29.5.14", "jest": "^30.2.0", - "jest-mock-extended": "^4.0.0", - "typescript": "^5.8.3" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" + "jest-mock-extended": "^3.0.7", + "typescript": "^5.8.3", + "zod": "^4.1.11" } }, - "node_modules/@asamuzakjp/css-color": { - "version": "3.2.0", + "lambdas/api-handler/node_modules/@jest/core": { + "version": "29.7.0", "dev": true, "license": "MIT", "dependencies": { - "@csstools/css-calc": "^2.1.3", - "@csstools/css-color-parser": "^3.0.9", - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3", - "lru-cache": "^10.4.3" - } - }, - "node_modules/@asamuzakjp/css-color/node_modules/lru-cache": { - "version": "10.4.3", - "dev": true, - "license": "ISC" - }, - "node_modules/@aws-crypto/crc32": { - "version": "5.2.0", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", - "tslib": "^2.6.2" + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-crypto/crc32c": { - "version": "5.2.0", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-crypto/sha1-browser": { - "version": "5.2.0", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/supports-web-crypto": "^5.2.0", - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", - "@aws-sdk/util-locate-window": "^3.0.0", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.6.2" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "node_modules/@aws-crypto/sha1-browser/node_modules/@smithy/is-array-buffer": { - "version": "2.2.0", - "license": "Apache-2.0", + "lambdas/api-handler/node_modules/@jest/environment": { + "version": "29.7.0", + "dev": true, + "license": "MIT", "dependencies": { - "tslib": "^2.6.2" + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" }, "engines": { - "node": ">=14.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@aws-crypto/sha1-browser/node_modules/@smithy/util-buffer-from": { - "version": "2.2.0", - "license": "Apache-2.0", + "lambdas/api-handler/node_modules/@jest/expect": { + "version": "29.7.0", + "dev": true, + "license": "MIT", "dependencies": { - "@smithy/is-array-buffer": "^2.2.0", - "tslib": "^2.6.2" + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" }, "engines": { - "node": ">=14.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@aws-crypto/sha1-browser/node_modules/@smithy/util-utf8": { - "version": "2.3.0", - "license": "Apache-2.0", + "lambdas/api-handler/node_modules/@jest/fake-timers": { + "version": "29.7.0", + "dev": true, + "license": "MIT", "dependencies": { - "@smithy/util-buffer-from": "^2.2.0", - "tslib": "^2.6.2" + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { - "node": ">=14.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@aws-crypto/sha256-browser": { - "version": "5.2.0", - "license": "Apache-2.0", + "lambdas/api-handler/node_modules/@jest/globals": { + "version": "29.7.0", + "dev": true, + "license": "MIT", "dependencies": { - "@aws-crypto/sha256-js": "^5.2.0", - "@aws-crypto/supports-web-crypto": "^5.2.0", - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", - "@aws-sdk/util-locate-window": "^3.0.0", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.6.2" + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/is-array-buffer": { - "version": "2.2.0", - "license": "Apache-2.0", + "lambdas/api-handler/node_modules/@jest/reporters": { + "version": "29.7.0", + "dev": true, + "license": "MIT", "dependencies": { - "tslib": "^2.6.2" + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" }, "engines": { - "node": ">=14.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-buffer-from": { - "version": "2.2.0", - "license": "Apache-2.0", + "lambdas/api-handler/node_modules/@jest/source-map": { + "version": "29.6.3", + "dev": true, + "license": "MIT", "dependencies": { - "@smithy/is-array-buffer": "^2.2.0", - "tslib": "^2.6.2" + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" }, "engines": { - "node": ">=14.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-utf8": { - "version": "2.3.0", - "license": "Apache-2.0", + "lambdas/api-handler/node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "dev": true, + "license": "MIT", "dependencies": { - "@smithy/util-buffer-from": "^2.2.0", - "tslib": "^2.6.2" + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" }, "engines": { - "node": ">=14.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@aws-crypto/sha256-js": { - "version": "5.2.0", - "license": "Apache-2.0", + "lambdas/api-handler/node_modules/@jest/transform": { + "version": "29.7.0", + "dev": true, + "license": "MIT", "dependencies": { - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", - "tslib": "^2.6.2" + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" }, "engines": { - "node": ">=16.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@aws-crypto/supports-web-crypto": { - "version": "5.2.0", - "license": "Apache-2.0", + "lambdas/api-handler/node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "tslib": "^2.6.2" + "@sinonjs/commons": "^3.0.0" } }, - "node_modules/@aws-crypto/util": { - "version": "5.2.0", - "license": "Apache-2.0", + "lambdas/api-handler/node_modules/@types/jest": { + "version": "29.5.14", + "dev": true, + "license": "MIT", "dependencies": { - "@aws-sdk/types": "^3.222.0", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.6.2" + "expect": "^29.0.0", + "pretty-format": "^29.0.0" } }, - "node_modules/@aws-crypto/util/node_modules/@smithy/is-array-buffer": { - "version": "2.2.0", - "license": "Apache-2.0", + "lambdas/api-handler/node_modules/babel-jest": { + "version": "29.7.0", + "dev": true, + "license": "MIT", "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "lambdas/api-handler/node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "lambdas/api-handler/node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "lambdas/api-handler/node_modules/babel-plugin-istanbul/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "lambdas/api-handler/node_modules/babel-plugin-jest-hoist": { + "version": "29.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "lambdas/api-handler/node_modules/babel-preset-jest": { + "version": "29.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "lambdas/api-handler/node_modules/brace-expansion": { + "version": "1.1.12", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "lambdas/api-handler/node_modules/camelcase": { + "version": "6.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "lambdas/api-handler/node_modules/ci-info": { + "version": "3.9.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "lambdas/api-handler/node_modules/cjs-module-lexer": { + "version": "1.4.3", + "dev": true, + "license": "MIT" + }, + "lambdas/api-handler/node_modules/cliui": { + "version": "8.0.1", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "lambdas/api-handler/node_modules/glob": { + "version": "7.2.3", + "dev": true, + "license": "ISC", + "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" + } + }, + "lambdas/api-handler/node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "lambdas/api-handler/node_modules/jest": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "lambdas/api-handler/node_modules/jest-changed-files": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "lambdas/api-handler/node_modules/jest-circus": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "lambdas/api-handler/node_modules/jest-cli": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "lambdas/api-handler/node_modules/jest-config": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "lambdas/api-handler/node_modules/jest-docblock": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "lambdas/api-handler/node_modules/jest-each": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "lambdas/api-handler/node_modules/jest-environment-node": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "lambdas/api-handler/node_modules/jest-haste-map": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "lambdas/api-handler/node_modules/jest-leak-detector": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "lambdas/api-handler/node_modules/jest-mock": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "lambdas/api-handler/node_modules/jest-mock-extended": { + "version": "3.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "ts-essentials": "^10.0.0" + }, + "peerDependencies": { + "jest": "^24.0.0 || ^25.0.0 || ^26.0.0 || ^27.0.0 || ^28.0.0 || ^29.0.0", + "typescript": "^3.0.0 || ^4.0.0 || ^5.0.0" + } + }, + "lambdas/api-handler/node_modules/jest-regex-util": { + "version": "29.6.3", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "lambdas/api-handler/node_modules/jest-resolve": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "lambdas/api-handler/node_modules/jest-resolve-dependencies": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "lambdas/api-handler/node_modules/jest-runner": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "lambdas/api-handler/node_modules/jest-runtime": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "lambdas/api-handler/node_modules/jest-snapshot": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "lambdas/api-handler/node_modules/jest-validate": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "lambdas/api-handler/node_modules/jest-watcher": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "lambdas/api-handler/node_modules/jest-worker": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "lambdas/api-handler/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "lambdas/api-handler/node_modules/pure-rand": { + "version": "6.1.0", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT" + }, + "lambdas/api-handler/node_modules/signal-exit": { + "version": "3.0.7", + "dev": true, + "license": "ISC" + }, + "lambdas/api-handler/node_modules/supports-color": { + "version": "8.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "lambdas/api-handler/node_modules/wrap-ansi": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "lambdas/api-handler/node_modules/write-file-atomic": { + "version": "4.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "lambdas/api-handler/node_modules/yargs": { + "version": "17.7.2", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "lambdas/api-handler/node_modules/zod": { + "version": "4.1.12", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "lambdas/authorizer": { + "name": "nhs-notify-supplier-authorizer", + "version": "0.0.1", + "dependencies": { + "esbuild": "^0.25.11" + }, + "devDependencies": { + "@tsconfig/node22": "^22.0.2", + "@types/aws-lambda": "^8.10.148", + "@types/jest": "^30.0.0", + "jest": "^30.2.0", + "jest-mock-extended": "^4.0.0", + "typescript": "^5.8.3" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@apidevtools/json-schema-ref-parser": { + "version": "11.9.3", + "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-11.9.3.tgz", + "integrity": "sha512-60vepv88RwcJtSHrD6MjIL6Ta3SOYbgfnkHb+ppAVK+o9mXprRtulx7VlRl3lN3bbvysAfCS7WMVfhUYemB0IQ==", + "license": "MIT", + "dependencies": { + "@jsdevtools/ono": "^7.1.3", + "@types/json-schema": "^7.0.15", + "js-yaml": "^4.1.0" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/philsturgeon" + } + }, + "node_modules/@asamuzakjp/css-color": { + "version": "3.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@csstools/css-calc": "^2.1.3", + "@csstools/css-color-parser": "^3.0.9", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "lru-cache": "^10.4.3" + } + }, + "node_modules/@asamuzakjp/css-color/node_modules/lru-cache": { + "version": "10.4.3", + "dev": true, + "license": "ISC" + }, + "node_modules/@asyncapi/bundler": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/@asyncapi/bundler/-/bundler-0.6.4.tgz", + "integrity": "sha512-lKZo2FF2TKt4n6Qm8vP/JOEEGE04gdH/D9oHmBt/NfOylMaw8XoFsI+k+IJyzpVMzREjZfxGf9gNzfW0CWRf5g==", + "license": "Apache-2.0", + "dependencies": { + "@apidevtools/json-schema-ref-parser": "^11.5.4", + "@types/json-schema": "^7.0.11", + "@ungap/structured-clone": "^1.2.0", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21" + } + }, + "node_modules/@asyncapi/specs": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@asyncapi/specs/-/specs-6.10.0.tgz", + "integrity": "sha512-vB5oKLsdrLUORIZ5BXortZTlVyGWWMC1Nud/0LtgxQ3Yn2738HigAD6EVqScvpPsDUI/bcLVsYEXN4dtXQHVng==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.11" + } + }, + "node_modules/@aws-crypto/crc32": { + "version": "5.2.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-crypto/crc32c": { + "version": "5.2.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/sha1-browser": { + "version": "5.2.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/supports-web-crypto": "^5.2.0", + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/sha1-browser/node_modules/@smithy/is-array-buffer": { + "version": "2.2.0", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/sha1-browser/node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/sha1-browser/node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/sha256-browser": { + "version": "5.2.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-js": "^5.2.0", + "@aws-crypto/supports-web-crypto": "^5.2.0", + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/is-array-buffer": { + "version": "2.2.0", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/sha256-js": { + "version": "5.2.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-crypto/supports-web-crypto": { + "version": "5.2.0", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/util": { + "version": "5.2.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.222.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/util/node_modules/@smithy/is-array-buffer": { + "version": "2.2.0", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@aws-crypto/util/node_modules/@smithy/util-buffer-from": { "version": "2.2.0", "license": "Apache-2.0", @@ -4182,1684 +5249,2211 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/compat-data": { - "version": "7.28.0", + "node_modules/@babel/compat-data": { + "version": "7.28.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.28.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.3", + "@babel/parser": "^7.28.3", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.3", + "@babel/types": "^7.28.2", + "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/core/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.28.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.3", + "@babel/types": "^7.28.2", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.28.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", "dev": true, "license": "MIT", - "engines": { - "node": ">=6.9.0" + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/core": { - "version": "7.28.3", + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.27.1", "dev": true, "license": "MIT", "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.3", - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-module-transforms": "^7.28.3", - "@babel/helpers": "^7.28.3", - "@babel/parser": "^7.28.3", - "@babel/template": "^7.27.2", - "@babel/traverse": "^7.28.3", - "@babel/types": "^7.28.2", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/generator": { - "version": "7.28.3", + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.28.3", - "@babel/types": "^7.28.2", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", - "jsesc": "^3.0.2" + "@babel/helper-plugin-utils": "^7.8.0" }, - "engines": { - "node": ">=6.9.0" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.27.2", + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.27.2", - "@babel/helper-validator-option": "^7.27.1", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" + "@babel/helper-plugin-utils": "^7.10.4" }, - "engines": { - "node": ">=6.9.0" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/helper-globals": { - "version": "7.28.0", + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", "dev": true, "license": "MIT", - "engines": { - "node": ">=6.9.0" + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/helper-module-imports": { - "version": "7.27.1", + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" + "@babel/helper-plugin-utils": "^7.8.0" }, - "engines": { - "node": ">=6.9.0" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.28.3", + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.28.3" + "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.27.1", + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", "dev": true, "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/helper-string-parser": { + "node_modules/@babel/plugin-syntax-typescript": { "version": "7.27.1", "dev": true, "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.28.5", + "node_modules/@babel/runtime": { + "version": "7.28.3", "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-validator-option": { - "version": "7.27.1", + "node_modules/@babel/template": { + "version": "7.27.2", "dev": true, "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helpers": { + "node_modules/@babel/traverse": { "version": "7.28.3", "dev": true, "license": "MIT", "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.3", "@babel/template": "^7.27.2", - "@babel/types": "^7.28.2" + "@babel/types": "^7.28.2", + "debug": "^4.3.1" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/parser": { - "version": "7.28.3", + "node_modules/@babel/types": { + "version": "7.28.2", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.28.2" - }, - "bin": { - "parser": "bin/babel-parser.js" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" }, "engines": { - "node": ">=6.0.0" + "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", + "node_modules/@balena/dockerignore": { + "version": "1.0.2", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "dev": true, + "license": "MIT" + }, + "node_modules/@borewit/text-codec": { + "version": "0.1.1", "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" } }, - "node_modules/@babel/plugin-syntax-bigint": { - "version": "7.8.3", + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@jridgewell/trace-mapping": "0.3.9" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=12" } }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" } }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", + "node_modules/@csstools/color-helpers": { + "version": "5.0.2", "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.27.1", + "node_modules/@csstools/css-calc": { + "version": "2.1.4", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, "engines": { - "node": ">=6.9.0" + "node": ">=18" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" } }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", + "node_modules/@csstools/css-color-parser": { + "version": "3.0.10", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" + "@csstools/color-helpers": "^5.0.2", + "@csstools/css-calc": "^2.1.4" + }, + "engines": { + "node": ">=18" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" } }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", + "node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.5", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "engines": { + "node": ">=18" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@csstools/css-tokenizer": "^3.0.4" } }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.27.1", + "node_modules/@csstools/css-tokenizer": { + "version": "3.0.4", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", + "node_modules/@emotion/is-prop-valid": { + "version": "1.2.2", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@emotion/memoize": "^0.8.1" } }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", + "node_modules/@emotion/memoize": { + "version": "0.8.1", "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } + "license": "MIT" }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", + "node_modules/@emotion/unitless": { + "version": "0.8.1", "dev": true, + "license": "MIT" + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.11.tgz", + "integrity": "sha512-Xt1dOL13m8u0WE8iplx9Ibbm+hFAO0GsU2P34UNoDGvZYkY8ifSiy6Zuc1lYxfG7svWE2fzqCUmFp5HCn51gJg==", + "cpu": [ + "ppc64" + ], "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "dev": true, + "node_modules/@esbuild/android-arm": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.11.tgz", + "integrity": "sha512-uoa7dU+Dt3HYsethkJ1k6Z9YdcHjTrSb5NUy66ZfZaSV8hEYGD5ZHbEMXnqLFlbBflLsl89Zke7CAdDJ4JI+Gg==", + "cpu": [ + "arm" + ], "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "dev": true, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.11.tgz", + "integrity": "sha512-9slpyFBc4FPPz48+f6jyiXOx/Y4v34TUeDDXJpZqAWQn/08lKGeD8aDp9TMn9jDz2CiEuHwfhRmGBvpnd/PWIQ==", + "cpu": [ + "arm64" + ], "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "dev": true, + "node_modules/@esbuild/android-x64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.11.tgz", + "integrity": "sha512-Sgiab4xBjPU1QoPEIqS3Xx+R2lezu0LKIEcYe6pftr56PqPygbB7+szVnzoShbx64MUupqoE0KyRlN7gezbl8g==", + "cpu": [ + "x64" + ], "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "dev": true, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.11.tgz", + "integrity": "sha512-VekY0PBCukppoQrycFxUqkCojnTQhdec0vevUL/EDOCnXd9LKWqD/bHwMPzigIJXPhC59Vd1WFIL57SKs2mg4w==", + "cpu": [ + "arm64" + ], "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "dev": true, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.11.tgz", + "integrity": "sha512-+hfp3yfBalNEpTGp9loYgbknjR695HkqtY3d3/JjSRUyPg/xd6q+mQqIb5qdywnDxRZykIHs3axEqU6l1+oWEQ==", + "cpu": [ + "x64" + ], "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.27.1", - "dev": true, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.11.tgz", + "integrity": "sha512-CmKjrnayyTJF2eVuO//uSjl/K3KsMIeYeyN7FyDBjsR3lnSJHaXlVoAK8DZa7lXWChbuOk7NjAc7ygAwrnPBhA==", + "cpu": [ + "arm64" + ], "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/runtime": { - "version": "7.28.3", - "dev": true, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.11.tgz", + "integrity": "sha512-Dyq+5oscTJvMaYPvW3x3FLpi2+gSZTCE/1ffdwuM6G1ARang/mb3jvjxs0mw6n3Lsw84ocfo9CrNMqc5lTfGOw==", + "cpu": [ + "x64" + ], "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=6.9.0" + "node": ">=18" } }, - "node_modules/@babel/template": { - "version": "7.27.2", - "dev": true, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.11.tgz", + "integrity": "sha512-TBMv6B4kCfrGJ8cUPo7vd6NECZH/8hPpBHHlYI3qzoYFvWu2AdTvZNuU/7hsbKWqu/COU7NIK12dHAAqBLLXgw==", + "cpu": [ + "arm" + ], "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/parser": "^7.27.2", - "@babel/types": "^7.27.1" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" + "node": ">=18" } }, - "node_modules/@babel/traverse": { - "version": "7.28.3", - "dev": true, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.11.tgz", + "integrity": "sha512-Qr8AzcplUhGvdyUF08A1kHU3Vr2O88xxP0Tm8GcdVOUm25XYcMPp2YqSVHbLuXzYQMf9Bh/iKx7YPqECs6ffLA==", + "cpu": [ + "arm64" + ], "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.3", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.3", - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.2", - "debug": "^4.3.1" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" + "node": ">=18" } }, - "node_modules/@babel/types": { - "version": "7.28.2", - "dev": true, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.11.tgz", + "integrity": "sha512-TmnJg8BMGPehs5JKrCLqyWTVAvielc615jbkOirATQvWWB1NMXY77oLMzsUjRLa0+ngecEmDGqt5jiDC6bfvOw==", + "cpu": [ + "ia32" + ], "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" + "node": ">=18" } }, - "node_modules/@balena/dockerignore": { - "version": "1.0.2", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "dev": true, - "license": "MIT" - }, - "node_modules/@borewit/text-codec": { - "version": "0.1.1", - "dev": true, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.11.tgz", + "integrity": "sha512-DIGXL2+gvDaXlaq8xruNXUJdT5tF+SBbJQKbWy/0J7OhU8gOHOzKmGIlfTTl6nHaCOoipxQbuJi7O++ldrxgMw==", + "cpu": [ + "loong64" + ], "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "dev": true, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.11.tgz", + "integrity": "sha512-Osx1nALUJu4pU43o9OyjSCXokFkFbyzjXb6VhGIJZQ5JZi8ylCQ9/LFagolPsHtgw6himDSyb5ETSfmp4rpiKQ==", + "cpu": [ + "mips64el" + ], "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=12" + "node": ">=18" } }, - "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "dev": true, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.11.tgz", + "integrity": "sha512-nbLFgsQQEsBa8XSgSTSlrnBSrpoWh7ioFDUmwo158gIm5NNP+17IYmNWzaIzWmgCxq56vfr34xGkOcZ7jX6CPw==", + "cpu": [ + "ppc64" + ], "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@csstools/color-helpers": { - "version": "5.0.2", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } + "optional": true, + "os": [ + "linux" ], - "license": "MIT-0", "engines": { "node": ">=18" } }, - "node_modules/@csstools/css-calc": { - "version": "2.1.4", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.11.tgz", + "integrity": "sha512-HfyAmqZi9uBAbgKYP1yGuI7tSREXwIb438q0nqvlpxAOs3XnZ8RsisRfmVsgV486NdjD7Mw2UrFSw51lzUk1ww==", + "cpu": [ + "riscv64" ], "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { "node": ">=18" - }, - "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" } }, - "node_modules/@csstools/css-color-parser": { - "version": "3.0.10", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.11.tgz", + "integrity": "sha512-HjLqVgSSYnVXRisyfmzsH6mXqyvj0SA7pG5g+9W7ESgwA70AXYNpfKBqh1KbTxmQVaYxpzA/SvlB9oclGPbApw==", + "cpu": [ + "s390x" ], "license": "MIT", - "dependencies": { - "@csstools/color-helpers": "^5.0.2", - "@csstools/css-calc": "^2.1.4" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { "node": ">=18" - }, - "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" } }, - "node_modules/@csstools/css-parser-algorithms": { - "version": "3.0.5", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } + "node_modules/@esbuild/linux-x64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.11.tgz", + "integrity": "sha512-HSFAT4+WYjIhrHxKBwGmOOSpphjYkcswF449j6EjsjbinTZbp8PJtjsVK1XFJStdzXdy/jaddAep2FGY+wyFAQ==", + "cpu": [ + "x64" ], "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { "node": ">=18" - }, - "peerDependencies": { - "@csstools/css-tokenizer": "^3.0.4" } }, - "node_modules/@csstools/css-tokenizer": { - "version": "3.0.4", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.11.tgz", + "integrity": "sha512-hr9Oxj1Fa4r04dNpWr3P8QKVVsjQhqrMSUzZzf+LZcYjZNqhA3IAfPQdEh1FLVUJSiu6sgAwp3OmwBfbFgG2Xg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" ], - "license": "MIT", "engines": { "node": ">=18" } }, - "node_modules/@emotion/is-prop-valid": { - "version": "1.2.2", - "dev": true, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.11.tgz", + "integrity": "sha512-u7tKA+qbzBydyj0vgpu+5h5AeudxOAGncb8N6C9Kh1N4n7wU1Xw1JDApsRjpShRpXRQlJLb9wY28ELpwdPcZ7A==", + "cpu": [ + "x64" + ], "license": "MIT", - "dependencies": { - "@emotion/memoize": "^0.8.1" + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@emotion/memoize": { - "version": "0.8.1", - "dev": true, - "license": "MIT" - }, - "node_modules/@emotion/unitless": { - "version": "0.8.1", - "dev": true, - "license": "MIT" - }, - "node_modules/@esbuild/aix-ppc64": { + "node_modules/@esbuild/openbsd-arm64": { "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.11.tgz", - "integrity": "sha512-Xt1dOL13m8u0WE8iplx9Ibbm+hFAO0GsU2P34UNoDGvZYkY8ifSiy6Zuc1lYxfG7svWE2fzqCUmFp5HCn51gJg==", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.11.tgz", + "integrity": "sha512-Qq6YHhayieor3DxFOoYM1q0q1uMFYb7cSpLD2qzDSvK1NAvqFi8Xgivv0cFC6J+hWVw2teCYltyy9/m/14ryHg==", "cpu": [ - "ppc64" + "arm64" ], "license": "MIT", "optional": true, "os": [ - "aix" + "openbsd" ], "engines": { "node": ">=18" } }, - "node_modules/@esbuild/android-arm": { + "node_modules/@esbuild/openbsd-x64": { "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.11.tgz", - "integrity": "sha512-uoa7dU+Dt3HYsethkJ1k6Z9YdcHjTrSb5NUy66ZfZaSV8hEYGD5ZHbEMXnqLFlbBflLsl89Zke7CAdDJ4JI+Gg==", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.11.tgz", + "integrity": "sha512-CN+7c++kkbrckTOz5hrehxWN7uIhFFlmS/hqziSFVWpAzpWrQoAG4chH+nN3Be+Kzv/uuo7zhX716x3Sn2Jduw==", "cpu": [ - "arm" + "x64" ], "license": "MIT", "optional": true, "os": [ - "android" + "openbsd" ], "engines": { "node": ">=18" } }, - "node_modules/@esbuild/android-arm64": { + "node_modules/@esbuild/openharmony-arm64": { "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.11.tgz", - "integrity": "sha512-9slpyFBc4FPPz48+f6jyiXOx/Y4v34TUeDDXJpZqAWQn/08lKGeD8aDp9TMn9jDz2CiEuHwfhRmGBvpnd/PWIQ==", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.11.tgz", + "integrity": "sha512-rOREuNIQgaiR+9QuNkbkxubbp8MSO9rONmwP5nKncnWJ9v5jQ4JxFnLu4zDSRPf3x4u+2VN4pM4RdyIzDty/wQ==", "cpu": [ "arm64" ], "license": "MIT", "optional": true, "os": [ - "android" + "openharmony" ], "engines": { "node": ">=18" } }, - "node_modules/@esbuild/android-x64": { + "node_modules/@esbuild/sunos-x64": { "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.11.tgz", - "integrity": "sha512-Sgiab4xBjPU1QoPEIqS3Xx+R2lezu0LKIEcYe6pftr56PqPygbB7+szVnzoShbx64MUupqoE0KyRlN7gezbl8g==", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.11.tgz", + "integrity": "sha512-nq2xdYaWxyg9DcIyXkZhcYulC6pQ2FuCgem3LI92IwMgIZ69KHeY8T4Y88pcwoLIjbed8n36CyKoYRDygNSGhA==", "cpu": [ "x64" ], "license": "MIT", "optional": true, "os": [ - "android" + "sunos" ], "engines": { "node": ">=18" } }, - "node_modules/@esbuild/darwin-arm64": { + "node_modules/@esbuild/win32-arm64": { "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.11.tgz", - "integrity": "sha512-VekY0PBCukppoQrycFxUqkCojnTQhdec0vevUL/EDOCnXd9LKWqD/bHwMPzigIJXPhC59Vd1WFIL57SKs2mg4w==", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.11.tgz", + "integrity": "sha512-3XxECOWJq1qMZ3MN8srCJ/QfoLpL+VaxD/WfNRm1O3B4+AZ/BnLVgFbUV3eiRYDMXetciH16dwPbbHqwe1uU0Q==", "cpu": [ "arm64" ], "license": "MIT", "optional": true, "os": [ - "darwin" + "win32" ], "engines": { "node": ">=18" } }, - "node_modules/@esbuild/darwin-x64": { + "node_modules/@esbuild/win32-ia32": { "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.11.tgz", - "integrity": "sha512-+hfp3yfBalNEpTGp9loYgbknjR695HkqtY3d3/JjSRUyPg/xd6q+mQqIb5qdywnDxRZykIHs3axEqU6l1+oWEQ==", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.11.tgz", + "integrity": "sha512-3ukss6gb9XZ8TlRyJlgLn17ecsK4NSQTmdIXRASVsiS2sQ6zPPZklNJT5GR5tE/MUarymmy8kCEf5xPCNCqVOA==", "cpu": [ - "x64" + "ia32" ], "license": "MIT", "optional": true, "os": [ - "darwin" + "win32" ], "engines": { "node": ">=18" } }, - "node_modules/@esbuild/freebsd-arm64": { + "node_modules/@esbuild/win32-x64": { "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.11.tgz", - "integrity": "sha512-CmKjrnayyTJF2eVuO//uSjl/K3KsMIeYeyN7FyDBjsR3lnSJHaXlVoAK8DZa7lXWChbuOk7NjAc7ygAwrnPBhA==", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.11.tgz", + "integrity": "sha512-D7Hpz6A2L4hzsRpPaCYkQnGOotdUpDzSGRIv9I+1ITdHROSFUWW95ZPZWQmGka1Fg7W3zFJowyn9WGwMJ0+KPA==", "cpu": [ - "arm64" + "x64" ], "license": "MIT", "optional": true, "os": [ - "freebsd" + "win32" ], "engines": { - "node": ">=18" + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.0", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.1", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.7", + "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.12", + "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", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.4.1", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.16.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.16.0", + "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": "3.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ajv": { + "version": "6.12.6", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.12", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ignore": { + "version": "5.3.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { + "version": "0.4.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/js": { + "version": "9.38.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.7", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.11.tgz", - "integrity": "sha512-Dyq+5oscTJvMaYPvW3x3FLpi2+gSZTCE/1ffdwuM6G1ARang/mb3jvjxs0mw6n3Lsw84ocfo9CrNMqc5lTfGOw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], + "node_modules/@eslint/plugin-kit": { + "version": "0.4.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.16.0", + "levn": "^0.4.1" + }, "engines": { - "node": ">=18" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@esbuild/linux-arm": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.11.tgz", - "integrity": "sha512-TBMv6B4kCfrGJ8cUPo7vd6NECZH/8hPpBHHlYI3qzoYFvWu2AdTvZNuU/7hsbKWqu/COU7NIK12dHAAqBLLXgw==", - "cpu": [ - "arm" - ], + "node_modules/@exodus/schemasafe": { + "version": "1.3.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@faker-js/faker": { + "version": "7.6.0", + "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=18" + "node": ">=14.0.0", + "npm": ">=6.0.0" } }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.11.tgz", - "integrity": "sha512-Qr8AzcplUhGvdyUF08A1kHU3Vr2O88xxP0Tm8GcdVOUm25XYcMPp2YqSVHbLuXzYQMf9Bh/iKx7YPqECs6ffLA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "node_modules/@grpc/grpc-js": { + "version": "1.13.4", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@grpc/proto-loader": "^0.7.13", + "@js-sdsl/ordered-map": "^4.4.2" + }, "engines": { - "node": ">=18" + "node": ">=12.10.0" } }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.11.tgz", - "integrity": "sha512-TmnJg8BMGPehs5JKrCLqyWTVAvielc615jbkOirATQvWWB1NMXY77oLMzsUjRLa0+ngecEmDGqt5jiDC6bfvOw==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "node_modules/@grpc/proto-loader": { + "version": "0.7.15", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "lodash.camelcase": "^4.3.0", + "long": "^5.0.0", + "protobufjs": "^7.2.5", + "yargs": "^17.7.2" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, "engines": { - "node": ">=18" + "node": ">=6" } }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.11.tgz", - "integrity": "sha512-DIGXL2+gvDaXlaq8xruNXUJdT5tF+SBbJQKbWy/0J7OhU8gOHOzKmGIlfTTl6nHaCOoipxQbuJi7O++ldrxgMw==", - "cpu": [ - "loong64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "node_modules/@grpc/proto-loader/node_modules/cliui": { + "version": "8.0.1", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, "engines": { - "node": ">=18" + "node": ">=12" } }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.11.tgz", - "integrity": "sha512-Osx1nALUJu4pU43o9OyjSCXokFkFbyzjXb6VhGIJZQ5JZi8ylCQ9/LFagolPsHtgw6himDSyb5ETSfmp4rpiKQ==", - "cpu": [ - "mips64el" - ], + "node_modules/@grpc/proto-loader/node_modules/wrap-ansi": { + "version": "7.0.0", + "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, "engines": { - "node": ">=18" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.11.tgz", - "integrity": "sha512-nbLFgsQQEsBa8XSgSTSlrnBSrpoWh7ioFDUmwo158gIm5NNP+17IYmNWzaIzWmgCxq56vfr34xGkOcZ7jX6CPw==", - "cpu": [ - "ppc64" - ], + "node_modules/@grpc/proto-loader/node_modules/yargs": { + "version": "17.7.2", + "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, "engines": { - "node": ">=18" + "node": ">=12" } }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.11.tgz", - "integrity": "sha512-HfyAmqZi9uBAbgKYP1yGuI7tSREXwIb438q0nqvlpxAOs3XnZ8RsisRfmVsgV486NdjD7Mw2UrFSw51lzUk1ww==", - "cpu": [ - "riscv64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "node_modules/@humanfs/core": { + "version": "0.19.1", + "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">=18" + "node": ">=18.18.0" } }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.11.tgz", - "integrity": "sha512-HjLqVgSSYnVXRisyfmzsH6mXqyvj0SA7pG5g+9W7ESgwA70AXYNpfKBqh1KbTxmQVaYxpzA/SvlB9oclGPbApw==", - "cpu": [ - "s390x" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "node_modules/@humanfs/node": { + "version": "0.16.6", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.3.0" + }, "engines": { - "node": ">=18" + "node": ">=18.18.0" } }, - "node_modules/@esbuild/linux-x64": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.11.tgz", - "integrity": "sha512-HSFAT4+WYjIhrHxKBwGmOOSpphjYkcswF449j6EjsjbinTZbp8PJtjsVK1XFJStdzXdy/jaddAep2FGY+wyFAQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">=18" + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.11.tgz", - "integrity": "sha512-hr9Oxj1Fa4r04dNpWr3P8QKVVsjQhqrMSUzZzf+LZcYjZNqhA3IAfPQdEh1FLVUJSiu6sgAwp3OmwBfbFgG2Xg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/momoa": { + "version": "2.0.4", + "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">=18" + "node": ">=10.10.0" } }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.11.tgz", - "integrity": "sha512-u7tKA+qbzBydyj0vgpu+5h5AeudxOAGncb8N6C9Kh1N4n7wU1Xw1JDApsRjpShRpXRQlJLb9wY28ELpwdPcZ7A==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">=18" + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.11.tgz", - "integrity": "sha512-Qq6YHhayieor3DxFOoYM1q0q1uMFYb7cSpLD2qzDSvK1NAvqFi8Xgivv0cFC6J+hWVw2teCYltyy9/m/14ryHg==", - "cpu": [ - "arm64" - ], + "node_modules/@inquirer/external-editor": { + "version": "1.0.1", + "dev": true, "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], + "dependencies": { + "chardet": "^2.1.0", + "iconv-lite": "^0.6.3" + }, "engines": { "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.11.tgz", - "integrity": "sha512-CN+7c++kkbrckTOz5hrehxWN7uIhFFlmS/hqziSFVWpAzpWrQoAG4chH+nN3Be+Kzv/uuo7zhX716x3Sn2Jduw==", - "cpu": [ - "x64" - ], + "node_modules/@internal/datastore": { + "resolved": "internal/datastore", + "link": true + }, + "node_modules/@internal/helpers": { + "resolved": "internal/helpers", + "link": true + }, + "node_modules/@isaacs/balanced-match": { + "version": "4.0.1", + "dev": true, "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], "engines": { - "node": ">=18" + "node": "20 || >=22" } }, - "node_modules/@esbuild/openharmony-arm64": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.11.tgz", - "integrity": "sha512-rOREuNIQgaiR+9QuNkbkxubbp8MSO9rONmwP5nKncnWJ9v5jQ4JxFnLu4zDSRPf3x4u+2VN4pM4RdyIzDty/wQ==", - "cpu": [ - "arm64" - ], + "node_modules/@isaacs/brace-expansion": { + "version": "5.0.0", + "dev": true, "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], + "dependencies": { + "@isaacs/balanced-match": "^4.0.1" + }, "engines": { - "node": ">=18" + "node": "20 || >=22" } }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.11.tgz", - "integrity": "sha512-nq2xdYaWxyg9DcIyXkZhcYulC6pQ2FuCgem3LI92IwMgIZ69KHeY8T4Y88pcwoLIjbed8n36CyKoYRDygNSGhA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, "engines": { - "node": ">=18" + "node": ">=12" } }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.11.tgz", - "integrity": "sha512-3XxECOWJq1qMZ3MN8srCJ/QfoLpL+VaxD/WfNRm1O3B4+AZ/BnLVgFbUV3eiRYDMXetciH16dwPbbHqwe1uU0Q==", - "cpu": [ - "arm64" - ], + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.1.0", + "dev": true, "license": "MIT", - "optional": true, - "os": [ - "win32" - ], "engines": { - "node": ">=18" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.11.tgz", - "integrity": "sha512-3ukss6gb9XZ8TlRyJlgLn17ecsK4NSQTmdIXRASVsiS2sQ6zPPZklNJT5GR5tE/MUarymmy8kCEf5xPCNCqVOA==", - "cpu": [ - "ia32" - ], + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "dev": true, "license": "MIT", - "optional": true, - "os": [ - "win32" - ], "engines": { - "node": ">=18" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@esbuild/win32-x64": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.11.tgz", - "integrity": "sha512-D7Hpz6A2L4hzsRpPaCYkQnGOotdUpDzSGRIv9I+1ITdHROSFUWW95ZPZWQmGka1Fg7W3zFJowyn9WGwMJ0+KPA==", - "cpu": [ - "x64" - ], + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "dev": true, "license": "MIT", - "optional": true, - "os": [ - "win32" - ], + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, "engines": { - "node": ">=18" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.9.0", + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", "dev": true, "license": "MIT", "dependencies": { - "eslint-visitor-keys": "^3.4.3" + "ansi-regex": "^6.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=12" }, "funding": { - "url": "https://opencollective.com/eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/@eslint-community/regexpp": { - "version": "4.12.1", + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", "dev": true, "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/@eslint/config-array": { - "version": "0.21.1", + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", "dev": true, - "license": "Apache-2.0", + "license": "ISC", "dependencies": { - "@eslint/object-schema": "^2.1.7", - "debug": "^4.3.1", - "minimatch": "^3.1.2" + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=8" } }, - "node_modules/@eslint/config-array/node_modules/brace-expansion": { - "version": "1.1.12", + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "sprintf-js": "~1.0.2" } }, - "node_modules/@eslint/config-array/node_modules/minimatch": { - "version": "3.1.2", + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "brace-expansion": "^1.1.7" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": "*" + "node": ">=8" } }, - "node_modules/@eslint/config-helpers": { - "version": "0.4.1", + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.1", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "@eslint/core": "^0.16.0" + "argparse": "^1.0.7", + "esprima": "^4.0.0" }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/@eslint/core": { - "version": "0.16.0", + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.15" + "p-locate": "^4.1.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=8" } }, - "node_modules/@eslint/eslintrc": { - "version": "3.3.1", + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", "dev": true, "license": "MIT", "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" + "p-try": "^2.0.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=6" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@eslint/eslintrc/node_modules/ajv": { - "version": "6.12.6", + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", "dev": true, "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "p-limit": "^2.2.0" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "engines": { + "node": ">=8" } }, - "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.12", + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", "dev": true, "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "engines": { + "node": ">=8" } }, - "node_modules/@eslint/eslintrc/node_modules/ignore": { - "version": "5.3.2", + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", "dev": true, "license": "MIT", "engines": { - "node": ">= 4" + "node": ">=8" } }, - "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { - "version": "0.4.1", - "dev": true, - "license": "MIT" - }, - "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.2", + "node_modules/@jest/console": { + "version": "29.7.0", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "brace-expansion": "^1.1.7" + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" }, "engines": { - "node": "*" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@eslint/js": { - "version": "9.38.0", + "node_modules/@jest/core": { + "version": "30.2.0", "dev": true, "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "dependencies": { + "@jest/console": "30.2.0", + "@jest/pattern": "30.0.1", + "@jest/reporters": "30.2.0", + "@jest/test-result": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", + "@types/node": "*", + "ansi-escapes": "^4.3.2", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "exit-x": "^0.2.2", + "graceful-fs": "^4.2.11", + "jest-changed-files": "30.2.0", + "jest-config": "30.2.0", + "jest-haste-map": "30.2.0", + "jest-message-util": "30.2.0", + "jest-regex-util": "30.0.1", + "jest-resolve": "30.2.0", + "jest-resolve-dependencies": "30.2.0", + "jest-runner": "30.2.0", + "jest-runtime": "30.2.0", + "jest-snapshot": "30.2.0", + "jest-util": "30.2.0", + "jest-validate": "30.2.0", + "jest-watcher": "30.2.0", + "micromatch": "^4.0.8", + "pretty-format": "30.2.0", + "slash": "^3.0.0" }, - "funding": { - "url": "https://eslint.org/donate" - } - }, - "node_modules/@eslint/object-schema": { - "version": "2.1.7", - "dev": true, - "license": "Apache-2.0", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "node_modules/@eslint/plugin-kit": { - "version": "0.4.0", + "node_modules/@jest/core/node_modules/@jest/console": { + "version": "30.2.0", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "@eslint/core": "^0.16.0", - "levn": "^0.4.1" + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "jest-message-util": "30.2.0", + "jest-util": "30.2.0", + "slash": "^3.0.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@exodus/schemasafe": { - "version": "1.3.0", - "dev": true, - "license": "MIT" - }, - "node_modules/@faker-js/faker": { - "version": "7.6.0", + "node_modules/@jest/core/node_modules/@jest/schemas": { + "version": "30.0.5", "dev": true, "license": "MIT", - "engines": { - "node": ">=14.0.0", - "npm": ">=6.0.0" - } - }, - "node_modules/@grpc/grpc-js": { - "version": "1.13.4", - "dev": true, - "license": "Apache-2.0", "dependencies": { - "@grpc/proto-loader": "^0.7.13", - "@js-sdsl/ordered-map": "^4.4.2" + "@sinclair/typebox": "^0.34.0" }, "engines": { - "node": ">=12.10.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@grpc/proto-loader": { - "version": "0.7.15", + "node_modules/@jest/core/node_modules/@jest/test-result": { + "version": "30.2.0", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "lodash.camelcase": "^4.3.0", - "long": "^5.0.0", - "protobufjs": "^7.2.5", - "yargs": "^17.7.2" - }, - "bin": { - "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + "@jest/console": "30.2.0", + "@jest/types": "30.2.0", + "@types/istanbul-lib-coverage": "^2.0.6", + "collect-v8-coverage": "^1.0.2" }, "engines": { - "node": ">=6" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@grpc/proto-loader/node_modules/cliui": { - "version": "8.0.1", + "node_modules/@jest/core/node_modules/@jest/types": { + "version": "30.2.0", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" + "@jest/pattern": "30.0.1", + "@jest/schemas": "30.0.5", + "@types/istanbul-lib-coverage": "^2.0.6", + "@types/istanbul-reports": "^3.0.4", + "@types/node": "*", + "@types/yargs": "^17.0.33", + "chalk": "^4.1.2" }, "engines": { - "node": ">=12" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@grpc/proto-loader/node_modules/wrap-ansi": { - "version": "7.0.0", + "node_modules/@jest/core/node_modules/@sinclair/typebox": { + "version": "0.34.41", + "dev": true, + "license": "MIT" + }, + "node_modules/@jest/core/node_modules/ansi-styles": { + "version": "5.2.0", "dev": true, "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@grpc/proto-loader/node_modules/yargs": { - "version": "17.7.2", + "node_modules/@jest/core/node_modules/jest-message-util": { + "version": "30.2.0", "dev": true, "license": "MIT", "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@humanfs/core": { - "version": "0.19.1", - "dev": true, - "license": "Apache-2.0", + "@babel/code-frame": "^7.27.1", + "@jest/types": "30.2.0", + "@types/stack-utils": "^2.0.3", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "micromatch": "^4.0.8", + "pretty-format": "30.2.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.6" + }, "engines": { - "node": ">=18.18.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@humanfs/node": { - "version": "0.16.6", + "node_modules/@jest/core/node_modules/jest-util": { + "version": "30.2.0", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "@humanfs/core": "^0.19.1", - "@humanwhocodes/retry": "^0.3.0" + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.2" }, "engines": { - "node": ">=18.18.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { - "version": "0.3.1", + "node_modules/@jest/core/node_modules/picomatch": { + "version": "4.0.3", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "engines": { - "node": ">=18.18" + "node": ">=12" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", + "node_modules/@jest/core/node_modules/pretty-format": { + "version": "30.2.0", "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.22" + "license": "MIT", + "dependencies": { + "@jest/schemas": "30.0.5", + "ansi-styles": "^5.2.0", + "react-is": "^18.3.1" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@humanwhocodes/momoa": { - "version": "2.0.4", + "node_modules/@jest/diff-sequences": { + "version": "30.0.1", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "engines": { - "node": ">=10.10.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@humanwhocodes/retry": { - "version": "0.4.3", + "node_modules/@jest/environment": { + "version": "30.2.0", "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18" + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "30.2.0", + "@jest/types": "30.2.0", + "@types/node": "*", + "jest-mock": "30.2.0" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@inquirer/external-editor": { - "version": "1.0.1", + "node_modules/@jest/environment-jsdom-abstract": { + "version": "30.0.5", "dev": true, "license": "MIT", "dependencies": { - "chardet": "^2.1.0", - "iconv-lite": "^0.6.3" + "@jest/environment": "30.0.5", + "@jest/fake-timers": "30.0.5", + "@jest/types": "30.0.5", + "@types/jsdom": "^21.1.7", + "@types/node": "*", + "jest-mock": "30.0.5", + "jest-util": "30.0.5" }, "engines": { - "node": ">=18" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" }, "peerDependencies": { - "@types/node": ">=18" + "canvas": "^3.0.0", + "jsdom": "*" }, "peerDependenciesMeta": { - "@types/node": { + "canvas": { "optional": true } } }, - "node_modules/@internal/datastore": { - "resolved": "internal/datastore", - "link": true - }, - "node_modules/@internal/helpers": { - "resolved": "internal/helpers", - "link": true - }, - "node_modules/@isaacs/balanced-match": { - "version": "4.0.1", + "node_modules/@jest/environment-jsdom-abstract/node_modules/@jest/environment": { + "version": "30.0.5", "dev": true, "license": "MIT", + "dependencies": { + "@jest/fake-timers": "30.0.5", + "@jest/types": "30.0.5", + "@types/node": "*", + "jest-mock": "30.0.5" + }, "engines": { - "node": "20 || >=22" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@isaacs/brace-expansion": { - "version": "5.0.0", + "node_modules/@jest/environment-jsdom-abstract/node_modules/@jest/fake-timers": { + "version": "30.0.5", "dev": true, "license": "MIT", "dependencies": { - "@isaacs/balanced-match": "^4.0.1" + "@jest/types": "30.0.5", + "@sinonjs/fake-timers": "^13.0.0", + "@types/node": "*", + "jest-message-util": "30.0.5", + "jest-mock": "30.0.5", + "jest-util": "30.0.5" }, "engines": { - "node": "20 || >=22" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", + "node_modules/@jest/environment-jsdom-abstract/node_modules/@jest/fake-timers/node_modules/jest-message-util": { + "version": "30.0.5", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + "@babel/code-frame": "^7.27.1", + "@jest/types": "30.0.5", + "@types/stack-utils": "^2.0.3", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "micromatch": "^4.0.8", + "pretty-format": "30.0.5", + "slash": "^3.0.0", + "stack-utils": "^2.0.6" }, "engines": { - "node": ">=12" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.1.0", + "node_modules/@jest/environment-jsdom-abstract/node_modules/@jest/schemas": { + "version": "30.0.5", "dev": true, "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.34.0" + }, "engines": { - "node": ">=12" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/environment-jsdom-abstract/node_modules/@jest/types": { + "version": "30.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/pattern": "30.0.1", + "@jest/schemas": "30.0.5", + "@types/istanbul-lib-coverage": "^2.0.6", + "@types/istanbul-reports": "^3.0.4", + "@types/node": "*", + "@types/yargs": "^17.0.33", + "chalk": "^4.1.2" }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.1", + "node_modules/@jest/environment-jsdom-abstract/node_modules/@sinclair/typebox": { + "version": "0.34.38", + "dev": true, + "license": "MIT" + }, + "node_modules/@jest/environment-jsdom-abstract/node_modules/ansi-styles": { + "version": "5.2.0", "dev": true, "license": "MIT", "engines": { - "node": ">=12" + "node": ">=10" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", + "node_modules/@jest/environment-jsdom-abstract/node_modules/jest-mock": { + "version": "30.0.5", "dev": true, "license": "MIT", "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" + "@jest/types": "30.0.5", + "@types/node": "*", + "jest-util": "30.0.5" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/environment-jsdom-abstract/node_modules/jest-util": { + "version": "30.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.0.5", + "@types/node": "*", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.2" }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/environment-jsdom-abstract/node_modules/picomatch": { + "version": "4.0.3", + "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", + "node_modules/@jest/environment-jsdom-abstract/node_modules/pretty-format": { + "version": "30.0.5", "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "@jest/schemas": "30.0.5", + "ansi-styles": "^5.2.0", + "react-is": "^18.3.1" }, "engines": { - "node": ">=12" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/environment/node_modules/@jest/schemas": { + "version": "30.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.34.0" }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", + "node_modules/@jest/environment/node_modules/@jest/types": { + "version": "30.2.0", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" + "@jest/pattern": "30.0.1", + "@jest/schemas": "30.0.5", + "@types/istanbul-lib-coverage": "^2.0.6", + "@types/istanbul-reports": "^3.0.4", + "@types/node": "*", + "@types/yargs": "^17.0.33", + "chalk": "^4.1.2" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", + "node_modules/@jest/environment/node_modules/@sinclair/typebox": { + "version": "0.34.41", "dev": true, - "license": "ISC", + "license": "MIT" + }, + "node_modules/@jest/expect": { + "version": "30.2.0", + "dev": true, + "license": "MIT", "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" + "expect": "30.2.0", + "jest-snapshot": "30.2.0" }, "engines": { - "node": ">=8" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { - "version": "1.0.10", + "node_modules/@jest/expect-utils": { + "version": "29.7.0", "dev": true, "license": "MIT", "dependencies": { - "sprintf-js": "~1.0.2" + "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { - "version": "4.1.0", + "node_modules/@jest/expect/node_modules/@jest/expect-utils": { + "version": "30.2.0", "dev": true, "license": "MIT", "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "@jest/get-type": "30.1.0" }, "engines": { - "node": ">=8" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { - "version": "3.14.1", + "node_modules/@jest/expect/node_modules/@jest/schemas": { + "version": "30.0.5", "dev": true, "license": "MIT", "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "@sinclair/typebox": "^0.34.0" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { - "version": "5.0.0", + "node_modules/@jest/expect/node_modules/@jest/types": { + "version": "30.2.0", "dev": true, "license": "MIT", "dependencies": { - "p-locate": "^4.1.0" + "@jest/pattern": "30.0.1", + "@jest/schemas": "30.0.5", + "@types/istanbul-lib-coverage": "^2.0.6", + "@types/istanbul-reports": "^3.0.4", + "@types/node": "*", + "@types/yargs": "^17.0.33", + "chalk": "^4.1.2" }, "engines": { - "node": ">=8" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { - "version": "2.3.0", + "node_modules/@jest/expect/node_modules/@sinclair/typebox": { + "version": "0.34.41", + "dev": true, + "license": "MIT" + }, + "node_modules/@jest/expect/node_modules/ansi-styles": { + "version": "5.2.0", "dev": true, "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, "engines": { - "node": ">=6" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { - "version": "4.1.0", + "node_modules/@jest/expect/node_modules/expect": { + "version": "30.2.0", "dev": true, "license": "MIT", "dependencies": { - "p-limit": "^2.2.0" + "@jest/expect-utils": "30.2.0", + "@jest/get-type": "30.1.0", + "jest-matcher-utils": "30.2.0", + "jest-message-util": "30.2.0", + "jest-mock": "30.2.0", + "jest-util": "30.2.0" }, "engines": { - "node": ">=8" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { - "version": "5.0.0", + "node_modules/@jest/expect/node_modules/jest-diff": { + "version": "30.2.0", "dev": true, "license": "MIT", + "dependencies": { + "@jest/diff-sequences": "30.0.1", + "@jest/get-type": "30.1.0", + "chalk": "^4.1.2", + "pretty-format": "30.2.0" + }, "engines": { - "node": ">=8" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", + "node_modules/@jest/expect/node_modules/jest-matcher-utils": { + "version": "30.2.0", "dev": true, "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0", + "chalk": "^4.1.2", + "jest-diff": "30.2.0", + "pretty-format": "30.2.0" + }, "engines": { - "node": ">=8" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@jest/console": { - "version": "29.7.0", + "node_modules/@jest/expect/node_modules/jest-message-util": { + "version": "30.2.0", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0" + "@babel/code-frame": "^7.27.1", + "@jest/types": "30.2.0", + "@types/stack-utils": "^2.0.3", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "micromatch": "^4.0.8", + "pretty-format": "30.2.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.6" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@jest/core": { + "node_modules/@jest/expect/node_modules/jest-util": { "version": "30.2.0", "dev": true, "license": "MIT", "dependencies": { - "@jest/console": "30.2.0", - "@jest/pattern": "30.0.1", - "@jest/reporters": "30.2.0", - "@jest/test-result": "30.2.0", - "@jest/transform": "30.2.0", "@jest/types": "30.2.0", "@types/node": "*", - "ansi-escapes": "^4.3.2", "chalk": "^4.1.2", "ci-info": "^4.2.0", - "exit-x": "^0.2.2", "graceful-fs": "^4.2.11", - "jest-changed-files": "30.2.0", - "jest-config": "30.2.0", - "jest-haste-map": "30.2.0", - "jest-message-util": "30.2.0", - "jest-regex-util": "30.0.1", - "jest-resolve": "30.2.0", - "jest-resolve-dependencies": "30.2.0", - "jest-runner": "30.2.0", - "jest-runtime": "30.2.0", - "jest-snapshot": "30.2.0", - "jest-util": "30.2.0", - "jest-validate": "30.2.0", - "jest-watcher": "30.2.0", - "micromatch": "^4.0.8", - "pretty-format": "30.2.0", - "slash": "^3.0.0" + "picomatch": "^4.0.2" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/expect/node_modules/picomatch": { + "version": "4.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/@jest/core/node_modules/@jest/console": { + "node_modules/@jest/expect/node_modules/pretty-format": { "version": "30.2.0", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.2.0", - "@types/node": "*", - "chalk": "^4.1.2", - "jest-message-util": "30.2.0", - "jest-util": "30.2.0", - "slash": "^3.0.0" + "@jest/schemas": "30.0.5", + "ansi-styles": "^5.2.0", + "react-is": "^18.3.1" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@jest/core/node_modules/@jest/schemas": { - "version": "30.0.5", + "node_modules/@jest/fake-timers": { + "version": "30.2.0", "dev": true, "license": "MIT", "dependencies": { - "@sinclair/typebox": "^0.34.0" + "@jest/types": "30.2.0", + "@sinonjs/fake-timers": "^13.0.0", + "@types/node": "*", + "jest-message-util": "30.2.0", + "jest-mock": "30.2.0", + "jest-util": "30.2.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@jest/core/node_modules/@jest/test-result": { - "version": "30.2.0", + "node_modules/@jest/fake-timers/node_modules/@jest/schemas": { + "version": "30.0.5", "dev": true, "license": "MIT", "dependencies": { - "@jest/console": "30.2.0", - "@jest/types": "30.2.0", - "@types/istanbul-lib-coverage": "^2.0.6", - "collect-v8-coverage": "^1.0.2" + "@sinclair/typebox": "^0.34.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@jest/core/node_modules/@jest/types": { + "node_modules/@jest/fake-timers/node_modules/@jest/types": { "version": "30.2.0", "dev": true, "license": "MIT", @@ -5876,12 +7470,12 @@ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@jest/core/node_modules/@sinclair/typebox": { + "node_modules/@jest/fake-timers/node_modules/@sinclair/typebox": { "version": "0.34.41", "dev": true, "license": "MIT" }, - "node_modules/@jest/core/node_modules/ansi-styles": { + "node_modules/@jest/fake-timers/node_modules/ansi-styles": { "version": "5.2.0", "dev": true, "license": "MIT", @@ -5892,7 +7486,7 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@jest/core/node_modules/jest-message-util": { + "node_modules/@jest/fake-timers/node_modules/jest-message-util": { "version": "30.2.0", "dev": true, "license": "MIT", @@ -5911,7 +7505,7 @@ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@jest/core/node_modules/jest-util": { + "node_modules/@jest/fake-timers/node_modules/jest-util": { "version": "30.2.0", "dev": true, "license": "MIT", @@ -5927,7 +7521,7 @@ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@jest/core/node_modules/picomatch": { + "node_modules/@jest/fake-timers/node_modules/picomatch": { "version": "4.0.3", "dev": true, "license": "MIT", @@ -5938,129 +7532,170 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/@jest/core/node_modules/pretty-format": { + "node_modules/@jest/fake-timers/node_modules/pretty-format": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "30.0.5", + "ansi-styles": "^5.2.0", + "react-is": "^18.3.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/get-type": { + "version": "30.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/globals": { "version": "30.2.0", "dev": true, "license": "MIT", "dependencies": { - "@jest/schemas": "30.0.5", - "ansi-styles": "^5.2.0", - "react-is": "^18.3.1" + "@jest/environment": "30.2.0", + "@jest/expect": "30.2.0", + "@jest/types": "30.2.0", + "jest-mock": "30.2.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@jest/diff-sequences": { - "version": "30.0.1", + "node_modules/@jest/globals/node_modules/@jest/schemas": { + "version": "30.0.5", "dev": true, "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.34.0" + }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@jest/environment": { + "node_modules/@jest/globals/node_modules/@jest/types": { "version": "30.2.0", "dev": true, "license": "MIT", "dependencies": { - "@jest/fake-timers": "30.2.0", - "@jest/types": "30.2.0", + "@jest/pattern": "30.0.1", + "@jest/schemas": "30.0.5", + "@types/istanbul-lib-coverage": "^2.0.6", + "@types/istanbul-reports": "^3.0.4", "@types/node": "*", - "jest-mock": "30.2.0" + "@types/yargs": "^17.0.33", + "chalk": "^4.1.2" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@jest/environment-jsdom-abstract": { - "version": "30.0.5", + "node_modules/@jest/globals/node_modules/@sinclair/typebox": { + "version": "0.34.41", + "dev": true, + "license": "MIT" + }, + "node_modules/@jest/pattern": { + "version": "30.0.1", "dev": true, "license": "MIT", "dependencies": { - "@jest/environment": "30.0.5", - "@jest/fake-timers": "30.0.5", - "@jest/types": "30.0.5", - "@types/jsdom": "^21.1.7", "@types/node": "*", - "jest-mock": "30.0.5", - "jest-util": "30.0.5" + "jest-regex-util": "30.0.1" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "peerDependencies": { - "canvas": "^3.0.0", - "jsdom": "*" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } } }, - "node_modules/@jest/environment-jsdom-abstract/node_modules/@jest/environment": { - "version": "30.0.5", + "node_modules/@jest/reporters": { + "version": "30.2.0", "dev": true, "license": "MIT", "dependencies": { - "@jest/fake-timers": "30.0.5", - "@jest/types": "30.0.5", + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "30.2.0", + "@jest/test-result": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", + "@jridgewell/trace-mapping": "^0.3.25", "@types/node": "*", - "jest-mock": "30.0.5" + "chalk": "^4.1.2", + "collect-v8-coverage": "^1.0.2", + "exit-x": "^0.2.2", + "glob": "^10.3.10", + "graceful-fs": "^4.2.11", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^5.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "30.2.0", + "jest-util": "30.2.0", + "jest-worker": "30.2.0", + "slash": "^3.0.0", + "string-length": "^4.0.2", + "v8-to-istanbul": "^9.0.1" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "node_modules/@jest/environment-jsdom-abstract/node_modules/@jest/fake-timers": { - "version": "30.0.5", + "node_modules/@jest/reporters/node_modules/@jest/console": { + "version": "30.2.0", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.0.5", - "@sinonjs/fake-timers": "^13.0.0", + "@jest/types": "30.2.0", "@types/node": "*", - "jest-message-util": "30.0.5", - "jest-mock": "30.0.5", - "jest-util": "30.0.5" + "chalk": "^4.1.2", + "jest-message-util": "30.2.0", + "jest-util": "30.2.0", + "slash": "^3.0.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@jest/environment-jsdom-abstract/node_modules/@jest/fake-timers/node_modules/jest-message-util": { + "node_modules/@jest/reporters/node_modules/@jest/schemas": { "version": "30.0.5", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.27.1", - "@jest/types": "30.0.5", - "@types/stack-utils": "^2.0.3", - "chalk": "^4.1.2", - "graceful-fs": "^4.2.11", - "micromatch": "^4.0.8", - "pretty-format": "30.0.5", - "slash": "^3.0.0", - "stack-utils": "^2.0.6" + "@sinclair/typebox": "^0.34.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@jest/environment-jsdom-abstract/node_modules/@jest/schemas": { - "version": "30.0.5", + "node_modules/@jest/reporters/node_modules/@jest/test-result": { + "version": "30.2.0", "dev": true, "license": "MIT", "dependencies": { - "@sinclair/typebox": "^0.34.0" + "@jest/console": "30.2.0", + "@jest/types": "30.2.0", + "@types/istanbul-lib-coverage": "^2.0.6", + "collect-v8-coverage": "^1.0.2" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@jest/environment-jsdom-abstract/node_modules/@jest/types": { - "version": "30.0.5", + "node_modules/@jest/reporters/node_modules/@jest/types": { + "version": "30.2.0", "dev": true, "license": "MIT", "dependencies": { @@ -6076,12 +7711,12 @@ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@jest/environment-jsdom-abstract/node_modules/@sinclair/typebox": { - "version": "0.34.38", + "node_modules/@jest/reporters/node_modules/@sinclair/typebox": { + "version": "0.34.41", "dev": true, "license": "MIT" }, - "node_modules/@jest/environment-jsdom-abstract/node_modules/ansi-styles": { + "node_modules/@jest/reporters/node_modules/ansi-styles": { "version": "5.2.0", "dev": true, "license": "MIT", @@ -6092,25 +7727,64 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@jest/environment-jsdom-abstract/node_modules/jest-mock": { - "version": "30.0.5", + "node_modules/@jest/reporters/node_modules/glob": { + "version": "10.4.5", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@jest/reporters/node_modules/jackspeak": { + "version": "3.4.3", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/@jest/reporters/node_modules/jest-message-util": { + "version": "30.2.0", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.0.5", - "@types/node": "*", - "jest-util": "30.0.5" + "@babel/code-frame": "^7.27.1", + "@jest/types": "30.2.0", + "@types/stack-utils": "^2.0.3", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "micromatch": "^4.0.8", + "pretty-format": "30.2.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.6" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@jest/environment-jsdom-abstract/node_modules/jest-util": { - "version": "30.0.5", + "node_modules/@jest/reporters/node_modules/jest-util": { + "version": "30.2.0", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.0.5", + "@jest/types": "30.2.0", "@types/node": "*", "chalk": "^4.1.2", "ci-info": "^4.2.0", @@ -6121,98 +7795,90 @@ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@jest/environment-jsdom-abstract/node_modules/picomatch": { - "version": "4.0.3", + "node_modules/@jest/reporters/node_modules/lru-cache": { + "version": "10.4.3", "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } + "license": "ISC" }, - "node_modules/@jest/environment-jsdom-abstract/node_modules/pretty-format": { - "version": "30.0.5", + "node_modules/@jest/reporters/node_modules/minimatch": { + "version": "9.0.5", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "@jest/schemas": "30.0.5", - "ansi-styles": "^5.2.0", - "react-is": "^18.3.1" + "brace-expansion": "^2.0.1" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@jest/environment/node_modules/@jest/schemas": { - "version": "30.0.5", + "node_modules/@jest/reporters/node_modules/path-scurry": { + "version": "1.11.1", "dev": true, - "license": "MIT", + "license": "BlueOak-1.0.0", "dependencies": { - "@sinclair/typebox": "^0.34.0" + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@jest/environment/node_modules/@jest/types": { - "version": "30.2.0", + "node_modules/@jest/reporters/node_modules/picomatch": { + "version": "4.0.3", "dev": true, "license": "MIT", - "dependencies": { - "@jest/pattern": "30.0.1", - "@jest/schemas": "30.0.5", - "@types/istanbul-lib-coverage": "^2.0.6", - "@types/istanbul-reports": "^3.0.4", - "@types/node": "*", - "@types/yargs": "^17.0.33", - "chalk": "^4.1.2" - }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/@jest/environment/node_modules/@sinclair/typebox": { - "version": "0.34.41", - "dev": true, - "license": "MIT" - }, - "node_modules/@jest/expect": { + "node_modules/@jest/reporters/node_modules/pretty-format": { "version": "30.2.0", "dev": true, "license": "MIT", "dependencies": { - "expect": "30.2.0", - "jest-snapshot": "30.2.0" + "@jest/schemas": "30.0.5", + "ansi-styles": "^5.2.0", + "react-is": "^18.3.1" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@jest/expect-utils": { - "version": "29.7.0", + "node_modules/@jest/schemas": { + "version": "29.6.3", "dev": true, "license": "MIT", "dependencies": { - "jest-get-type": "^29.6.3" + "@sinclair/typebox": "^0.27.8" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/expect/node_modules/@jest/expect-utils": { + "node_modules/@jest/snapshot-utils": { "version": "30.2.0", "dev": true, "license": "MIT", "dependencies": { - "@jest/get-type": "30.1.0" + "@jest/types": "30.2.0", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "natural-compare": "^1.4.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@jest/expect/node_modules/@jest/schemas": { + "node_modules/@jest/snapshot-utils/node_modules/@jest/schemas": { "version": "30.0.5", "dev": true, "license": "MIT", @@ -6223,7 +7889,7 @@ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@jest/expect/node_modules/@jest/types": { + "node_modules/@jest/snapshot-utils/node_modules/@jest/types": { "version": "30.2.0", "dev": true, "license": "MIT", @@ -6240,86 +7906,53 @@ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@jest/expect/node_modules/@sinclair/typebox": { + "node_modules/@jest/snapshot-utils/node_modules/@sinclair/typebox": { "version": "0.34.41", "dev": true, "license": "MIT" }, - "node_modules/@jest/expect/node_modules/ansi-styles": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/expect/node_modules/expect": { - "version": "30.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/expect-utils": "30.2.0", - "@jest/get-type": "30.1.0", - "jest-matcher-utils": "30.2.0", - "jest-message-util": "30.2.0", - "jest-mock": "30.2.0", - "jest-util": "30.2.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/expect/node_modules/jest-diff": { - "version": "30.2.0", + "node_modules/@jest/source-map": { + "version": "30.0.1", "dev": true, "license": "MIT", "dependencies": { - "@jest/diff-sequences": "30.0.1", - "@jest/get-type": "30.1.0", - "chalk": "^4.1.2", - "pretty-format": "30.2.0" + "@jridgewell/trace-mapping": "^0.3.25", + "callsites": "^3.1.0", + "graceful-fs": "^4.2.11" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@jest/expect/node_modules/jest-matcher-utils": { - "version": "30.2.0", + "node_modules/@jest/test-result": { + "version": "29.7.0", "dev": true, "license": "MIT", "dependencies": { - "@jest/get-type": "30.1.0", - "chalk": "^4.1.2", - "jest-diff": "30.2.0", - "pretty-format": "30.2.0" + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/expect/node_modules/jest-message-util": { + "node_modules/@jest/test-sequencer": { "version": "30.2.0", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.27.1", - "@jest/types": "30.2.0", - "@types/stack-utils": "^2.0.3", - "chalk": "^4.1.2", + "@jest/test-result": "30.2.0", "graceful-fs": "^4.2.11", - "micromatch": "^4.0.8", - "pretty-format": "30.2.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.6" + "jest-haste-map": "30.2.0", + "slash": "^3.0.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@jest/expect/node_modules/jest-util": { + "node_modules/@jest/test-sequencer/node_modules/@jest/console": { "version": "30.2.0", "dev": true, "license": "MIT", @@ -6327,66 +7960,40 @@ "@jest/types": "30.2.0", "@types/node": "*", "chalk": "^4.1.2", - "ci-info": "^4.2.0", - "graceful-fs": "^4.2.11", - "picomatch": "^4.0.2" + "jest-message-util": "30.2.0", + "jest-util": "30.2.0", + "slash": "^3.0.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@jest/expect/node_modules/picomatch": { - "version": "4.0.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/@jest/expect/node_modules/pretty-format": { - "version": "30.2.0", + "node_modules/@jest/test-sequencer/node_modules/@jest/schemas": { + "version": "30.0.5", "dev": true, "license": "MIT", "dependencies": { - "@jest/schemas": "30.0.5", - "ansi-styles": "^5.2.0", - "react-is": "^18.3.1" + "@sinclair/typebox": "^0.34.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@jest/fake-timers": { + "node_modules/@jest/test-sequencer/node_modules/@jest/test-result": { "version": "30.2.0", "dev": true, "license": "MIT", "dependencies": { + "@jest/console": "30.2.0", "@jest/types": "30.2.0", - "@sinonjs/fake-timers": "^13.0.0", - "@types/node": "*", - "jest-message-util": "30.2.0", - "jest-mock": "30.2.0", - "jest-util": "30.2.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/fake-timers/node_modules/@jest/schemas": { - "version": "30.0.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@sinclair/typebox": "^0.34.0" + "@types/istanbul-lib-coverage": "^2.0.6", + "collect-v8-coverage": "^1.0.2" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@jest/fake-timers/node_modules/@jest/types": { + "node_modules/@jest/test-sequencer/node_modules/@jest/types": { "version": "30.2.0", "dev": true, "license": "MIT", @@ -6403,12 +8010,12 @@ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@jest/fake-timers/node_modules/@sinclair/typebox": { + "node_modules/@jest/test-sequencer/node_modules/@sinclair/typebox": { "version": "0.34.41", "dev": true, "license": "MIT" }, - "node_modules/@jest/fake-timers/node_modules/ansi-styles": { + "node_modules/@jest/test-sequencer/node_modules/ansi-styles": { "version": "5.2.0", "dev": true, "license": "MIT", @@ -6419,7 +8026,7 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@jest/fake-timers/node_modules/jest-message-util": { + "node_modules/@jest/test-sequencer/node_modules/jest-message-util": { "version": "30.2.0", "dev": true, "license": "MIT", @@ -6438,7 +8045,7 @@ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@jest/fake-timers/node_modules/jest-util": { + "node_modules/@jest/test-sequencer/node_modules/jest-util": { "version": "30.2.0", "dev": true, "license": "MIT", @@ -6454,7 +8061,7 @@ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@jest/fake-timers/node_modules/picomatch": { + "node_modules/@jest/test-sequencer/node_modules/picomatch": { "version": "4.0.3", "dev": true, "license": "MIT", @@ -6465,7 +8072,7 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/@jest/fake-timers/node_modules/pretty-format": { + "node_modules/@jest/test-sequencer/node_modules/pretty-format": { "version": "30.2.0", "dev": true, "license": "MIT", @@ -6478,131 +8085,32 @@ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@jest/get-type": { - "version": "30.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/globals": { - "version": "30.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "30.2.0", - "@jest/expect": "30.2.0", - "@jest/types": "30.2.0", - "jest-mock": "30.2.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/globals/node_modules/@jest/schemas": { - "version": "30.0.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@sinclair/typebox": "^0.34.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/globals/node_modules/@jest/types": { - "version": "30.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/pattern": "30.0.1", - "@jest/schemas": "30.0.5", - "@types/istanbul-lib-coverage": "^2.0.6", - "@types/istanbul-reports": "^3.0.4", - "@types/node": "*", - "@types/yargs": "^17.0.33", - "chalk": "^4.1.2" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/globals/node_modules/@sinclair/typebox": { - "version": "0.34.41", - "dev": true, - "license": "MIT" - }, - "node_modules/@jest/pattern": { - "version": "30.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "jest-regex-util": "30.0.1" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/reporters": { - "version": "30.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "30.2.0", - "@jest/test-result": "30.2.0", - "@jest/transform": "30.2.0", - "@jest/types": "30.2.0", - "@jridgewell/trace-mapping": "^0.3.25", - "@types/node": "*", - "chalk": "^4.1.2", - "collect-v8-coverage": "^1.0.2", - "exit-x": "^0.2.2", - "glob": "^10.3.10", - "graceful-fs": "^4.2.11", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^6.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^5.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "30.2.0", - "jest-util": "30.2.0", - "jest-worker": "30.2.0", - "slash": "^3.0.0", - "string-length": "^4.0.2", - "v8-to-istanbul": "^9.0.1" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/reporters/node_modules/@jest/console": { + "node_modules/@jest/transform": { "version": "30.2.0", "dev": true, "license": "MIT", "dependencies": { + "@babel/core": "^7.27.4", "@jest/types": "30.2.0", - "@types/node": "*", + "@jridgewell/trace-mapping": "^0.3.25", + "babel-plugin-istanbul": "^7.0.1", "chalk": "^4.1.2", - "jest-message-util": "30.2.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.2.0", + "jest-regex-util": "30.0.1", "jest-util": "30.2.0", - "slash": "^3.0.0" + "micromatch": "^4.0.8", + "pirates": "^4.0.7", + "slash": "^3.0.0", + "write-file-atomic": "^5.0.1" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@jest/reporters/node_modules/@jest/schemas": { + "node_modules/@jest/transform/node_modules/@jest/schemas": { "version": "30.0.5", "dev": true, "license": "MIT", @@ -6613,21 +8121,7 @@ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@jest/reporters/node_modules/@jest/test-result": { - "version": "30.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/console": "30.2.0", - "@jest/types": "30.2.0", - "@types/istanbul-lib-coverage": "^2.0.6", - "collect-v8-coverage": "^1.0.2" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/reporters/node_modules/@jest/types": { + "node_modules/@jest/transform/node_modules/@jest/types": { "version": "30.2.0", "dev": true, "license": "MIT", @@ -6644,1460 +8138,1511 @@ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@jest/reporters/node_modules/@sinclair/typebox": { + "node_modules/@jest/transform/node_modules/@sinclair/typebox": { "version": "0.34.41", "dev": true, "license": "MIT" }, - "node_modules/@jest/reporters/node_modules/ansi-styles": { - "version": "5.2.0", + "node_modules/@jest/transform/node_modules/jest-util": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/transform/node_modules/picomatch": { + "version": "4.0.3", "dev": true, "license": "MIT", "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/@jest/reporters/node_modules/glob": { - "version": "10.4.5", + "node_modules/@jest/types": { + "version": "29.6.3", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/reporters/node_modules/jackspeak": { - "version": "3.4.3", + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", "dev": true, - "license": "BlueOak-1.0.0", + "license": "MIT", "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.30", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@js-sdsl/ordered-map": { + "version": "4.4.2", + "dev": true, + "license": "MIT", "funding": { - "url": "https://github.com/sponsors/isaacs" + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" + } + }, + "node_modules/@jsdevtools/ono": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", + "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==", + "license": "MIT" + }, + "node_modules/@jsep-plugin/assignment": { + "version": "1.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.16.0" }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" + "peerDependencies": { + "jsep": "^0.4.0||^1.0.0" } }, - "node_modules/@jest/reporters/node_modules/jest-message-util": { - "version": "30.2.0", + "node_modules/@jsep-plugin/regex": { + "version": "1.0.4", "dev": true, "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@jest/types": "30.2.0", - "@types/stack-utils": "^2.0.3", - "chalk": "^4.1.2", - "graceful-fs": "^4.2.11", - "micromatch": "^4.0.8", - "pretty-format": "30.2.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.6" + "engines": { + "node": ">= 10.16.0" + }, + "peerDependencies": { + "jsep": "^0.4.0||^1.0.0" + } + }, + "node_modules/@jsep-plugin/ternary": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@jsep-plugin/ternary/-/ternary-1.1.4.tgz", + "integrity": "sha512-ck5wiqIbqdMX6WRQztBL7ASDty9YLgJ3sSAK5ZpBzXeySvFGCzIvM6UiAI4hTZ22fEcYQVV/zhUbNscggW+Ukg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.16.0" }, + "peerDependencies": { + "jsep": "^0.4.0||^1.0.0" + } + }, + "node_modules/@lukeed/csprng": { + "version": "1.1.0", + "dev": true, + "license": "MIT", "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=8" } }, - "node_modules/@jest/reporters/node_modules/jest-util": { - "version": "30.2.0", + "node_modules/@nestjs/axios": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@nestjs/common": "^10.0.0 || ^11.0.0", + "axios": "^1.3.1", + "rxjs": "^7.0.0" + } + }, + "node_modules/@nestjs/common": { + "version": "11.1.6", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.2.0", - "@types/node": "*", - "chalk": "^4.1.2", - "ci-info": "^4.2.0", - "graceful-fs": "^4.2.11", - "picomatch": "^4.0.2" + "file-type": "21.0.0", + "iterare": "1.2.1", + "load-esm": "1.0.2", + "tslib": "2.8.1", + "uid": "2.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nest" + }, + "peerDependencies": { + "class-transformer": ">=0.4.1", + "class-validator": ">=0.13.2", + "reflect-metadata": "^0.1.12 || ^0.2.0", + "rxjs": "^7.1.0" + }, + "peerDependenciesMeta": { + "class-transformer": { + "optional": true + }, + "class-validator": { + "optional": true + } + } + }, + "node_modules/@nestjs/core": { + "version": "11.1.6", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@nuxt/opencollective": "0.4.1", + "fast-safe-stringify": "2.1.1", + "iterare": "1.2.1", + "path-to-regexp": "8.2.0", + "tslib": "2.8.1", + "uid": "2.0.2" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">= 20" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nest" + }, + "peerDependencies": { + "@nestjs/common": "^11.0.0", + "@nestjs/microservices": "^11.0.0", + "@nestjs/platform-express": "^11.0.0", + "@nestjs/websockets": "^11.0.0", + "reflect-metadata": "^0.1.12 || ^0.2.0", + "rxjs": "^7.1.0" + }, + "peerDependenciesMeta": { + "@nestjs/microservices": { + "optional": true + }, + "@nestjs/platform-express": { + "optional": true + }, + "@nestjs/websockets": { + "optional": true + } } }, - "node_modules/@jest/reporters/node_modules/lru-cache": { - "version": "10.4.3", - "dev": true, - "license": "ISC" - }, - "node_modules/@jest/reporters/node_modules/minimatch": { - "version": "9.0.5", + "node_modules/@next/eslint-plugin-next": { + "version": "15.4.6", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "fast-glob": "3.3.1" } }, - "node_modules/@jest/reporters/node_modules/path-scurry": { - "version": "1.11.1", + "node_modules/@next/eslint-plugin-next/node_modules/fast-glob": { + "version": "3.3.1", "dev": true, - "license": "BlueOak-1.0.0", + "license": "MIT", "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" }, "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=8.6.0" } }, - "node_modules/@jest/reporters/node_modules/picomatch": { - "version": "4.0.3", + "node_modules/@nhsdigital/nhs-notify-event-schemas-supplier-api": { + "resolved": "internal/events", + "link": true + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", "dev": true, "license": "MIT", - "engines": { - "node": ">=12" + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "engines": { + "node": ">= 8" } }, - "node_modules/@jest/reporters/node_modules/pretty-format": { - "version": "30.2.0", + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", "dev": true, "license": "MIT", - "dependencies": { - "@jest/schemas": "30.0.5", - "ansi-styles": "^5.2.0", - "react-is": "^18.3.1" - }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">= 8" } }, - "node_modules/@jest/schemas": { - "version": "29.6.3", + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", "dev": true, "license": "MIT", "dependencies": { - "@sinclair/typebox": "^0.27.8" + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">= 8" } }, - "node_modules/@jest/snapshot-utils": { - "version": "30.2.0", + "node_modules/@nolyfill/is-core-module": { + "version": "1.0.39", "dev": true, "license": "MIT", - "dependencies": { - "@jest/types": "30.2.0", - "chalk": "^4.1.2", - "graceful-fs": "^4.2.11", - "natural-compare": "^1.4.0" - }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=12.4.0" } }, - "node_modules/@jest/snapshot-utils/node_modules/@jest/schemas": { - "version": "30.0.5", + "node_modules/@nuxt/opencollective": { + "version": "0.4.1", "dev": true, "license": "MIT", "dependencies": { - "@sinclair/typebox": "^0.34.0" + "consola": "^3.2.3" + }, + "bin": { + "opencollective": "bin/opencollective.js" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": "^14.18.0 || >=16.10.0", + "npm": ">=5.10.0" } }, - "node_modules/@jest/snapshot-utils/node_modules/@jest/types": { - "version": "30.2.0", + "node_modules/@nuxtjs/opencollective": { + "version": "0.3.2", "dev": true, "license": "MIT", "dependencies": { - "@jest/pattern": "30.0.1", - "@jest/schemas": "30.0.5", - "@types/istanbul-lib-coverage": "^2.0.6", - "@types/istanbul-reports": "^3.0.4", - "@types/node": "*", - "@types/yargs": "^17.0.33", - "chalk": "^4.1.2" + "chalk": "^4.1.0", + "consola": "^2.15.0", + "node-fetch": "^2.6.1" + }, + "bin": { + "opencollective": "bin/opencollective.js" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=8.0.0", + "npm": ">=5.0.0" } }, - "node_modules/@jest/snapshot-utils/node_modules/@sinclair/typebox": { - "version": "0.34.41", + "node_modules/@nuxtjs/opencollective/node_modules/consola": { + "version": "2.15.3", "dev": true, "license": "MIT" }, - "node_modules/@jest/source-map": { - "version": "30.0.1", + "node_modules/@openapitools/openapi-generator-cli": { + "version": "2.23.4", "dev": true, - "license": "MIT", + "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.25", - "callsites": "^3.1.0", - "graceful-fs": "^4.2.11" + "@nestjs/axios": "4.0.1", + "@nestjs/common": "11.1.6", + "@nestjs/core": "11.1.6", + "@nuxtjs/opencollective": "0.3.2", + "axios": "1.12.2", + "chalk": "4.1.2", + "commander": "8.3.0", + "compare-versions": "6.1.1", + "concurrently": "9.2.1", + "console.table": "0.10.0", + "fs-extra": "11.3.2", + "glob": "11.0.3", + "inquirer": "8.2.7", + "proxy-agent": "6.5.0", + "reflect-metadata": "0.2.2", + "rxjs": "7.8.2", + "tslib": "2.8.1" + }, + "bin": { + "openapi-generator-cli": "main.js" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/openapi_generator" } }, - "node_modules/@jest/test-result": { - "version": "29.7.0", + "node_modules/@opentelemetry/api": { + "version": "1.9.0", "dev": true, - "license": "MIT", - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, + "license": "Apache-2.0", "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=8.0.0" } }, - "node_modules/@jest/test-sequencer": { - "version": "30.2.0", + "node_modules/@opentelemetry/api-logs": { + "version": "0.53.0", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "@jest/test-result": "30.2.0", - "graceful-fs": "^4.2.11", - "jest-haste-map": "30.2.0", - "slash": "^3.0.0" + "@opentelemetry/api": "^1.0.0" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=14" } }, - "node_modules/@jest/test-sequencer/node_modules/@jest/console": { - "version": "30.2.0", + "node_modules/@opentelemetry/context-async-hooks": { + "version": "1.26.0", "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "30.2.0", - "@types/node": "*", - "chalk": "^4.1.2", - "jest-message-util": "30.2.0", - "jest-util": "30.2.0", - "slash": "^3.0.0" - }, + "license": "Apache-2.0", "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@jest/test-sequencer/node_modules/@jest/schemas": { - "version": "30.0.5", + "node_modules/@opentelemetry/core": { + "version": "1.26.0", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "@sinclair/typebox": "^0.34.0" + "@opentelemetry/semantic-conventions": "1.27.0" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@jest/test-sequencer/node_modules/@jest/test-result": { - "version": "30.2.0", + "node_modules/@opentelemetry/exporter-trace-otlp-http": { + "version": "0.53.0", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "@jest/console": "30.2.0", - "@jest/types": "30.2.0", - "@types/istanbul-lib-coverage": "^2.0.6", - "collect-v8-coverage": "^1.0.2" + "@opentelemetry/core": "1.26.0", + "@opentelemetry/otlp-exporter-base": "0.53.0", + "@opentelemetry/otlp-transformer": "0.53.0", + "@opentelemetry/resources": "1.26.0", + "@opentelemetry/sdk-trace-base": "1.26.0" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" } }, - "node_modules/@jest/test-sequencer/node_modules/@jest/types": { - "version": "30.2.0", + "node_modules/@opentelemetry/otlp-exporter-base": { + "version": "0.53.0", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "@jest/pattern": "30.0.1", - "@jest/schemas": "30.0.5", - "@types/istanbul-lib-coverage": "^2.0.6", - "@types/istanbul-reports": "^3.0.4", - "@types/node": "*", - "@types/yargs": "^17.0.33", - "chalk": "^4.1.2" + "@opentelemetry/core": "1.26.0", + "@opentelemetry/otlp-transformer": "0.53.0" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" } }, - "node_modules/@jest/test-sequencer/node_modules/@sinclair/typebox": { - "version": "0.34.41", - "dev": true, - "license": "MIT" - }, - "node_modules/@jest/test-sequencer/node_modules/ansi-styles": { - "version": "5.2.0", + "node_modules/@opentelemetry/otlp-transformer": { + "version": "0.53.0", "dev": true, - "license": "MIT", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.53.0", + "@opentelemetry/core": "1.26.0", + "@opentelemetry/resources": "1.26.0", + "@opentelemetry/sdk-logs": "0.53.0", + "@opentelemetry/sdk-metrics": "1.26.0", + "@opentelemetry/sdk-trace-base": "1.26.0", + "protobufjs": "^7.3.0" + }, "engines": { - "node": ">=10" + "node": ">=14" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@jest/test-sequencer/node_modules/jest-message-util": { - "version": "30.2.0", + "node_modules/@opentelemetry/propagator-b3": { + "version": "1.26.0", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "@babel/code-frame": "^7.27.1", - "@jest/types": "30.2.0", - "@types/stack-utils": "^2.0.3", - "chalk": "^4.1.2", - "graceful-fs": "^4.2.11", - "micromatch": "^4.0.8", - "pretty-format": "30.2.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.6" + "@opentelemetry/core": "1.26.0" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@jest/test-sequencer/node_modules/jest-util": { - "version": "30.2.0", + "node_modules/@opentelemetry/propagator-jaeger": { + "version": "1.26.0", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "@jest/types": "30.2.0", - "@types/node": "*", - "chalk": "^4.1.2", - "ci-info": "^4.2.0", - "graceful-fs": "^4.2.11", - "picomatch": "^4.0.2" + "@opentelemetry/core": "1.26.0" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@jest/test-sequencer/node_modules/picomatch": { - "version": "4.0.3", + "node_modules/@opentelemetry/resources": { + "version": "1.26.0", "dev": true, - "license": "MIT", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.26.0", + "@opentelemetry/semantic-conventions": "1.27.0" + }, "engines": { - "node": ">=12" + "node": ">=14" }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@jest/test-sequencer/node_modules/pretty-format": { - "version": "30.2.0", + "node_modules/@opentelemetry/sdk-logs": { + "version": "0.53.0", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "@jest/schemas": "30.0.5", - "ansi-styles": "^5.2.0", - "react-is": "^18.3.1" + "@opentelemetry/api-logs": "0.53.0", + "@opentelemetry/core": "1.26.0", + "@opentelemetry/resources": "1.26.0" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.4.0 <1.10.0" } }, - "node_modules/@jest/transform": { - "version": "30.2.0", + "node_modules/@opentelemetry/sdk-metrics": { + "version": "1.26.0", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "@babel/core": "^7.27.4", - "@jest/types": "30.2.0", - "@jridgewell/trace-mapping": "^0.3.25", - "babel-plugin-istanbul": "^7.0.1", - "chalk": "^4.1.2", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.11", - "jest-haste-map": "30.2.0", - "jest-regex-util": "30.0.1", - "jest-util": "30.2.0", - "micromatch": "^4.0.8", - "pirates": "^4.0.7", - "slash": "^3.0.0", - "write-file-atomic": "^5.0.1" + "@opentelemetry/core": "1.26.0", + "@opentelemetry/resources": "1.26.0" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, - "node_modules/@jest/transform/node_modules/@jest/schemas": { - "version": "30.0.5", + "node_modules/@opentelemetry/sdk-trace-base": { + "version": "1.26.0", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "@sinclair/typebox": "^0.34.0" + "@opentelemetry/core": "1.26.0", + "@opentelemetry/resources": "1.26.0", + "@opentelemetry/semantic-conventions": "1.27.0" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@jest/transform/node_modules/@jest/types": { - "version": "30.2.0", + "node_modules/@opentelemetry/sdk-trace-node": { + "version": "1.26.0", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "@jest/pattern": "30.0.1", - "@jest/schemas": "30.0.5", - "@types/istanbul-lib-coverage": "^2.0.6", - "@types/istanbul-reports": "^3.0.4", - "@types/node": "*", - "@types/yargs": "^17.0.33", - "chalk": "^4.1.2" + "@opentelemetry/context-async-hooks": "1.26.0", + "@opentelemetry/core": "1.26.0", + "@opentelemetry/propagator-b3": "1.26.0", + "@opentelemetry/propagator-jaeger": "1.26.0", + "@opentelemetry/sdk-trace-base": "1.26.0", + "semver": "^7.5.2" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@jest/transform/node_modules/@sinclair/typebox": { - "version": "0.34.41", + "node_modules/@opentelemetry/semantic-conventions": { + "version": "1.27.0", "dev": true, - "license": "MIT" + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } }, - "node_modules/@jest/transform/node_modules/jest-util": { - "version": "30.2.0", + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", "dev": true, "license": "MIT", - "dependencies": { - "@jest/types": "30.2.0", - "@types/node": "*", - "chalk": "^4.1.2", - "ci-info": "^4.2.0", - "graceful-fs": "^4.2.11", - "picomatch": "^4.0.2" - }, + "optional": true, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=14" } }, - "node_modules/@jest/transform/node_modules/picomatch": { - "version": "4.0.3", + "node_modules/@pkgr/core": { + "version": "0.2.9", "dev": true, "license": "MIT", "engines": { - "node": ">=12" + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "url": "https://opencollective.com/pkgr" } }, - "node_modules/@jest/types": { - "version": "29.6.3", - "dev": true, - "license": "MIT", + "node_modules/@playwright/test": { + "version": "1.55.1", + "license": "Apache-2.0", "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" + "playwright": "1.55.1" + }, + "bin": { + "playwright": "cli.js" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=18" } }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } + "license": "BSD-3-Clause" }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", + "node_modules/@protobufjs/base64": { + "version": "1.1.2", "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" } }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", "dev": true, - "license": "MIT" + "license": "BSD-3-Clause" }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.30", + "node_modules/@protobufjs/path": { + "version": "1.1.2", "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } + "license": "BSD-3-Clause" }, - "node_modules/@js-sdsl/ordered-map": { - "version": "4.4.2", + "node_modules/@protobufjs/pool": { + "version": "1.1.0", "dev": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/js-sdsl" - } + "license": "BSD-3-Clause" }, - "node_modules/@jsep-plugin/assignment": { - "version": "1.3.0", + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.16.0" - }, - "peerDependencies": { - "jsep": "^0.4.0||^1.0.0" - } + "license": "BSD-3-Clause" }, - "node_modules/@jsep-plugin/regex": { - "version": "1.0.4", + "node_modules/@redocly/ajv": { + "version": "8.11.3", "dev": true, "license": "MIT", - "engines": { - "node": ">= 10.16.0" + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js-replace": "^1.0.1" }, - "peerDependencies": { - "jsep": "^0.4.0||^1.0.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@lukeed/csprng": { - "version": "1.1.0", + "node_modules/@redocly/cli": { + "version": "1.34.5", "dev": true, "license": "MIT", + "dependencies": { + "@opentelemetry/api": "1.9.0", + "@opentelemetry/exporter-trace-otlp-http": "0.53.0", + "@opentelemetry/resources": "1.26.0", + "@opentelemetry/sdk-trace-node": "1.26.0", + "@opentelemetry/semantic-conventions": "1.27.0", + "@redocly/config": "^0.22.0", + "@redocly/openapi-core": "1.34.5", + "@redocly/respect-core": "1.34.5", + "abort-controller": "^3.0.0", + "chokidar": "^3.5.1", + "colorette": "^1.2.0", + "core-js": "^3.32.1", + "dotenv": "16.4.7", + "form-data": "^4.0.4", + "get-port-please": "^3.0.1", + "glob": "^7.1.6", + "handlebars": "^4.7.6", + "mobx": "^6.0.4", + "pluralize": "^8.0.0", + "react": "^17.0.0 || ^18.2.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.2.0 || ^19.0.0", + "redoc": "2.5.0", + "semver": "^7.5.2", + "simple-websocket": "^9.0.0", + "styled-components": "^6.0.7", + "yargs": "17.0.1" + }, + "bin": { + "openapi": "bin/cli.js", + "redocly": "bin/cli.js" + }, "engines": { - "node": ">=8" + "node": ">=18.17.0", + "npm": ">=9.5.0" } }, - "node_modules/@nestjs/axios": { - "version": "4.0.1", + "node_modules/@redocly/cli/node_modules/brace-expansion": { + "version": "1.1.12", "dev": true, "license": "MIT", - "peerDependencies": { - "@nestjs/common": "^10.0.0 || ^11.0.0", - "axios": "^1.3.1", - "rxjs": "^7.0.0" + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/@nestjs/common": { - "version": "11.1.6", + "node_modules/@redocly/cli/node_modules/glob": { + "version": "7.2.3", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "file-type": "21.0.0", - "iterare": "1.2.1", - "load-esm": "1.0.2", - "tslib": "2.8.1", - "uid": "2.0.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/nest" + "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" }, - "peerDependencies": { - "class-transformer": ">=0.4.1", - "class-validator": ">=0.13.2", - "reflect-metadata": "^0.1.12 || ^0.2.0", - "rxjs": "^7.1.0" + "engines": { + "node": "*" }, - "peerDependenciesMeta": { - "class-transformer": { - "optional": true - }, - "class-validator": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@nestjs/core": { - "version": "11.1.6", + "node_modules/@redocly/cli/node_modules/minimatch": { + "version": "3.1.2", "dev": true, - "hasInstallScript": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "@nuxt/opencollective": "0.4.1", - "fast-safe-stringify": "2.1.1", - "iterare": "1.2.1", - "path-to-regexp": "8.2.0", - "tslib": "2.8.1", - "uid": "2.0.2" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">= 20" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/nest" - }, - "peerDependencies": { - "@nestjs/common": "^11.0.0", - "@nestjs/microservices": "^11.0.0", - "@nestjs/platform-express": "^11.0.0", - "@nestjs/websockets": "^11.0.0", - "reflect-metadata": "^0.1.12 || ^0.2.0", - "rxjs": "^7.1.0" - }, - "peerDependenciesMeta": { - "@nestjs/microservices": { - "optional": true - }, - "@nestjs/platform-express": { - "optional": true - }, - "@nestjs/websockets": { - "optional": true - } + "node": "*" } }, - "node_modules/@next/eslint-plugin-next": { - "version": "15.4.6", + "node_modules/@redocly/config": { + "version": "0.22.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@redocly/openapi-core": { + "version": "1.34.5", "dev": true, "license": "MIT", "dependencies": { - "fast-glob": "3.3.1" + "@redocly/ajv": "^8.11.2", + "@redocly/config": "^0.22.0", + "colorette": "^1.2.0", + "https-proxy-agent": "^7.0.5", + "js-levenshtein": "^1.1.6", + "js-yaml": "^4.1.0", + "minimatch": "^5.0.1", + "pluralize": "^8.0.0", + "yaml-ast-parser": "0.0.43" + }, + "engines": { + "node": ">=18.17.0", + "npm": ">=9.5.0" } }, - "node_modules/@next/eslint-plugin-next/node_modules/fast-glob": { - "version": "3.3.1", + "node_modules/@redocly/respect-core": { + "version": "1.34.5", "dev": true, "license": "MIT", "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "@faker-js/faker": "^7.6.0", + "@redocly/ajv": "8.11.2", + "@redocly/openapi-core": "1.34.5", + "better-ajv-errors": "^1.2.0", + "colorette": "^2.0.20", + "concat-stream": "^2.0.0", + "cookie": "^0.7.2", + "dotenv": "16.4.7", + "form-data": "^4.0.4", + "jest-diff": "^29.3.1", + "jest-matcher-utils": "^29.3.1", + "js-yaml": "4.1.0", + "json-pointer": "^0.6.2", + "jsonpath-plus": "^10.0.6", + "open": "^10.1.0", + "openapi-sampler": "^1.6.1", + "outdent": "^0.8.0", + "set-cookie-parser": "^2.3.5", + "undici": "^6.21.1" }, "engines": { - "node": ">=8.6.0" + "node": ">=18.17.0", + "npm": ">=9.5.0" } }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", + "node_modules/@redocly/respect-core/node_modules/@redocly/ajv": { + "version": "8.11.2", "dev": true, "license": "MIT", "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js-replace": "^1.0.1" }, - "engines": { - "node": ">= 8" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", + "node_modules/@redocly/respect-core/node_modules/colorette": { + "version": "2.0.20", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/plugin-commonjs": { + "version": "22.0.2", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-22.0.2.tgz", + "integrity": "sha512-//NdP6iIwPbMTcazYsiBMbJW7gfmpHom33u1beiIoHDEM0Q9clvtQB1T0efvMqHeKsGohiHo97BCPCkBXdscwg==", "dev": true, "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^3.1.0", + "commondir": "^1.0.1", + "estree-walker": "^2.0.1", + "glob": "^7.1.6", + "is-reference": "^1.2.1", + "magic-string": "^0.25.7", + "resolve": "^1.17.0" + }, "engines": { - "node": ">= 8" + "node": ">= 12.0.0" + }, + "peerDependencies": { + "rollup": "^2.68.0" } }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", + "node_modules/@rollup/plugin-commonjs/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/@nolyfill/is-core-module": { - "version": "1.0.39", + "node_modules/@rollup/plugin-commonjs/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, - "license": "MIT", + "license": "ISC", + "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": ">=12.4.0" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@nuxt/opencollective": { - "version": "0.4.1", + "node_modules/@rollup/plugin-commonjs/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": "MIT", + "license": "ISC", "dependencies": { - "consola": "^3.2.3" - }, - "bin": { - "opencollective": "bin/opencollective.js" + "brace-expansion": "^1.1.7" }, "engines": { - "node": "^14.18.0 || >=16.10.0", - "npm": ">=5.10.0" + "node": "*" } }, - "node_modules/@nuxtjs/opencollective": { - "version": "0.3.2", + "node_modules/@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", "dev": true, "license": "MIT", "dependencies": { - "chalk": "^4.1.0", - "consola": "^2.15.0", - "node-fetch": "^2.6.1" - }, - "bin": { - "opencollective": "bin/opencollective.js" + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" }, "engines": { - "node": ">=8.0.0", - "npm": ">=5.0.0" + "node": ">= 8.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" } }, - "node_modules/@nuxtjs/opencollective/node_modules/consola": { - "version": "2.15.3", + "node_modules/@rollup/pluginutils/node_modules/@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", "dev": true, "license": "MIT" }, - "node_modules/@openapitools/openapi-generator-cli": { - "version": "2.23.4", + "node_modules/@rollup/pluginutils/node_modules/estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", "dev": true, - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "@nestjs/axios": "4.0.1", - "@nestjs/common": "11.1.6", - "@nestjs/core": "11.1.6", - "@nuxtjs/opencollective": "0.3.2", - "axios": "1.12.2", - "chalk": "4.1.2", - "commander": "8.3.0", - "compare-versions": "6.1.1", - "concurrently": "9.2.1", - "console.table": "0.10.0", - "fs-extra": "11.3.2", - "glob": "11.0.3", - "inquirer": "8.2.7", - "proxy-agent": "6.5.0", - "reflect-metadata": "0.2.2", - "rxjs": "7.8.2", - "tslib": "2.8.1" - }, - "bin": { - "openapi-generator-cli": "main.js" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/openapi_generator" - } + "license": "MIT" }, - "node_modules/@opentelemetry/api": { - "version": "1.9.0", + "node_modules/@rtsao/scc": { + "version": "1.1.0", "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=8.0.0" - } + "license": "MIT" }, - "node_modules/@opentelemetry/api-logs": { - "version": "0.53.0", + "node_modules/@rushstack/eslint-patch": { + "version": "1.12.0", "dev": true, - "license": "Apache-2.0", + "license": "MIT" + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "dev": true, + "license": "MIT" + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "@opentelemetry/api": "^1.0.0" - }, - "engines": { - "node": ">=14" + "type-detect": "4.0.8" } }, - "node_modules/@opentelemetry/context-async-hooks": { - "version": "1.26.0", + "node_modules/@sinonjs/fake-timers": { + "version": "13.0.5", "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.1" } }, - "node_modules/@opentelemetry/core": { - "version": "1.26.0", - "dev": true, + "node_modules/@smithy/abort-controller": { + "version": "4.2.0", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/semantic-conventions": "1.27.0" + "@smithy/types": "^4.6.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" + "node": ">=18.0.0" } }, - "node_modules/@opentelemetry/exporter-trace-otlp-http": { - "version": "0.53.0", - "dev": true, + "node_modules/@smithy/chunked-blob-reader": { + "version": "5.1.0", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "1.26.0", - "@opentelemetry/otlp-exporter-base": "0.53.0", - "@opentelemetry/otlp-transformer": "0.53.0", - "@opentelemetry/resources": "1.26.0", - "@opentelemetry/sdk-trace-base": "1.26.0" + "tslib": "^2.6.2" }, "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.0" + "node": ">=18.0.0" } }, - "node_modules/@opentelemetry/otlp-exporter-base": { - "version": "0.53.0", - "dev": true, + "node_modules/@smithy/chunked-blob-reader-native": { + "version": "4.1.0", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "1.26.0", - "@opentelemetry/otlp-transformer": "0.53.0" + "@smithy/util-base64": "^4.1.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.0" + "node": ">=18.0.0" } }, - "node_modules/@opentelemetry/otlp-transformer": { - "version": "0.53.0", - "dev": true, + "node_modules/@smithy/config-resolver": { + "version": "4.3.0", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/api-logs": "0.53.0", - "@opentelemetry/core": "1.26.0", - "@opentelemetry/resources": "1.26.0", - "@opentelemetry/sdk-logs": "0.53.0", - "@opentelemetry/sdk-metrics": "1.26.0", - "@opentelemetry/sdk-trace-base": "1.26.0", - "protobufjs": "^7.3.0" + "@smithy/node-config-provider": "^4.3.0", + "@smithy/types": "^4.6.0", + "@smithy/util-config-provider": "^4.2.0", + "@smithy/util-middleware": "^4.2.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" + "node": ">=18.0.0" } }, - "node_modules/@opentelemetry/propagator-b3": { - "version": "1.26.0", - "dev": true, + "node_modules/@smithy/core": { + "version": "3.15.0", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "1.26.0" + "@smithy/middleware-serde": "^4.2.0", + "@smithy/protocol-http": "^5.3.0", + "@smithy/types": "^4.6.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-middleware": "^4.2.0", + "@smithy/util-stream": "^4.5.0", + "@smithy/util-utf8": "^4.2.0", + "@smithy/uuid": "^1.1.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" + "node": ">=18.0.0" } }, - "node_modules/@opentelemetry/propagator-jaeger": { - "version": "1.26.0", - "dev": true, + "node_modules/@smithy/credential-provider-imds": { + "version": "4.2.0", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "1.26.0" + "@smithy/node-config-provider": "^4.3.0", + "@smithy/property-provider": "^4.2.0", + "@smithy/types": "^4.6.0", + "@smithy/url-parser": "^4.2.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14" + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/eventstream-codec": { + "version": "4.1.1", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/crc32": "5.2.0", + "@smithy/types": "^4.5.0", + "@smithy/util-hex-encoding": "^4.1.0", + "tslib": "^2.6.2" }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@opentelemetry/resources": { - "version": "1.26.0", - "dev": true, + "node_modules/@smithy/eventstream-serde-browser": { + "version": "4.1.1", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "1.26.0", - "@opentelemetry/semantic-conventions": "1.27.0" + "@smithy/eventstream-serde-universal": "^4.1.1", + "@smithy/types": "^4.5.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" + "node": ">=18.0.0" } }, - "node_modules/@opentelemetry/sdk-logs": { - "version": "0.53.0", - "dev": true, + "node_modules/@smithy/eventstream-serde-config-resolver": { + "version": "4.2.1", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/api-logs": "0.53.0", - "@opentelemetry/core": "1.26.0", - "@opentelemetry/resources": "1.26.0" + "@smithy/types": "^4.5.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.4.0 <1.10.0" + "node": ">=18.0.0" } }, - "node_modules/@opentelemetry/sdk-metrics": { - "version": "1.26.0", - "dev": true, + "node_modules/@smithy/eventstream-serde-node": { + "version": "4.1.1", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "1.26.0", - "@opentelemetry/resources": "1.26.0" + "@smithy/eventstream-serde-universal": "^4.1.1", + "@smithy/types": "^4.5.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" + "node": ">=18.0.0" } }, - "node_modules/@opentelemetry/sdk-trace-base": { - "version": "1.26.0", - "dev": true, + "node_modules/@smithy/eventstream-serde-universal": { + "version": "4.1.1", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "1.26.0", - "@opentelemetry/resources": "1.26.0", - "@opentelemetry/semantic-conventions": "1.27.0" + "@smithy/eventstream-codec": "^4.1.1", + "@smithy/types": "^4.5.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" + "node": ">=18.0.0" } }, - "node_modules/@opentelemetry/sdk-trace-node": { - "version": "1.26.0", - "dev": true, + "node_modules/@smithy/fetch-http-handler": { + "version": "5.3.1", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/context-async-hooks": "1.26.0", - "@opentelemetry/core": "1.26.0", - "@opentelemetry/propagator-b3": "1.26.0", - "@opentelemetry/propagator-jaeger": "1.26.0", - "@opentelemetry/sdk-trace-base": "1.26.0", - "semver": "^7.5.2" + "@smithy/protocol-http": "^5.3.0", + "@smithy/querystring-builder": "^4.2.0", + "@smithy/types": "^4.6.0", + "@smithy/util-base64": "^4.3.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" + "node": ">=18.0.0" } }, - "node_modules/@opentelemetry/semantic-conventions": { - "version": "1.27.0", - "dev": true, + "node_modules/@smithy/hash-blob-browser": { + "version": "4.1.1", "license": "Apache-2.0", + "dependencies": { + "@smithy/chunked-blob-reader": "^5.1.0", + "@smithy/chunked-blob-reader-native": "^4.1.0", + "@smithy/types": "^4.5.0", + "tslib": "^2.6.2" + }, "engines": { - "node": ">=14" + "node": ">=18.0.0" } }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "dev": true, - "license": "MIT", - "optional": true, + "node_modules/@smithy/hash-node": { + "version": "4.2.0", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.6.0", + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, "engines": { - "node": ">=14" + "node": ">=18.0.0" } }, - "node_modules/@pkgr/core": { - "version": "0.2.9", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + "node_modules/@smithy/hash-stream-node": { + "version": "4.1.1", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.5.0", + "@smithy/util-utf8": "^4.1.0", + "tslib": "^2.6.2" }, - "funding": { - "url": "https://opencollective.com/pkgr" + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@playwright/test": { - "version": "1.55.1", + "node_modules/@smithy/invalid-dependency": { + "version": "4.2.0", "license": "Apache-2.0", "dependencies": { - "playwright": "1.55.1" - }, - "bin": { - "playwright": "cli.js" + "@smithy/types": "^4.6.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=18" + "node": ">=18.0.0" } }, - "node_modules/@protobufjs/aspromise": { - "version": "1.1.2", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/base64": { - "version": "1.1.2", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/codegen": { - "version": "2.0.4", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/eventemitter": { - "version": "1.1.0", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/fetch": { - "version": "1.1.0", - "dev": true, - "license": "BSD-3-Clause", + "node_modules/@smithy/is-array-buffer": { + "version": "4.2.0", + "license": "Apache-2.0", "dependencies": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@protobufjs/float": { - "version": "1.0.2", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/inquire": { - "version": "1.1.0", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/path": { - "version": "1.1.2", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/pool": { - "version": "1.1.0", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/utf8": { - "version": "1.1.0", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@redocly/ajv": { - "version": "8.11.3", - "dev": true, - "license": "MIT", + "node_modules/@smithy/md5-js": { + "version": "4.1.1", + "license": "Apache-2.0", "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js-replace": "^1.0.1" + "@smithy/types": "^4.5.0", + "@smithy/util-utf8": "^4.1.0", + "tslib": "^2.6.2" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@redocly/cli": { - "version": "1.34.5", - "dev": true, - "license": "MIT", + "node_modules/@smithy/middleware-content-length": { + "version": "4.2.0", + "license": "Apache-2.0", "dependencies": { - "@opentelemetry/api": "1.9.0", - "@opentelemetry/exporter-trace-otlp-http": "0.53.0", - "@opentelemetry/resources": "1.26.0", - "@opentelemetry/sdk-trace-node": "1.26.0", - "@opentelemetry/semantic-conventions": "1.27.0", - "@redocly/config": "^0.22.0", - "@redocly/openapi-core": "1.34.5", - "@redocly/respect-core": "1.34.5", - "abort-controller": "^3.0.0", - "chokidar": "^3.5.1", - "colorette": "^1.2.0", - "core-js": "^3.32.1", - "dotenv": "16.4.7", - "form-data": "^4.0.4", - "get-port-please": "^3.0.1", - "glob": "^7.1.6", - "handlebars": "^4.7.6", - "mobx": "^6.0.4", - "pluralize": "^8.0.0", - "react": "^17.0.0 || ^18.2.0 || ^19.0.0", - "react-dom": "^17.0.0 || ^18.2.0 || ^19.0.0", - "redoc": "2.5.0", - "semver": "^7.5.2", - "simple-websocket": "^9.0.0", - "styled-components": "^6.0.7", - "yargs": "17.0.1" - }, - "bin": { - "openapi": "bin/cli.js", - "redocly": "bin/cli.js" + "@smithy/protocol-http": "^5.3.0", + "@smithy/types": "^4.6.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=18.17.0", - "npm": ">=9.5.0" + "node": ">=18.0.0" } }, - "node_modules/@redocly/cli/node_modules/brace-expansion": { - "version": "1.1.12", - "dev": true, - "license": "MIT", + "node_modules/@smithy/middleware-endpoint": { + "version": "4.3.1", + "license": "Apache-2.0", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "@smithy/core": "^3.15.0", + "@smithy/middleware-serde": "^4.2.0", + "@smithy/node-config-provider": "^4.3.0", + "@smithy/shared-ini-file-loader": "^4.3.0", + "@smithy/types": "^4.6.0", + "@smithy/url-parser": "^4.2.0", + "@smithy/util-middleware": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@redocly/cli/node_modules/glob": { - "version": "7.2.3", - "dev": true, - "license": "ISC", + "node_modules/@smithy/middleware-retry": { + "version": "4.4.1", + "license": "Apache-2.0", "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" + "@smithy/node-config-provider": "^4.3.0", + "@smithy/protocol-http": "^5.3.0", + "@smithy/service-error-classification": "^4.2.0", + "@smithy/smithy-client": "^4.7.1", + "@smithy/types": "^4.6.0", + "@smithy/util-middleware": "^4.2.0", + "@smithy/util-retry": "^4.2.0", + "@smithy/uuid": "^1.1.0", + "tslib": "^2.6.2" }, "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=18.0.0" } }, - "node_modules/@redocly/cli/node_modules/minimatch": { - "version": "3.1.2", - "dev": true, - "license": "ISC", + "node_modules/@smithy/middleware-serde": { + "version": "4.2.0", + "license": "Apache-2.0", "dependencies": { - "brace-expansion": "^1.1.7" + "@smithy/protocol-http": "^5.3.0", + "@smithy/types": "^4.6.0", + "tslib": "^2.6.2" }, "engines": { - "node": "*" + "node": ">=18.0.0" } }, - "node_modules/@redocly/config": { - "version": "0.22.2", - "dev": true, - "license": "MIT" - }, - "node_modules/@redocly/openapi-core": { - "version": "1.34.5", - "dev": true, - "license": "MIT", + "node_modules/@smithy/middleware-stack": { + "version": "4.2.0", + "license": "Apache-2.0", "dependencies": { - "@redocly/ajv": "^8.11.2", - "@redocly/config": "^0.22.0", - "colorette": "^1.2.0", - "https-proxy-agent": "^7.0.5", - "js-levenshtein": "^1.1.6", - "js-yaml": "^4.1.0", - "minimatch": "^5.0.1", - "pluralize": "^8.0.0", - "yaml-ast-parser": "0.0.43" + "@smithy/types": "^4.6.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=18.17.0", - "npm": ">=9.5.0" + "node": ">=18.0.0" } }, - "node_modules/@redocly/respect-core": { - "version": "1.34.5", - "dev": true, - "license": "MIT", + "node_modules/@smithy/node-config-provider": { + "version": "4.3.0", + "license": "Apache-2.0", "dependencies": { - "@faker-js/faker": "^7.6.0", - "@redocly/ajv": "8.11.2", - "@redocly/openapi-core": "1.34.5", - "better-ajv-errors": "^1.2.0", - "colorette": "^2.0.20", - "concat-stream": "^2.0.0", - "cookie": "^0.7.2", - "dotenv": "16.4.7", - "form-data": "^4.0.4", - "jest-diff": "^29.3.1", - "jest-matcher-utils": "^29.3.1", - "js-yaml": "4.1.0", - "json-pointer": "^0.6.2", - "jsonpath-plus": "^10.0.6", - "open": "^10.1.0", - "openapi-sampler": "^1.6.1", - "outdent": "^0.8.0", - "set-cookie-parser": "^2.3.5", - "undici": "^6.21.1" + "@smithy/property-provider": "^4.2.0", + "@smithy/shared-ini-file-loader": "^4.3.0", + "@smithy/types": "^4.6.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=18.17.0", - "npm": ">=9.5.0" + "node": ">=18.0.0" } }, - "node_modules/@redocly/respect-core/node_modules/@redocly/ajv": { - "version": "8.11.2", - "dev": true, - "license": "MIT", + "node_modules/@smithy/node-http-handler": { + "version": "4.3.0", + "license": "Apache-2.0", "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js-replace": "^1.0.1" + "@smithy/abort-controller": "^4.2.0", + "@smithy/protocol-http": "^5.3.0", + "@smithy/querystring-builder": "^4.2.0", + "@smithy/types": "^4.6.0", + "tslib": "^2.6.2" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@redocly/respect-core/node_modules/colorette": { - "version": "2.0.20", - "dev": true, - "license": "MIT" - }, - "node_modules/@rtsao/scc": { - "version": "1.1.0", - "dev": true, - "license": "MIT" - }, - "node_modules/@rushstack/eslint-patch": { - "version": "1.12.0", - "dev": true, - "license": "MIT" - }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "dev": true, - "license": "MIT" - }, - "node_modules/@sinonjs/commons": { - "version": "3.0.1", - "dev": true, - "license": "BSD-3-Clause", + "node_modules/@smithy/property-provider": { + "version": "4.2.0", + "license": "Apache-2.0", "dependencies": { - "type-detect": "4.0.8" + "@smithy/types": "^4.6.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@sinonjs/fake-timers": { - "version": "13.0.5", - "dev": true, - "license": "BSD-3-Clause", + "node_modules/@smithy/protocol-http": { + "version": "5.3.0", + "license": "Apache-2.0", "dependencies": { - "@sinonjs/commons": "^3.0.1" + "@smithy/types": "^4.6.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@smithy/abort-controller": { + "node_modules/@smithy/querystring-builder": { "version": "4.2.0", "license": "Apache-2.0", "dependencies": { "@smithy/types": "^4.6.0", + "@smithy/util-uri-escape": "^4.2.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@smithy/chunked-blob-reader": { - "version": "5.1.0", + "node_modules/@smithy/querystring-parser": { + "version": "4.2.0", "license": "Apache-2.0", "dependencies": { + "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@smithy/chunked-blob-reader-native": { - "version": "4.1.0", + "node_modules/@smithy/service-error-classification": { + "version": "4.2.0", "license": "Apache-2.0", "dependencies": { - "@smithy/util-base64": "^4.1.0", - "tslib": "^2.6.2" + "@smithy/types": "^4.6.0" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@smithy/config-resolver": { + "node_modules/@smithy/shared-ini-file-loader": { "version": "4.3.0", "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^4.3.0", "@smithy/types": "^4.6.0", - "@smithy/util-config-provider": "^4.2.0", - "@smithy/util-middleware": "^4.2.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@smithy/core": { - "version": "3.15.0", + "node_modules/@smithy/signature-v4": { + "version": "5.3.0", "license": "Apache-2.0", "dependencies": { - "@smithy/middleware-serde": "^4.2.0", + "@smithy/is-array-buffer": "^4.2.0", "@smithy/protocol-http": "^5.3.0", "@smithy/types": "^4.6.0", - "@smithy/util-base64": "^4.3.0", - "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-hex-encoding": "^4.2.0", "@smithy/util-middleware": "^4.2.0", - "@smithy/util-stream": "^4.5.0", + "@smithy/util-uri-escape": "^4.2.0", "@smithy/util-utf8": "^4.2.0", - "@smithy/uuid": "^1.1.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@smithy/credential-provider-imds": { + "node_modules/@smithy/smithy-client": { + "version": "4.7.1", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.15.0", + "@smithy/middleware-endpoint": "^4.3.1", + "@smithy/middleware-stack": "^4.2.0", + "@smithy/protocol-http": "^5.3.0", + "@smithy/types": "^4.6.0", + "@smithy/util-stream": "^4.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/types": { + "version": "4.6.0", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/url-parser": { "version": "4.2.0", "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^4.3.0", - "@smithy/property-provider": "^4.2.0", + "@smithy/querystring-parser": "^4.2.0", "@smithy/types": "^4.6.0", - "@smithy/url-parser": "^4.2.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@smithy/eventstream-codec": { - "version": "4.1.1", + "node_modules/@smithy/util-base64": { + "version": "4.3.0", "license": "Apache-2.0", "dependencies": { - "@aws-crypto/crc32": "5.2.0", - "@smithy/types": "^4.5.0", - "@smithy/util-hex-encoding": "^4.1.0", + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@smithy/eventstream-serde-browser": { - "version": "4.1.1", + "node_modules/@smithy/util-body-length-browser": { + "version": "4.2.0", "license": "Apache-2.0", "dependencies": { - "@smithy/eventstream-serde-universal": "^4.1.1", - "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@smithy/eventstream-serde-config-resolver": { + "node_modules/@smithy/util-body-length-node": { "version": "4.2.1", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@smithy/eventstream-serde-node": { - "version": "4.1.1", + "node_modules/@smithy/util-buffer-from": { + "version": "4.2.0", "license": "Apache-2.0", "dependencies": { - "@smithy/eventstream-serde-universal": "^4.1.1", - "@smithy/types": "^4.5.0", + "@smithy/is-array-buffer": "^4.2.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@smithy/eventstream-serde-universal": { - "version": "4.1.1", + "node_modules/@smithy/util-config-provider": { + "version": "4.2.0", "license": "Apache-2.0", "dependencies": { - "@smithy/eventstream-codec": "^4.1.1", - "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@smithy/fetch-http-handler": { - "version": "5.3.1", + "node_modules/@smithy/util-defaults-mode-browser": { + "version": "4.3.0", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.3.0", - "@smithy/querystring-builder": "^4.2.0", + "@smithy/property-provider": "^4.2.0", + "@smithy/smithy-client": "^4.7.1", "@smithy/types": "^4.6.0", - "@smithy/util-base64": "^4.3.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@smithy/hash-blob-browser": { - "version": "4.1.1", + "node_modules/@smithy/util-defaults-mode-node": { + "version": "4.2.1", "license": "Apache-2.0", "dependencies": { - "@smithy/chunked-blob-reader": "^5.1.0", - "@smithy/chunked-blob-reader-native": "^4.1.0", - "@smithy/types": "^4.5.0", + "@smithy/config-resolver": "^4.3.0", + "@smithy/credential-provider-imds": "^4.2.0", + "@smithy/node-config-provider": "^4.3.0", + "@smithy/property-provider": "^4.2.0", + "@smithy/smithy-client": "^4.7.1", + "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@smithy/hash-node": { - "version": "4.2.0", + "node_modules/@smithy/util-endpoints": { + "version": "3.2.0", "license": "Apache-2.0", "dependencies": { + "@smithy/node-config-provider": "^4.3.0", "@smithy/types": "^4.6.0", - "@smithy/util-buffer-from": "^4.2.0", - "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@smithy/hash-stream-node": { - "version": "4.1.1", + "node_modules/@smithy/util-hex-encoding": { + "version": "4.2.0", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.5.0", - "@smithy/util-utf8": "^4.1.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@smithy/invalid-dependency": { + "node_modules/@smithy/util-middleware": { "version": "4.2.0", "license": "Apache-2.0", "dependencies": { @@ -8108,431 +9653,660 @@ "node": ">=18.0.0" } }, - "node_modules/@smithy/is-array-buffer": { + "node_modules/@smithy/util-retry": { "version": "4.2.0", "license": "Apache-2.0", "dependencies": { + "@smithy/service-error-classification": "^4.2.0", + "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@smithy/md5-js": { - "version": "4.1.1", + "node_modules/@smithy/util-stream": { + "version": "4.5.0", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.5.0", - "@smithy/util-utf8": "^4.1.0", + "@smithy/fetch-http-handler": "^5.3.1", + "@smithy/node-http-handler": "^4.3.0", + "@smithy/types": "^4.6.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-hex-encoding": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@smithy/middleware-content-length": { + "node_modules/@smithy/util-uri-escape": { "version": "4.2.0", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.3.0", - "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@smithy/middleware-endpoint": { - "version": "4.3.1", + "node_modules/@smithy/util-utf8": { + "version": "4.2.0", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.15.0", - "@smithy/middleware-serde": "^4.2.0", - "@smithy/node-config-provider": "^4.3.0", - "@smithy/shared-ini-file-loader": "^4.3.0", - "@smithy/types": "^4.6.0", - "@smithy/url-parser": "^4.2.0", - "@smithy/util-middleware": "^4.2.0", + "@smithy/util-buffer-from": "^4.2.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@smithy/middleware-retry": { - "version": "4.4.1", + "node_modules/@smithy/util-waiter": { + "version": "4.1.1", "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^4.3.0", - "@smithy/protocol-http": "^5.3.0", - "@smithy/service-error-classification": "^4.2.0", - "@smithy/smithy-client": "^4.7.1", - "@smithy/types": "^4.6.0", - "@smithy/util-middleware": "^4.2.0", - "@smithy/util-retry": "^4.2.0", - "@smithy/uuid": "^1.1.0", + "@smithy/abort-controller": "^4.1.1", + "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@smithy/middleware-serde": { - "version": "4.2.0", + "node_modules/@smithy/uuid": { + "version": "1.1.0", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.3.0", - "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@smithy/middleware-stack": { - "version": "4.2.0", + "node_modules/@stoplight/better-ajv-errors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@stoplight/better-ajv-errors/-/better-ajv-errors-1.0.3.tgz", + "integrity": "sha512-0p9uXkuB22qGdNfy3VeEhxkU5uwvp/KrBTAbrLBURv6ilxIVwanKwjMc41lQfIVgPGcOkmLbTolfFrSsueu7zA==", + "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.6.0", - "tslib": "^2.6.2" + "jsonpointer": "^5.0.0", + "leven": "^3.1.0" }, "engines": { - "node": ">=18.0.0" + "node": "^12.20 || >= 14.13" + }, + "peerDependencies": { + "ajv": ">=8" } }, - "node_modules/@smithy/node-config-provider": { - "version": "4.3.0", + "node_modules/@stoplight/json": { + "version": "3.21.7", + "resolved": "https://registry.npmjs.org/@stoplight/json/-/json-3.21.7.tgz", + "integrity": "sha512-xcJXgKFqv/uCEgtGlPxy3tPA+4I+ZI4vAuMJ885+ThkTHFVkC+0Fm58lA9NlsyjnkpxFh4YiQWpH+KefHdbA0A==", + "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^4.2.0", - "@smithy/shared-ini-file-loader": "^4.3.0", - "@smithy/types": "^4.6.0", - "tslib": "^2.6.2" + "@stoplight/ordered-object-literal": "^1.0.3", + "@stoplight/path": "^1.3.2", + "@stoplight/types": "^13.6.0", + "jsonc-parser": "~2.2.1", + "lodash": "^4.17.21", + "safe-stable-stringify": "^1.1" }, "engines": { - "node": ">=18.0.0" + "node": ">=8.3.0" } }, - "node_modules/@smithy/node-http-handler": { - "version": "4.3.0", + "node_modules/@stoplight/json-ref-readers": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@stoplight/json-ref-readers/-/json-ref-readers-1.2.2.tgz", + "integrity": "sha512-nty0tHUq2f1IKuFYsLM4CXLZGHdMn+X/IwEUIpeSOXt0QjMUbL0Em57iJUDzz+2MkWG83smIigNZ3fauGjqgdQ==", + "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/abort-controller": "^4.2.0", - "@smithy/protocol-http": "^5.3.0", - "@smithy/querystring-builder": "^4.2.0", - "@smithy/types": "^4.6.0", - "tslib": "^2.6.2" + "node-fetch": "^2.6.0", + "tslib": "^1.14.1" }, "engines": { - "node": ">=18.0.0" + "node": ">=8.3.0" } }, - "node_modules/@smithy/property-provider": { - "version": "4.2.0", + "node_modules/@stoplight/json-ref-readers/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true, + "license": "0BSD" + }, + "node_modules/@stoplight/json-ref-resolver": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@stoplight/json-ref-resolver/-/json-ref-resolver-3.1.6.tgz", + "integrity": "sha512-YNcWv3R3n3U6iQYBsFOiWSuRGE5su1tJSiX6pAPRVk7dP0L7lqCteXGzuVRQ0gMZqUl8v1P0+fAKxF6PLo9B5A==", + "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.6.0", - "tslib": "^2.6.2" + "@stoplight/json": "^3.21.0", + "@stoplight/path": "^1.3.2", + "@stoplight/types": "^12.3.0 || ^13.0.0", + "@types/urijs": "^1.19.19", + "dependency-graph": "~0.11.0", + "fast-memoize": "^2.5.2", + "immer": "^9.0.6", + "lodash": "^4.17.21", + "tslib": "^2.6.0", + "urijs": "^1.19.11" }, "engines": { - "node": ">=18.0.0" + "node": ">=8.3.0" } }, - "node_modules/@smithy/protocol-http": { - "version": "5.3.0", + "node_modules/@stoplight/json/node_modules/jsonc-parser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.2.1.tgz", + "integrity": "sha512-o6/yDBYccGvTz1+QFevz6l6OBZ2+fMVu2JZ9CIhzsYRX4mjaK5IyX9eldUdCmga16zlgQxyrj5pt9kzuj2C02w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@stoplight/json/node_modules/safe-stable-stringify": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-1.1.1.tgz", + "integrity": "sha512-ERq4hUjKDbJfE4+XtZLFPCDi8Vb1JqaxAPTxWFLBx8XcAlf9Bda/ZJdVezs/NAfsMQScyIlUMx+Yeu7P7rx5jw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@stoplight/ordered-object-literal": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@stoplight/ordered-object-literal/-/ordered-object-literal-1.0.5.tgz", + "integrity": "sha512-COTiuCU5bgMUtbIFBuyyh2/yVVzlr5Om0v5utQDgBCuQUOPgU1DwoffkTfg4UBQOvByi5foF4w4T+H9CoRe5wg==", + "dev": true, "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.6.0", - "tslib": "^2.6.2" - }, "engines": { - "node": ">=18.0.0" + "node": ">=8" } }, - "node_modules/@smithy/querystring-builder": { - "version": "4.2.0", + "node_modules/@stoplight/path": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@stoplight/path/-/path-1.3.2.tgz", + "integrity": "sha512-lyIc6JUlUA8Ve5ELywPC8I2Sdnh1zc1zmbYgVarhXIp9YeAB0ReeqmGEOWNtlHkbP2DAA1AL65Wfn2ncjK/jtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/@stoplight/spectral-cli": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/@stoplight/spectral-cli/-/spectral-cli-6.15.0.tgz", + "integrity": "sha512-FVeQIuqQQnnLfa8vy+oatTKUve7uU+3SaaAfdjpX/B+uB1NcfkKRJYhKT9wMEehDRaMPL5AKIRYMCFerdEbIpw==", + "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.6.0", - "@smithy/util-uri-escape": "^4.2.0", - "tslib": "^2.6.2" + "@stoplight/json": "~3.21.0", + "@stoplight/path": "1.3.2", + "@stoplight/spectral-core": "^1.19.5", + "@stoplight/spectral-formatters": "^1.4.1", + "@stoplight/spectral-parsers": "^1.0.4", + "@stoplight/spectral-ref-resolver": "^1.0.4", + "@stoplight/spectral-ruleset-bundler": "^1.6.0", + "@stoplight/spectral-ruleset-migrator": "^1.11.0", + "@stoplight/spectral-rulesets": ">=1", + "@stoplight/spectral-runtime": "^1.1.2", + "@stoplight/types": "^13.6.0", + "chalk": "4.1.2", + "fast-glob": "~3.2.12", + "hpagent": "~1.2.0", + "lodash": "~4.17.21", + "pony-cause": "^1.1.1", + "stacktracey": "^2.1.8", + "tslib": "^2.8.1", + "yargs": "~17.7.2" + }, + "bin": { + "spectral": "dist/index.js" }, "engines": { - "node": ">=18.0.0" + "node": "^16.20 || ^18.18 || >= 20.17" } }, - "node_modules/@smithy/querystring-parser": { - "version": "4.2.0", - "license": "Apache-2.0", + "node_modules/@stoplight/spectral-cli/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", "dependencies": { - "@smithy/types": "^4.6.0", - "tslib": "^2.6.2" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" }, "engines": { - "node": ">=18.0.0" + "node": ">=12" } }, - "node_modules/@smithy/service-error-classification": { - "version": "4.2.0", - "license": "Apache-2.0", + "node_modules/@stoplight/spectral-cli/node_modules/fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dev": true, + "license": "MIT", "dependencies": { - "@smithy/types": "^4.6.0" + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" }, "engines": { - "node": ">=18.0.0" + "node": ">=8.6.0" } }, - "node_modules/@smithy/shared-ini-file-loader": { - "version": "4.3.0", - "license": "Apache-2.0", + "node_modules/@stoplight/spectral-cli/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", "dependencies": { - "@smithy/types": "^4.6.0", - "tslib": "^2.6.2" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=18.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/@smithy/signature-v4": { - "version": "5.3.0", - "license": "Apache-2.0", + "node_modules/@stoplight/spectral-cli/node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", "dependencies": { - "@smithy/is-array-buffer": "^4.2.0", - "@smithy/protocol-http": "^5.3.0", - "@smithy/types": "^4.6.0", - "@smithy/util-hex-encoding": "^4.2.0", - "@smithy/util-middleware": "^4.2.0", - "@smithy/util-uri-escape": "^4.2.0", - "@smithy/util-utf8": "^4.2.0", - "tslib": "^2.6.2" + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" }, "engines": { - "node": ">=18.0.0" + "node": ">=12" } }, - "node_modules/@smithy/smithy-client": { - "version": "4.7.1", + "node_modules/@stoplight/spectral-core": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/@stoplight/spectral-core/-/spectral-core-1.20.0.tgz", + "integrity": "sha512-5hBP81nCC1zn1hJXL/uxPNRKNcB+/pEIHgCjPRpl/w/qy9yC9ver04tw1W0l/PMiv0UeB5dYgozXVQ4j5a6QQQ==", + "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.15.0", - "@smithy/middleware-endpoint": "^4.3.1", - "@smithy/middleware-stack": "^4.2.0", - "@smithy/protocol-http": "^5.3.0", - "@smithy/types": "^4.6.0", - "@smithy/util-stream": "^4.5.0", - "tslib": "^2.6.2" + "@stoplight/better-ajv-errors": "1.0.3", + "@stoplight/json": "~3.21.0", + "@stoplight/path": "1.3.2", + "@stoplight/spectral-parsers": "^1.0.0", + "@stoplight/spectral-ref-resolver": "^1.0.4", + "@stoplight/spectral-runtime": "^1.1.2", + "@stoplight/types": "~13.6.0", + "@types/es-aggregate-error": "^1.0.2", + "@types/json-schema": "^7.0.11", + "ajv": "^8.17.1", + "ajv-errors": "~3.0.0", + "ajv-formats": "~2.1.1", + "es-aggregate-error": "^1.0.7", + "jsonpath-plus": "^10.3.0", + "lodash": "~4.17.21", + "lodash.topath": "^4.5.2", + "minimatch": "3.1.2", + "nimma": "0.2.3", + "pony-cause": "^1.1.1", + "simple-eval": "1.0.1", + "tslib": "^2.8.1" }, "engines": { - "node": ">=18.0.0" + "node": "^16.20 || ^18.18 || >= 20.17" } }, - "node_modules/@smithy/types": { - "version": "4.6.0", + "node_modules/@stoplight/spectral-core/node_modules/@stoplight/types": { + "version": "13.6.0", + "resolved": "https://registry.npmjs.org/@stoplight/types/-/types-13.6.0.tgz", + "integrity": "sha512-dzyuzvUjv3m1wmhPfq82lCVYGcXG0xUYgqnWfCq3PCVR4BKFhjdkHrnJ+jIDoMKvXb05AZP/ObQF6+NpDo29IQ==", + "dev": true, "license": "Apache-2.0", "dependencies": { - "tslib": "^2.6.2" + "@types/json-schema": "^7.0.4", + "utility-types": "^3.10.0" }, "engines": { - "node": ">=18.0.0" + "node": "^12.20 || >=14.13" } }, - "node_modules/@smithy/url-parser": { - "version": "4.2.0", - "license": "Apache-2.0", + "node_modules/@stoplight/spectral-core/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", "dependencies": { - "@smithy/querystring-parser": "^4.2.0", - "@smithy/types": "^4.6.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/@smithy/util-base64": { - "version": "4.3.0", - "license": "Apache-2.0", + "node_modules/@stoplight/spectral-core/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": { - "@smithy/util-buffer-from": "^4.2.0", - "@smithy/util-utf8": "^4.2.0", - "tslib": "^2.6.2" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=18.0.0" + "node": "*" } }, - "node_modules/@smithy/util-body-length-browser": { - "version": "4.2.0", + "node_modules/@stoplight/spectral-formats": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@stoplight/spectral-formats/-/spectral-formats-1.8.2.tgz", + "integrity": "sha512-c06HB+rOKfe7tuxg0IdKDEA5XnjL2vrn/m/OVIIxtINtBzphZrOgtRn7epQ5bQF5SWp84Ue7UJWaGgDwVngMFw==", + "dev": true, "license": "Apache-2.0", "dependencies": { - "tslib": "^2.6.2" + "@stoplight/json": "^3.17.0", + "@stoplight/spectral-core": "^1.19.2", + "@types/json-schema": "^7.0.7", + "tslib": "^2.8.1" }, "engines": { - "node": ">=18.0.0" + "node": "^16.20 || ^18.18 || >= 20.17" } }, - "node_modules/@smithy/util-body-length-node": { - "version": "4.2.1", + "node_modules/@stoplight/spectral-formatters": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@stoplight/spectral-formatters/-/spectral-formatters-1.5.0.tgz", + "integrity": "sha512-lR7s41Z00Mf8TdXBBZQ3oi2uR8wqAtR6NO0KA8Ltk4FSpmAy0i6CKUmJG9hZQjanTnGmwpQkT/WP66p1GY3iXA==", + "dev": true, "license": "Apache-2.0", "dependencies": { - "tslib": "^2.6.2" + "@stoplight/path": "^1.3.2", + "@stoplight/spectral-core": "^1.19.4", + "@stoplight/spectral-runtime": "^1.1.2", + "@stoplight/types": "^13.15.0", + "@types/markdown-escape": "^1.1.3", + "chalk": "4.1.2", + "cliui": "7.0.4", + "lodash": "^4.17.21", + "markdown-escape": "^2.0.0", + "node-sarif-builder": "^2.0.3", + "strip-ansi": "6.0", + "text-table": "^0.2.0", + "tslib": "^2.8.1" }, "engines": { - "node": ">=18.0.0" + "node": "^16.20 || ^18.18 || >= 20.17" } }, - "node_modules/@smithy/util-buffer-from": { - "version": "4.2.0", + "node_modules/@stoplight/spectral-functions": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@stoplight/spectral-functions/-/spectral-functions-1.10.1.tgz", + "integrity": "sha512-obu8ZfoHxELOapfGsCJixKZXZcffjg+lSoNuttpmUFuDzVLT3VmH8QkPXfOGOL5Pz80BR35ClNAToDkdnYIURg==", + "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/is-array-buffer": "^4.2.0", - "tslib": "^2.6.2" + "@stoplight/better-ajv-errors": "1.0.3", + "@stoplight/json": "^3.17.1", + "@stoplight/spectral-core": "^1.19.4", + "@stoplight/spectral-formats": "^1.8.1", + "@stoplight/spectral-runtime": "^1.1.2", + "ajv": "^8.17.1", + "ajv-draft-04": "~1.0.0", + "ajv-errors": "~3.0.0", + "ajv-formats": "~2.1.1", + "lodash": "~4.17.21", + "tslib": "^2.8.1" }, "engines": { - "node": ">=18.0.0" + "node": "^16.20 || ^18.18 || >= 20.17" } }, - "node_modules/@smithy/util-config-provider": { - "version": "4.2.0", + "node_modules/@stoplight/spectral-parsers": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@stoplight/spectral-parsers/-/spectral-parsers-1.0.5.tgz", + "integrity": "sha512-ANDTp2IHWGvsQDAY85/jQi9ZrF4mRrA5bciNHX+PUxPr4DwS6iv4h+FVWJMVwcEYdpyoIdyL+SRmHdJfQEPmwQ==", + "dev": true, "license": "Apache-2.0", "dependencies": { - "tslib": "^2.6.2" + "@stoplight/json": "~3.21.0", + "@stoplight/types": "^14.1.1", + "@stoplight/yaml": "~4.3.0", + "tslib": "^2.8.1" }, "engines": { - "node": ">=18.0.0" + "node": "^16.20 || ^18.18 || >= 20.17" } }, - "node_modules/@smithy/util-defaults-mode-browser": { - "version": "4.3.0", + "node_modules/@stoplight/spectral-parsers/node_modules/@stoplight/types": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/@stoplight/types/-/types-14.1.1.tgz", + "integrity": "sha512-/kjtr+0t0tjKr+heVfviO9FrU/uGLc+QNX3fHJc19xsCNYqU7lVhaXxDmEID9BZTjG+/r9pK9xP/xU02XGg65g==", + "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^4.2.0", - "@smithy/smithy-client": "^4.7.1", - "@smithy/types": "^4.6.0", - "tslib": "^2.6.2" + "@types/json-schema": "^7.0.4", + "utility-types": "^3.10.0" }, "engines": { - "node": ">=18.0.0" + "node": "^12.20 || >=14.13" } }, - "node_modules/@smithy/util-defaults-mode-node": { - "version": "4.2.1", + "node_modules/@stoplight/spectral-ref-resolver": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@stoplight/spectral-ref-resolver/-/spectral-ref-resolver-1.0.5.tgz", + "integrity": "sha512-gj3TieX5a9zMW29z3mBlAtDOCgN3GEc1VgZnCVlr5irmR4Qi5LuECuFItAq4pTn5Zu+sW5bqutsCH7D4PkpyAA==", + "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/config-resolver": "^4.3.0", - "@smithy/credential-provider-imds": "^4.2.0", - "@smithy/node-config-provider": "^4.3.0", - "@smithy/property-provider": "^4.2.0", - "@smithy/smithy-client": "^4.7.1", - "@smithy/types": "^4.6.0", - "tslib": "^2.6.2" + "@stoplight/json-ref-readers": "1.2.2", + "@stoplight/json-ref-resolver": "~3.1.6", + "@stoplight/spectral-runtime": "^1.1.2", + "dependency-graph": "0.11.0", + "tslib": "^2.8.1" }, "engines": { - "node": ">=18.0.0" + "node": "^16.20 || ^18.18 || >= 20.17" } }, - "node_modules/@smithy/util-endpoints": { - "version": "3.2.0", + "node_modules/@stoplight/spectral-ruleset-bundler": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@stoplight/spectral-ruleset-bundler/-/spectral-ruleset-bundler-1.6.3.tgz", + "integrity": "sha512-AQFRO6OCKg8SZJUupnr3+OzI1LrMieDTEUHsYgmaRpNiDRPvzImE3bzM1KyQg99q58kTQyZ8kpr7sG8Lp94RRA==", + "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^4.3.0", - "@smithy/types": "^4.6.0", - "tslib": "^2.6.2" + "@rollup/plugin-commonjs": "~22.0.2", + "@stoplight/path": "1.3.2", + "@stoplight/spectral-core": ">=1", + "@stoplight/spectral-formats": "^1.8.1", + "@stoplight/spectral-functions": ">=1", + "@stoplight/spectral-parsers": ">=1", + "@stoplight/spectral-ref-resolver": "^1.0.4", + "@stoplight/spectral-ruleset-migrator": "^1.9.6", + "@stoplight/spectral-rulesets": ">=1", + "@stoplight/spectral-runtime": "^1.1.2", + "@stoplight/types": "^13.6.0", + "@types/node": "*", + "pony-cause": "1.1.1", + "rollup": "~2.79.2", + "tslib": "^2.8.1", + "validate-npm-package-name": "3.0.0" }, "engines": { - "node": ">=18.0.0" + "node": "^16.20 || ^18.18 || >= 20.17" } }, - "node_modules/@smithy/util-hex-encoding": { - "version": "4.2.0", + "node_modules/@stoplight/spectral-ruleset-migrator": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/@stoplight/spectral-ruleset-migrator/-/spectral-ruleset-migrator-1.11.3.tgz", + "integrity": "sha512-+9Y1zFxYmSsneT5FPkgS1IlRQs0VgtdMT77f5xf6vzje9ezyhfs7oXwbZOCSZjEJew8iVZBKQtiOFndcBrdtqg==", + "dev": true, "license": "Apache-2.0", "dependencies": { - "tslib": "^2.6.2" + "@stoplight/json": "~3.21.0", + "@stoplight/ordered-object-literal": "~1.0.4", + "@stoplight/path": "1.3.2", + "@stoplight/spectral-functions": "^1.9.1", + "@stoplight/spectral-runtime": "^1.1.2", + "@stoplight/types": "^13.6.0", + "@stoplight/yaml": "~4.2.3", + "@types/node": "*", + "ajv": "^8.17.1", + "ast-types": "0.14.2", + "astring": "^1.9.0", + "reserved": "0.1.2", + "tslib": "^2.8.1", + "validate-npm-package-name": "3.0.0" }, "engines": { - "node": ">=18.0.0" + "node": "^16.20 || ^18.18 || >= 20.17" } }, - "node_modules/@smithy/util-middleware": { - "version": "4.2.0", + "node_modules/@stoplight/spectral-ruleset-migrator/node_modules/@stoplight/yaml": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@stoplight/yaml/-/yaml-4.2.3.tgz", + "integrity": "sha512-Mx01wjRAR9C7yLMUyYFTfbUf5DimEpHMkRDQ1PKLe9dfNILbgdxyrncsOXM3vCpsQ1Hfj4bPiGl+u4u6e9Akqw==", + "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.6.0", - "tslib": "^2.6.2" + "@stoplight/ordered-object-literal": "^1.0.1", + "@stoplight/types": "^13.0.0", + "@stoplight/yaml-ast-parser": "0.0.48", + "tslib": "^2.2.0" }, "engines": { - "node": ">=18.0.0" + "node": ">=10.8" } }, - "node_modules/@smithy/util-retry": { - "version": "4.2.0", - "license": "Apache-2.0", + "node_modules/@stoplight/spectral-ruleset-migrator/node_modules/@stoplight/yaml-ast-parser": { + "version": "0.0.48", + "resolved": "https://registry.npmjs.org/@stoplight/yaml-ast-parser/-/yaml-ast-parser-0.0.48.tgz", + "integrity": "sha512-sV+51I7WYnLJnKPn2EMWgS4EUfoP4iWEbrWwbXsj0MZCB/xOK8j6+C9fntIdOM50kpx45ZLC3s6kwKivWuqvyg==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@stoplight/spectral-ruleset-migrator/node_modules/ast-types": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.14.2.tgz", + "integrity": "sha512-O0yuUDnZeQDL+ncNGlJ78BiO4jnYI3bvMsD5prT0/nsgijG/LpNBIr63gTjVTNsiGkgQhiyCShTgxt8oXOrklA==", + "dev": true, + "license": "MIT", "dependencies": { - "@smithy/service-error-classification": "^4.2.0", - "@smithy/types": "^4.6.0", - "tslib": "^2.6.2" + "tslib": "^2.0.1" }, "engines": { - "node": ">=18.0.0" + "node": ">=4" } }, - "node_modules/@smithy/util-stream": { - "version": "4.5.0", + "node_modules/@stoplight/spectral-rulesets": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/@stoplight/spectral-rulesets/-/spectral-rulesets-1.22.0.tgz", + "integrity": "sha512-l2EY2jiKKLsvnPfGy+pXC0LeGsbJzcQP5G/AojHgf+cwN//VYxW1Wvv4WKFx/CLmLxc42mJYF2juwWofjWYNIQ==", + "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/fetch-http-handler": "^5.3.1", - "@smithy/node-http-handler": "^4.3.0", - "@smithy/types": "^4.6.0", - "@smithy/util-base64": "^4.3.0", - "@smithy/util-buffer-from": "^4.2.0", - "@smithy/util-hex-encoding": "^4.2.0", - "@smithy/util-utf8": "^4.2.0", - "tslib": "^2.6.2" + "@asyncapi/specs": "^6.8.0", + "@stoplight/better-ajv-errors": "1.0.3", + "@stoplight/json": "^3.17.0", + "@stoplight/spectral-core": "^1.19.4", + "@stoplight/spectral-formats": "^1.8.1", + "@stoplight/spectral-functions": "^1.9.1", + "@stoplight/spectral-runtime": "^1.1.2", + "@stoplight/types": "^13.6.0", + "@types/json-schema": "^7.0.7", + "ajv": "^8.17.1", + "ajv-formats": "~2.1.1", + "json-schema-traverse": "^1.0.0", + "leven": "3.1.0", + "lodash": "~4.17.21", + "tslib": "^2.8.1" }, "engines": { - "node": ">=18.0.0" + "node": "^16.20 || ^18.18 || >= 20.17" } }, - "node_modules/@smithy/util-uri-escape": { - "version": "4.2.0", + "node_modules/@stoplight/spectral-runtime": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@stoplight/spectral-runtime/-/spectral-runtime-1.1.4.tgz", + "integrity": "sha512-YHbhX3dqW0do6DhiPSgSGQzr6yQLlWybhKwWx0cqxjMwxej3TqLv3BXMfIUYFKKUqIwH4Q2mV8rrMM8qD2N0rQ==", + "dev": true, "license": "Apache-2.0", "dependencies": { - "tslib": "^2.6.2" + "@stoplight/json": "^3.20.1", + "@stoplight/path": "^1.3.2", + "@stoplight/types": "^13.6.0", + "abort-controller": "^3.0.0", + "lodash": "^4.17.21", + "node-fetch": "^2.7.0", + "tslib": "^2.8.1" }, "engines": { - "node": ">=18.0.0" + "node": "^16.20 || ^18.18 || >= 20.17" } }, - "node_modules/@smithy/util-utf8": { - "version": "4.2.0", + "node_modules/@stoplight/types": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/@stoplight/types/-/types-13.20.0.tgz", + "integrity": "sha512-2FNTv05If7ib79VPDA/r9eUet76jewXFH2y2K5vuge6SXbRHtWBhcaRmu+6QpF4/WRNoJj5XYRSwLGXDxysBGA==", + "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/util-buffer-from": "^4.2.0", - "tslib": "^2.6.2" + "@types/json-schema": "^7.0.4", + "utility-types": "^3.10.0" }, "engines": { - "node": ">=18.0.0" + "node": "^12.20 || >=14.13" } }, - "node_modules/@smithy/util-waiter": { - "version": "4.1.1", + "node_modules/@stoplight/yaml": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@stoplight/yaml/-/yaml-4.3.0.tgz", + "integrity": "sha512-JZlVFE6/dYpP9tQmV0/ADfn32L9uFarHWxfcRhReKUnljz1ZiUM5zpX+PH8h5CJs6lao3TuFqnPm9IJJCEkE2w==", + "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/abort-controller": "^4.1.1", - "@smithy/types": "^4.5.0", - "tslib": "^2.6.2" + "@stoplight/ordered-object-literal": "^1.0.5", + "@stoplight/types": "^14.1.1", + "@stoplight/yaml-ast-parser": "0.0.50", + "tslib": "^2.2.0" }, "engines": { - "node": ">=18.0.0" + "node": ">=10.8" } }, - "node_modules/@smithy/uuid": { - "version": "1.1.0", + "node_modules/@stoplight/yaml-ast-parser": { + "version": "0.0.50", + "resolved": "https://registry.npmjs.org/@stoplight/yaml-ast-parser/-/yaml-ast-parser-0.0.50.tgz", + "integrity": "sha512-Pb6M8TDO9DtSVla9yXSTAxmo9GVEouq5P40DWXdOie69bXogZTkgvopCq+yEvTMA0F6PEvdJmbtTV3ccIp11VQ==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@stoplight/yaml/node_modules/@stoplight/types": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/@stoplight/types/-/types-14.1.1.tgz", + "integrity": "sha512-/kjtr+0t0tjKr+heVfviO9FrU/uGLc+QNX3fHJc19xsCNYqU7lVhaXxDmEID9BZTjG+/r9pK9xP/xU02XGg65g==", + "dev": true, "license": "Apache-2.0", "dependencies": { - "tslib": "^2.6.2" + "@types/json-schema": "^7.0.4", + "utility-types": "^3.10.0" }, "engines": { - "node": ">=18.0.0" + "node": "^12.20 || >=14.13" } }, "node_modules/@stylistic/eslint-plugin": { @@ -8688,6 +10462,16 @@ "@types/ssh2": "*" } }, + "node_modules/@types/es-aggregate-error": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/es-aggregate-error/-/es-aggregate-error-1.0.6.tgz", + "integrity": "sha512-qJ7LIFp06h1QE1aVxbVd+zJP2wdaugYXYfd6JxsyRMrYHaxb6itXPogW2tz+ylUJ1n1b+JF1PHyYCfYHm0dvUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/estree": { "version": "1.0.8", "dev": true, @@ -8908,7 +10692,6 @@ }, "node_modules/@types/json-schema": { "version": "7.0.15", - "dev": true, "license": "MIT" }, "node_modules/@types/json5": { @@ -8916,6 +10699,13 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/markdown-escape": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@types/markdown-escape/-/markdown-escape-1.1.3.tgz", + "integrity": "sha512-JIc1+s3y5ujKnt/+N+wq6s/QdL2qZ11fP79MijrVXsAAnzSxCbT2j/3prHRouJdZ2yFLN3vkP0HytfnoCczjOw==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/node": { "version": "24.2.1", "dev": true, @@ -8924,6 +10714,13 @@ "undici-types": "~7.10.0" } }, + "node_modules/@types/sarif": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@types/sarif/-/sarif-2.1.7.tgz", + "integrity": "sha512-kRz0VEkJqWLf1LLVN4pT1cg1Z9wAuvI6L97V3m2f5B76Tg8d413ddvLBPTEHAZJlnn4XSvu0FkZtViCQGVyrXQ==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/ssh2": { "version": "1.15.5", "dev": true, @@ -8974,6 +10771,13 @@ "license": "MIT", "optional": true }, + "node_modules/@types/urijs": { + "version": "1.19.26", + "resolved": "https://registry.npmjs.org/@types/urijs/-/urijs-1.19.26.tgz", + "integrity": "sha512-wkXrVzX5yoqLnndOwFsieJA7oKM8cNkOKJtf/3vVGSUFkWDKZvFHpIl9Pvqb/T9UsawBBFMTTD8xu7sK5MWuvg==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/uuid": { "version": "9.0.8", "license": "MIT" @@ -8992,15 +10796,17 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.46.2", + "version": "8.46.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.46.3.tgz", + "integrity": "sha512-sbaQ27XBUopBkRiuY/P9sWGOWUW4rl8fDoHIUmLpZd8uldsTyB4/Zg6bWTegPoTLnKj9Hqgn3QD6cjPNB32Odw==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.46.2", - "@typescript-eslint/type-utils": "8.46.2", - "@typescript-eslint/utils": "8.46.2", - "@typescript-eslint/visitor-keys": "8.46.2", + "@typescript-eslint/scope-manager": "8.46.3", + "@typescript-eslint/type-utils": "8.46.3", + "@typescript-eslint/utils": "8.46.3", + "@typescript-eslint/visitor-keys": "8.46.3", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", @@ -9014,20 +10820,22 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.46.2", + "@typescript-eslint/parser": "^8.46.3", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/parser": { - "version": "8.46.2", + "version": "8.46.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.46.3.tgz", + "integrity": "sha512-6m1I5RmHBGTnUGS113G04DMu3CpSdxCAU/UvtjNWL4Nuf3MW9tQhiJqRlHzChIkhy6kZSAQmc+I1bcGjE3yNKg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.46.2", - "@typescript-eslint/types": "8.46.2", - "@typescript-eslint/typescript-estree": "8.46.2", - "@typescript-eslint/visitor-keys": "8.46.2", + "@typescript-eslint/scope-manager": "8.46.3", + "@typescript-eslint/types": "8.46.3", + "@typescript-eslint/typescript-estree": "8.46.3", + "@typescript-eslint/visitor-keys": "8.46.3", "debug": "^4.3.4" }, "engines": { @@ -9043,12 +10851,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.46.2", + "version": "8.46.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.46.3.tgz", + "integrity": "sha512-Fz8yFXsp2wDFeUElO88S9n4w1I4CWDTXDqDr9gYvZgUpwXQqmZBr9+NTTql5R3J7+hrJZPdpiWaB9VNhAKYLuQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.46.2", - "@typescript-eslint/types": "^8.46.2", + "@typescript-eslint/tsconfig-utils": "^8.46.3", + "@typescript-eslint/types": "^8.46.3", "debug": "^4.3.4" }, "engines": { @@ -9063,12 +10873,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.46.2", + "version": "8.46.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.46.3.tgz", + "integrity": "sha512-FCi7Y1zgrmxp3DfWfr+3m9ansUUFoy8dkEdeQSgA9gbm8DaHYvZCdkFRQrtKiedFf3Ha6VmoqoAaP68+i+22kg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.46.2", - "@typescript-eslint/visitor-keys": "8.46.2" + "@typescript-eslint/types": "8.46.3", + "@typescript-eslint/visitor-keys": "8.46.3" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -9079,7 +10891,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.46.2", + "version": "8.46.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.3.tgz", + "integrity": "sha512-GLupljMniHNIROP0zE7nCcybptolcH8QZfXOpCfhQDAdwJ/ZTlcaBOYebSOZotpti/3HrHSw7D3PZm75gYFsOA==", "dev": true, "license": "MIT", "engines": { @@ -9094,13 +10908,15 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.46.2", + "version": "8.46.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.46.3.tgz", + "integrity": "sha512-ZPCADbr+qfz3aiTTYNNkCbUt+cjNwI/5McyANNrFBpVxPt7GqpEYz5ZfdwuFyGUnJ9FdDXbGODUu6iRCI6XRXw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.46.2", - "@typescript-eslint/typescript-estree": "8.46.2", - "@typescript-eslint/utils": "8.46.2", + "@typescript-eslint/types": "8.46.3", + "@typescript-eslint/typescript-estree": "8.46.3", + "@typescript-eslint/utils": "8.46.3", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, @@ -9117,7 +10933,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.46.2", + "version": "8.46.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.46.3.tgz", + "integrity": "sha512-G7Ok9WN/ggW7e/tOf8TQYMaxgID3Iujn231hfi0Pc7ZheztIJVpO44ekY00b7akqc6nZcvregk0Jpah3kep6hA==", "dev": true, "license": "MIT", "engines": { @@ -9129,14 +10947,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.46.2", + "version": "8.46.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.3.tgz", + "integrity": "sha512-f/NvtRjOm80BtNM5OQtlaBdM5BRFUv7gf381j9wygDNL+qOYSNOgtQ/DCndiYi80iIOv76QqaTmp4fa9hwI0OA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.46.2", - "@typescript-eslint/tsconfig-utils": "8.46.2", - "@typescript-eslint/types": "8.46.2", - "@typescript-eslint/visitor-keys": "8.46.2", + "@typescript-eslint/project-service": "8.46.3", + "@typescript-eslint/tsconfig-utils": "8.46.3", + "@typescript-eslint/types": "8.46.3", + "@typescript-eslint/visitor-keys": "8.46.3", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -9157,6 +10977,8 @@ }, "node_modules/@typescript-eslint/typescript-estree/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": { @@ -9170,14 +10992,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.46.2", + "version": "8.46.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.46.3.tgz", + "integrity": "sha512-VXw7qmdkucEx9WkmR3ld/u6VhRyKeiF1uxWwCy/iuNfokjJ7VhsgLSOTjsol8BunSw190zABzpwdNsze2Kpo4g==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.46.2", - "@typescript-eslint/types": "8.46.2", - "@typescript-eslint/typescript-estree": "8.46.2" + "@typescript-eslint/scope-manager": "8.46.3", + "@typescript-eslint/types": "8.46.3", + "@typescript-eslint/typescript-estree": "8.46.3" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -9192,11 +11016,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.46.2", + "version": "8.46.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.3.tgz", + "integrity": "sha512-uk574k8IU0rOF/AjniX8qbLSGURJVUCeM5e4MIMKBFFi8weeiLrG1fyQejyLXQpRZbU/1BuQasleV/RfHC3hHg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.46.2", + "@typescript-eslint/types": "8.46.3", "eslint-visitor-keys": "^4.2.1" }, "engines": { @@ -9209,6 +11035,8 @@ }, "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", "dev": true, "license": "Apache-2.0", "engines": { @@ -9220,7 +11048,6 @@ }, "node_modules/@ungap/structured-clone": { "version": "1.3.0", - "dev": true, "license": "ISC" }, "node_modules/@unrs/resolver-binding-linux-x64-gnu": { @@ -9304,14 +11131,97 @@ "version": "8.17.1", "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-draft-04": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz", + "integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ajv": "^8.5.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-errors": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-3.0.0.tgz", + "integrity": "sha512-V3wD15YHfHz6y0KdhYFjyy9vWtEVALT9UrxfN3zqlI6dMioHnJrqOYfyPKol3oqrnCM9uwkcdCwkJ0WUcbLMTQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ajv": "^8.0.1" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/allure-commandline": { + "version": "2.34.1", + "resolved": "https://registry.npmjs.org/allure-commandline/-/allure-commandline-2.34.1.tgz", + "integrity": "sha512-l42csZ2bz7FdtJI1t5zA3IXtOZ0YJaP/+JMRC9gt6aBHRVUIu+6r+3F7KRyshQ79osLz9/MHlGqAjBPRqH0QFw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "allure": "bin/allure" + } + }, + "node_modules/allure-js-commons": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/allure-js-commons/-/allure-js-commons-3.4.2.tgz", + "integrity": "sha512-bWzqduvU/LzSTI4wJKzWbHWe64xluF30pDxFfSP+jlloQx9F1Vytdqrit5oAgNj+czzdA+Nocv3Dh6d4COCTvA==", + "license": "Apache-2.0", + "dependencies": { + "md5": "^2.3.0" + }, + "peerDependencies": { + "allure-playwright": "3.4.2" + }, + "peerDependenciesMeta": { + "allure-playwright": { + "optional": true + } + } + }, + "node_modules/allure-playwright": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/allure-playwright/-/allure-playwright-3.4.2.tgz", + "integrity": "sha512-M2addk0XCD5mJW9GyuJ37lddxhQw9oqff+Z3hN8D4u73pJqKYOEkL4JwYbc9CPRq0l1OrakmMoJ+CtVF4ifaTg==", + "devOptional": true, + "license": "Apache-2.0", + "dependencies": { + "allure-js-commons": "3.4.2" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "peerDependencies": { + "@playwright/test": ">=1.53.0" } }, "node_modules/ansi-align": { @@ -9730,6 +11640,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/as-table": { + "version": "1.0.55", + "resolved": "https://registry.npmjs.org/as-table/-/as-table-1.0.55.tgz", + "integrity": "sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "printable-characters": "^1.0.42" + } + }, "node_modules/asn1": { "version": "0.2.6", "dev": true, @@ -9754,6 +11674,16 @@ "dev": true, "license": "MIT" }, + "node_modules/astring": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz", + "integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==", + "dev": true, + "license": "MIT", + "bin": { + "astring": "bin/astring" + } + }, "node_modules/async": { "version": "3.2.6", "dev": true, @@ -10305,6 +12235,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/builtins": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", + "integrity": "sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==", + "dev": true, + "license": "MIT" + }, "node_modules/bundle-name": { "version": "4.1.0", "dev": true, @@ -10471,6 +12408,15 @@ "dev": true, "license": "MIT" }, + "node_modules/charenc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", + "license": "BSD-3-Clause", + "engines": { + "node": "*" + } + }, "node_modules/chokidar": { "version": "3.6.0", "dev": true, @@ -10699,6 +12645,13 @@ "node": ">= 12.0.0" } }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true, + "license": "MIT" + }, "node_modules/compare-versions": { "version": "6.1.1", "dev": true, @@ -11744,6 +13697,15 @@ "node": ">= 8" } }, + "node_modules/crypt": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", + "license": "BSD-3-Clause", + "engines": { + "node": "*" + } + }, "node_modules/css-color-keywords": { "version": "1.0.0", "dev": true, @@ -12019,6 +13981,16 @@ "node": ">=0.4.0" } }, + "node_modules/dependency-graph": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", + "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, "node_modules/detect-newline": { "version": "3.1.0", "dev": true, @@ -12365,6 +14337,29 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es-aggregate-error": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/es-aggregate-error/-/es-aggregate-error-1.0.14.tgz", + "integrity": "sha512-3YxX6rVb07B5TV11AV5wsL7nQCHXNwoHPsQC8S4AmBiqYhyNCJ5BRKXkXyDJvs8QzXN20NgRtxe3dEEQD9NLHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "globalthis": "^1.0.4", + "has-property-descriptors": "^1.0.2", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/es-define-property": { "version": "1.0.1", "dev": true, @@ -13452,6 +15447,13 @@ "node": ">=4.0" } }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true, + "license": "MIT" + }, "node_modules/esutils": { "version": "2.0.3", "dev": true, @@ -13575,6 +15577,13 @@ "dev": true, "license": "MIT" }, + "node_modules/fast-memoize": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/fast-memoize/-/fast-memoize-2.5.2.tgz", + "integrity": "sha512-Ue0LwpDYErFbmNnZSF0UH6eImUwDmogUO1jyE+JbN2gsQz/jICm1Ve7t9QT0rNSsfJt+Hs4/S3GnsDVjL4HVrw==", + "dev": true, + "license": "MIT" + }, "node_modules/fast-redact": { "version": "3.5.0", "license": "MIT", @@ -13963,6 +15972,24 @@ "node": ">= 0.4" } }, + "node_modules/get-source": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/get-source/-/get-source-2.0.12.tgz", + "integrity": "sha512-X5+4+iD+HoSeEED+uwrQ07BOQr0kEDFMVqqpBuI+RaZBpBpHCuXxo70bjar6f0b0u/DQJsJ7ssurpP0V60Az+w==", + "dev": true, + "license": "Unlicense", + "dependencies": { + "data-uri-to-buffer": "^2.0.0", + "source-map": "^0.6.1" + } + }, + "node_modules/get-source/node_modules/data-uri-to-buffer": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-2.0.2.tgz", + "integrity": "sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==", + "dev": true, + "license": "MIT" + }, "node_modules/get-stream": { "version": "6.0.1", "license": "MIT", @@ -14206,6 +16233,16 @@ "node": ">= 0.4" } }, + "node_modules/hpagent": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/hpagent/-/hpagent-1.2.0.tgz", + "integrity": "sha512-A91dYTeIB6NoXG+PxTQpCCDDnfHsW9kc06Lvpu1TEe9gnd6ZFeiBoRO9JvzEv6xK7EX97/dUE8g/vBMTqTS3CA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, "node_modules/html-encoding-sniffer": { "version": "4.0.0", "dev": true, @@ -14314,6 +16351,17 @@ "node": ">= 4" } }, + "node_modules/immer": { + "version": "9.0.21", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", + "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, "node_modules/import-fresh": { "version": "3.3.1", "dev": true, @@ -14520,6 +16568,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "license": "MIT" + }, "node_modules/is-builtin-module": { "version": "5.0.0", "dev": true, @@ -14773,6 +16827,16 @@ "dev": true, "license": "MIT" }, + "node_modules/is-reference": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", + "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, "node_modules/is-regex": { "version": "1.2.1", "dev": true, @@ -17983,7 +20047,6 @@ }, "node_modules/lodash": { "version": "4.17.21", - "dev": true, "license": "MIT" }, "node_modules/lodash.camelcase": { @@ -18001,6 +20064,13 @@ "dev": true, "license": "MIT" }, + "node_modules/lodash.topath": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/lodash.topath/-/lodash.topath-4.5.2.tgz", + "integrity": "sha512-1/W4dM+35DwvE/iEd1M9ekewOSTlpFekhw9mhAtrwjVqUr83/ilQiyAvmg4tVX7Unkcfl1KC+i9WdaT4B6aQcg==", + "dev": true, + "license": "MIT" + }, "node_modules/log-symbols": { "version": "4.1.0", "dev": true, @@ -18045,6 +20115,16 @@ "dev": true, "license": "MIT" }, + "node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "sourcemap-codec": "^1.4.8" + } + }, "node_modules/make-dir": { "version": "4.0.0", "dev": true, @@ -18077,6 +20157,13 @@ "dev": true, "license": "MIT" }, + "node_modules/markdown-escape": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/markdown-escape/-/markdown-escape-2.0.0.tgz", + "integrity": "sha512-Trz4v0+XWlwy68LJIyw3bLbsJiC8XAbRCKF9DbEtZjyndKOGVx6n+wNB0VfoRmY2LKboQLeniap3xrb6LGSJ8A==", + "dev": true, + "license": "MIT" + }, "node_modules/marked": { "version": "4.3.0", "dev": true, @@ -18096,6 +20183,17 @@ "node": ">= 0.4" } }, + "node_modules/md5": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", + "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", + "license": "BSD-3-Clause", + "dependencies": { + "charenc": "0.0.2", + "crypt": "0.0.2", + "is-buffer": "~1.1.6" + } + }, "node_modules/merge-stream": { "version": "2.0.0", "license": "MIT" @@ -18334,6 +20432,10 @@ "resolved": "lambdas/api-handler", "link": true }, + "node_modules/nhs-notify-supplier-api-tests": { + "resolved": "tests", + "link": true + }, "node_modules/nhs-notify-supplier-authorizer": { "resolved": "lambdas/authorizer", "link": true @@ -18345,6 +20447,26 @@ "node": ">=20.0.0" } }, + "node_modules/nimma": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/nimma/-/nimma-0.2.3.tgz", + "integrity": "sha512-1ZOI8J+1PKKGceo/5CT5GfQOG6H8I2BencSK06YarZ2wXwH37BSSUWldqJmMJYA5JfqDqffxDXynt6f11AyKcA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsep-plugin/regex": "^1.0.1", + "@jsep-plugin/ternary": "^1.0.2", + "astring": "^1.8.1", + "jsep": "^1.2.0" + }, + "engines": { + "node": "^12.20 || >=14.13" + }, + "optionalDependencies": { + "jsonpath-plus": "^6.0.1 || ^10.1.0", + "lodash.topath": "^4.5.2" + } + }, "node_modules/node-fetch": { "version": "2.7.0", "dev": true, @@ -18412,6 +20534,35 @@ "dev": true, "license": "MIT" }, + "node_modules/node-sarif-builder": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/node-sarif-builder/-/node-sarif-builder-2.0.3.tgz", + "integrity": "sha512-Pzr3rol8fvhG/oJjIq2NTVB0vmdNNlz22FENhhPojYRZ4/ee08CfK4YuKmuL54V9MLhI1kpzxfOJ/63LzmZzDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/sarif": "^2.1.4", + "fs-extra": "^10.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/node-sarif-builder/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/normalize-path": { "version": "3.0.0", "dev": true, @@ -19157,6 +21308,16 @@ "node": ">=10" } }, + "node_modules/pony-cause": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pony-cause/-/pony-cause-1.1.1.tgz", + "integrity": "sha512-PxkIc/2ZpLiEzQXu5YRDOUgBlfGYBY8156HY5ZcRAwwonMk5W/MrJP2LLkG/hF7GEQzaHo2aS7ho6ZLCOvf+6g==", + "dev": true, + "license": "0BSD", + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/possible-typed-array-names": { "version": "1.1.0", "dev": true, @@ -19255,6 +21416,13 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/printable-characters": { + "version": "1.0.42", + "resolved": "https://registry.npmjs.org/printable-characters/-/printable-characters-1.0.42.tgz", + "integrity": "sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==", + "dev": true, + "license": "Unlicense" + }, "node_modules/prismjs": { "version": "1.30.0", "dev": true, @@ -19731,6 +21899,15 @@ "node": ">=0.10.0" } }, + "node_modules/reserved": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/reserved/-/reserved-0.1.2.tgz", + "integrity": "sha512-/qO54MWj5L8WCBP9/UNe2iefJc+L9yETbH32xO/ft/EYPOTCR5k+azvDUgdCOKwZH8hXwPd0b8XBL78Nn2U69g==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, "node_modules/resolve": { "version": "1.22.10", "dev": true, @@ -19827,6 +22004,22 @@ "node": ">=0.10.0" } }, + "node_modules/rollup": { + "version": "2.79.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz", + "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==", + "dev": true, + "license": "MIT", + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=10.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, "node_modules/rrweb-cssom": { "version": "0.8.0", "dev": true, @@ -20308,6 +22501,19 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/simple-eval": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-eval/-/simple-eval-1.0.1.tgz", + "integrity": "sha512-LH7FpTAkeD+y5xQC4fzS+tFtaNlvt3Ib1zKzvhjv/Y+cioV4zIuw4IZr2yhRLu67CWL7FR9/6KXKnjRoZTvGGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "jsep": "^1.3.6" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/simple-websocket": { "version": "9.1.0", "dev": true, @@ -20442,6 +22648,14 @@ "source-map": "^0.6.0" } }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "deprecated": "Please use @jridgewell/sourcemap-codec instead", + "dev": true, + "license": "MIT" + }, "node_modules/split-ca": { "version": "1.0.1", "dev": true, @@ -20525,6 +22739,17 @@ "node": ">=8" } }, + "node_modules/stacktracey": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/stacktracey/-/stacktracey-2.1.8.tgz", + "integrity": "sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==", + "dev": true, + "license": "Unlicense", + "dependencies": { + "as-table": "^1.0.36", + "get-source": "^2.0.12" + } + }, "node_modules/stickyfill": { "version": "1.1.1", "dev": true @@ -21029,6 +23254,13 @@ "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, + "license": "MIT" + }, "node_modules/thread-stream": { "version": "3.1.0", "license": "MIT", @@ -21476,6 +23708,30 @@ "node": ">=14.17" } }, + "node_modules/typescript-eslint": { + "version": "8.46.3", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.46.3.tgz", + "integrity": "sha512-bAfgMavTuGo+8n6/QQDVQz4tZ4f7Soqg53RbrlZQEoAltYop/XR4RAts/I0BrO3TTClTSTFJ0wYbla+P8cEWJA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.46.3", + "@typescript-eslint/parser": "8.46.3", + "@typescript-eslint/typescript-estree": "8.46.3", + "@typescript-eslint/utils": "8.46.3" + }, + "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 <6.0.0" + } + }, "node_modules/uglify-js": { "version": "3.19.3", "dev": true, @@ -21630,6 +23886,13 @@ "dev": true, "license": "MIT" }, + "node_modules/urijs": { + "version": "1.19.11", + "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.11.tgz", + "integrity": "sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ==", + "dev": true, + "license": "MIT" + }, "node_modules/url-template": { "version": "2.0.8", "dev": true, @@ -21648,6 +23911,16 @@ "dev": true, "license": "MIT" }, + "node_modules/utility-types": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz", + "integrity": "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, "node_modules/uuid": { "version": "9.0.1", "funding": [ @@ -21677,6 +23950,16 @@ "node": ">=10.12.0" } }, + "node_modules/validate-npm-package-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", + "integrity": "sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==", + "dev": true, + "license": "ISC", + "dependencies": { + "builtins": "^1.0.3" + } + }, "node_modules/vary": { "version": "1.1.2", "license": "MIT", @@ -23105,6 +25388,60 @@ "engines": { "node": ">=12" } + }, + "tests": { + "name": "nhs-notify-supplier-api-tests", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "@aws-sdk/client-api-gateway": "^3.906.0", + "@aws-sdk/client-dynamodb": "^3.858.0", + "@aws-sdk/lib-dynamodb": "^3.858.0", + "allure-js-commons": "^3.3.3", + "charenc": "^0.0.2", + "crypt": "^0.0.2", + "dotenv": "^17.2.2", + "is-buffer": "^1.1.6", + "md5": "^2.3.0", + "openapi-response-validator": "^12.1.3", + "playwright": "^1.54.2", + "playwright-core": "^1.54.2", + "undici-types": "^7.10.0" + }, + "devDependencies": { + "@playwright/test": "^1.55.1", + "@types/node": "^24.3.1", + "allure-commandline": "^2.34.1", + "allure-playwright": "^3.3.3" + } + }, + "tests/node_modules/@types/node": { + "version": "24.10.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.0.tgz", + "integrity": "sha512-qzQZRBqkFsYyaSWXuEHc2WR9c0a0CXwiE5FWUvn7ZM+vdy1uZLfCunD38UzhuB7YN/J11ndbDBcTmOdxJo9Q7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "tests/node_modules/dotenv": { + "version": "17.2.3", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.3.tgz", + "integrity": "sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "tests/node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "license": "MIT" } } } diff --git a/package.json b/package.json index 0453cc74..4a7bbd11 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,8 @@ "ts-jest": "^29.4.0", "ts-node": "^10.9.2", "tsx": "^4.20.6", - "typescript": "^5.8.3" + "typescript": "^5.8.3", + "typescript-eslint": "^8.27.0" }, "name": "nhs-notify-supplier-api", "overrides": { @@ -80,6 +81,7 @@ "lambdas/*", "internal/*", "scripts/test-data", - "docs" + "docs", + "tests" ] } diff --git a/scripts/config/pre-commit.yaml b/scripts/config/pre-commit.yaml index 1a8a5313..85bce309 100644 --- a/scripts/config/pre-commit.yaml +++ b/scripts/config/pre-commit.yaml @@ -9,6 +9,10 @@ repos: - id: check-symlinks - id: detect-private-key - id: end-of-file-fixer + exclude: | + (?x)^( + internal/events/.*/.*\.schema\.json + )$ - id: forbid-new-submodules - id: mixed-line-ending - id: pretty-format-json @@ -18,7 +22,8 @@ repos: package(-lock)?\.json$ | sdk/.* | someotherdir/.* | - src/server/host/Properties/launchSettings.json + src/server/host/Properties/launchSettings.json | + internal/events/.*/.*\.schema\.json )$ # - id: ... diff --git a/scripts/is_valid_increment.sh b/scripts/is_valid_increment.sh new file mode 100644 index 00000000..682f6cec --- /dev/null +++ b/scripts/is_valid_increment.sh @@ -0,0 +1,28 @@ +#!/usr/bin/bash +# Determines whether a version increment to a package is valid + +is_valid_increment() { + local current="$1" + local next="$2" + + if [[ "$current" == "null" ]]; then + if [[ "$next" == "1.0.0" ]]; then + return 0 # valid initial version + else + return 1 # invalid first version + fi + fi + + IFS='.' read -r curr_major curr_minor curr_patch <<< "$current" + IFS='.' read -r new_major new_minor new_patch <<< "$next" + + if (( new_major == curr_major && new_minor == curr_minor && new_patch == curr_patch + 1 )); then + return 0 # valid patch bump + elif (( new_major == curr_major && new_minor == curr_minor + 1 && new_patch == 0 )); then + return 0 # valid minor bump + elif (( new_major == curr_major + 1 && new_minor == 0 && new_patch == 0 )); then + return 0 # valid major bump + else + return 1 # invalid or skipped + fi +} diff --git a/tests/package.json b/tests/package.json index 78743234..338404e4 100644 --- a/tests/package.json +++ b/tests/package.json @@ -29,7 +29,8 @@ "scripts": { "clean": "rimraf $(pwd)/target", "test:component": "playwright test --config=config/main.config.ts --max-failures=10 --project=component-tests", - "test:sandbox": "playwright test --config=config/sandbox.config.ts --max-failures=10 --project=sandbox" + "test:sandbox": "playwright test --config=config/sandbox.config.ts --max-failures=10 --project=sandbox", + "test:unit": "echo \"No unit tests for tests package\"" }, "version": "1.0.0" }