diff --git a/.chronus/changes/another-branch-2025-0-24-3-4-49.md b/.chronus/changes/another-branch-2025-0-24-3-4-49.md new file mode 100644 index 0000000000..04d79dbe6a --- /dev/null +++ b/.chronus/changes/another-branch-2025-0-24-3-4-49.md @@ -0,0 +1,33 @@ +--- +# Change versionKind to one of: internal, fix, dependencies, feature, deprecation, breaking +changeKind: internal +packages: + - "@typespec/bundler" + - "@typespec/compiler" + - "@typespec/eslint-plugin" + - "@typespec/events" + - "@typespec/html-program-viewer" + - "@typespec/http-server-javascript" + - "@typespec/http-specs" + - "@typespec/http" + - "@typespec/internal-build-utils" + - "@typespec/json-schema" + - "@typespec/library-linter" + - "@typespec/openapi" + - "@typespec/openapi3" + - "@typespec/playground" + - "@typespec/prettier-plugin-typespec" + - "@typespec/protobuf" + - "@typespec/rest" + - "@typespec/spec-api" + - "@typespec/spec-coverage-sdk" + - "@typespec/spector" + - "@typespec/sse" + - "@typespec/streams" + - tmlanguage-generator + - typespec-vscode + - "@typespec/versioning" + - "@typespec/xml" +--- + +Upgrade playwright dev dependency diff --git a/.chronus/changes/feature-dashboard-website-2025-0-25-0-53-59.md b/.chronus/changes/feature-dashboard-website-2025-0-25-0-53-59.md new file mode 100644 index 0000000000..79aca8ff59 --- /dev/null +++ b/.chronus/changes/feature-dashboard-website-2025-0-25-0-53-59.md @@ -0,0 +1,8 @@ +--- +# Change versionKind to one of: internal, fix, dependencies, feature, deprecation, breaking +changeKind: fix +packages: + - "@typespec/spec-coverage-sdk" +--- + +Fix invalid type with coverage report diff --git a/.chronus/changes/feature-experimental-http-typekit-2024-11-11-17-37-15.md b/.chronus/changes/feature-experimental-http-typekit-2024-11-11-17-37-15.md new file mode 100644 index 0000000000..af79dcc3c3 --- /dev/null +++ b/.chronus/changes/feature-experimental-http-typekit-2024-11-11-17-37-15.md @@ -0,0 +1,8 @@ +--- +changeKind: feature +packages: + - "@typespec/compiler" + - "@typespec/http" +--- + +Add Experimental Typekit helpers for @typespec/http diff --git a/.chronus/changes/fix-csharp-server-noresponse-2025-0-15-10-37-0.md b/.chronus/changes/fix-csharp-server-noresponse-2025-0-15-10-37-0.md deleted file mode 100644 index 84c7e8e90b..0000000000 --- a/.chronus/changes/fix-csharp-server-noresponse-2025-0-15-10-37-0.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -changeKind: fix -packages: - - "@typespec/http-server-csharp" ---- - -Fixes controller generation with incorrect return when NoContent is in the spec \ No newline at end of file diff --git a/.chronus/changes/fix-namespace-new-2025-0-24-16-11-9.md b/.chronus/changes/fix-namespace-new-2025-0-24-16-11-9.md new file mode 100644 index 0000000000..35ffdd6fc9 --- /dev/null +++ b/.chronus/changes/fix-namespace-new-2025-0-24-16-11-9.md @@ -0,0 +1,7 @@ +--- +changeKind: fix +packages: + - "@typespec/http-client-python" +--- + +Fix output folder of models when output folder is different with namespace in configuration \ No newline at end of file diff --git a/.chronus/changes/fix_builtinTemplate-2025-0-24-1-37-7.md b/.chronus/changes/fix_builtinTemplate-2025-0-24-1-37-7.md new file mode 100644 index 0000000000..4a1d46d3a3 --- /dev/null +++ b/.chronus/changes/fix_builtinTemplate-2025-0-24-1-37-7.md @@ -0,0 +1,7 @@ +--- +changeKind: internal +packages: + - "@typespec/compiler" +--- + +Adjust built-in init template sample \ No newline at end of file diff --git a/.chronus/changes/fix_builtinTemplate-2025-0-24-21-57-49.md b/.chronus/changes/fix_builtinTemplate-2025-0-24-21-57-49.md new file mode 100644 index 0000000000..279691e4a4 --- /dev/null +++ b/.chronus/changes/fix_builtinTemplate-2025-0-24-21-57-49.md @@ -0,0 +1,8 @@ +--- +# Change versionKind to one of: internal, fix, dependencies, feature, deprecation, breaking +changeKind: internal +packages: + - typespec-vscode +--- + +update test framework version diff --git a/.chronus/changes/fix_serverJSInitTemplate-2025-0-24-16-22-25.md b/.chronus/changes/fix_serverJSInitTemplate-2025-0-24-16-22-25.md new file mode 100644 index 0000000000..edaaa65b40 --- /dev/null +++ b/.chronus/changes/fix_serverJSInitTemplate-2025-0-24-16-22-25.md @@ -0,0 +1,7 @@ +--- +changeKind: internal +packages: + - "@typespec/compiler" +--- + +Fixing package name for JavaScript service codegen emitter diff --git a/.chronus/changes/improvements-for-the-intellisense-of-tspconfig.yaml-2024-11-19-2-35-1.md b/.chronus/changes/improvements-for-the-intellisense-of-tspconfig.yaml-2024-11-19-2-35-1.md new file mode 100644 index 0000000000..c56fc8eea3 --- /dev/null +++ b/.chronus/changes/improvements-for-the-intellisense-of-tspconfig.yaml-2024-11-19-2-35-1.md @@ -0,0 +1,8 @@ +--- +# Change versionKind to one of: internal, fix, dependencies, feature, deprecation, breaking +changeKind: feature +packages: + - "@typespec/compiler" +--- + +Support the auto completion for extends, imports, rule, rule sets and variables in tspconfig.yaml diff --git a/.chronus/changes/improvements-for-the-intellisense-of-tspconfig.yaml-2024-11-19-2-35-2.md b/.chronus/changes/improvements-for-the-intellisense-of-tspconfig.yaml-2024-11-19-2-35-2.md new file mode 100644 index 0000000000..04d558cae3 --- /dev/null +++ b/.chronus/changes/improvements-for-the-intellisense-of-tspconfig.yaml-2024-11-19-2-35-2.md @@ -0,0 +1,9 @@ +--- +# Change versionKind to one of: internal, fix, dependencies, feature, deprecation, breaking +changeKind: fix +packages: + - "@typespec/compiler" +--- + +Fix bug in tspconfig.yaml +- Fix the issue that extra " will be added when auto completing emitter options inside "" diff --git a/.chronus/changes/improvements-for-the-intellisense-of-tspconfig.yaml-2024-11-19-2-35-3.md b/.chronus/changes/improvements-for-the-intellisense-of-tspconfig.yaml-2024-11-19-2-35-3.md new file mode 100644 index 0000000000..2f26da0ab7 --- /dev/null +++ b/.chronus/changes/improvements-for-the-intellisense-of-tspconfig.yaml-2024-11-19-2-35-3.md @@ -0,0 +1,8 @@ +--- +# Change versionKind to one of: internal, fix, dependencies, feature, deprecation, breaking +changeKind: feature +packages: + - "@typespec/compiler" +--- + +Show required/optional information in the details of emitter's options completion item in tspconfig.yaml diff --git a/.chronus/changes/promote-state-accessor-2025-0-23-9-50-42.md b/.chronus/changes/promote-state-accessor-2025-0-23-9-50-42.md new file mode 100644 index 0000000000..ec051145e7 --- /dev/null +++ b/.chronus/changes/promote-state-accessor-2025-0-23-9-50-42.md @@ -0,0 +1,12 @@ +--- +changeKind: deprecation +packages: + - "@typespec/compiler" + - "@typespec/events" + - "@typespec/json-schema" + - "@typespec/openapi" + - "@typespec/sse" + - "@typespec/streams" +--- + +Deprecate `unsafe_useStateMap` and `unsafe_useStateSet`, export `useStateMap` and `useStateSet` \ No newline at end of file diff --git a/.chronus/changes/python-prepareRelease-2025-0-24-11-0-41.md b/.chronus/changes/python-prepareRelease-2025-0-24-11-0-41.md new file mode 100644 index 0000000000..680bbdda77 --- /dev/null +++ b/.chronus/changes/python-prepareRelease-2025-0-24-11-0-41.md @@ -0,0 +1,7 @@ +--- +changeKind: internal +packages: + - "@typespec/http-client-python" +--- + +Bump version 0.6.8 \ No newline at end of file diff --git a/.chronus/changes/refineLog-2025-0-24-9-48-43.md b/.chronus/changes/refineLog-2025-0-24-9-48-43.md new file mode 100644 index 0000000000..e77f35e821 --- /dev/null +++ b/.chronus/changes/refineLog-2025-0-24-9-48-43.md @@ -0,0 +1,7 @@ +--- +changeKind: internal +packages: + - typespec-vscode +--- + +refine the log \ No newline at end of file diff --git a/.chronus/changes/steverice-createStateSymbol-util-2025-0-25-10-46-13.md b/.chronus/changes/steverice-createStateSymbol-util-2025-0-25-10-46-13.md new file mode 100644 index 0000000000..44843e83f4 --- /dev/null +++ b/.chronus/changes/steverice-createStateSymbol-util-2025-0-25-10-46-13.md @@ -0,0 +1,7 @@ +--- +changeKind: internal +packages: + - "@typespec/compiler" +--- + +Make `createStateSymbol` a common utility function for `@typespec/compiler` \ No newline at end of file diff --git a/.chronus/changes/upgrade-deps-jan-2025-2025-0-21-23-21-7.md b/.chronus/changes/upgrade-deps-jan-2025-2025-0-21-23-21-7.md index fa7bc51d5b..8c0e82a873 100644 --- a/.chronus/changes/upgrade-deps-jan-2025-2025-0-21-23-21-7.md +++ b/.chronus/changes/upgrade-deps-jan-2025-2025-0-21-23-21-7.md @@ -1,5 +1,4 @@ --- -# Change versionKind to one of: internal, fix, dependencies, feature, deprecation, breaking changeKind: dependencies packages: - "@typespec/bundler" @@ -7,7 +6,6 @@ packages: - "@typespec/eslint-plugin" - "@typespec/events" - "@typespec/html-program-viewer" - - "@typespec/http-server-csharp" - "@typespec/http-server-javascript" - "@typespec/http-specs" - "@typespec/http" @@ -31,4 +29,4 @@ packages: - "@typespec/xml" --- -Upgrade dependencies +Upgrade dependencies \ No newline at end of file diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000000..9c65144a0f --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,16 @@ +version: 2 +updates: + - package-ecosystem: "pip" + directories: + - "/packages/http-client-python/eng/" + - "/packages/http-client-python/generator/test" + - "/packages/http-client-python/generator/test/azure" + - "/packages/http-client-python/generator/test/unbranded" + schedule: + interval: "weekly" + commit-message: + prefix: "pip prod" + prefix-development: "pip dev" + include: "scope" + labels: + - "emitter:client:python" diff --git a/cspell.yaml b/cspell.yaml index d1dc2dcb0b..9ea0a385cb 100644 --- a/cspell.yaml +++ b/cspell.yaml @@ -70,7 +70,9 @@ words: - espt - ESRP - etree + - fastify - fluentui + - français - genproto - getpgid - giacamo @@ -80,8 +82,11 @@ words: - Hdvcmxk - headasbooleanfalse - headasbooleantrue + - hscs + - HSTS - imple - Infima + - initcs - inlines - inmemory - instanceid @@ -203,6 +208,7 @@ words: - ssvs - statment - strs + - swaggerui - syncpack - TCGC - timegm @@ -253,7 +259,6 @@ words: - xplat - xxsubtype - yamls - - français ignorePaths: - "**/node_modules/**" - "**/dist/**" diff --git a/eng/tsp-core/pipelines/dashboard-deploy.yml b/eng/tsp-core/pipelines/dashboard-deploy.yml deleted file mode 100644 index f915409210..0000000000 --- a/eng/tsp-core/pipelines/dashboard-deploy.yml +++ /dev/null @@ -1,44 +0,0 @@ -trigger: - branches: - include: - - main - # For patch releases - - release/* - -pr: none - -extends: - template: /eng/common/pipelines/templates/1es-redirect.yml - parameters: - variables: - - template: /eng/tsp-core/pipelines/templates/variables/globals.yml@self - - stages: - - stage: build - displayName: Build and Deploy - - pool: - name: $(WINDOWSPOOL) - image: $(WINDOWSVMIMAGE) - os: windows - - jobs: - - job: build - displayName: Build - - variables: - TYPESPEC_SKIP_DOCUSAURUS_BUILD: true # Disable docusaurus build - - steps: - - template: /eng/tsp-core/pipelines/templates/install.yml - - template: /eng/tsp-core/pipelines/templates/build.yml - - - task: AzureCLI@2 - inputs: - azureSubscription: "TypeSpec Storage" - scriptType: "bash" - scriptLocation: "inlineScript" - inlineScript: | - echo "Uploading files to Azure Blob Storage..." - az storage blob upload-batch --account-name specdashboard --source packages/spec-dashboard/dist/ --destination '$web' --overwrite - displayName: "Upload files to Azure Blob Storage" diff --git a/eng/tsp-core/pipelines/templates/install-browsers.yml b/eng/tsp-core/pipelines/templates/install-browsers.yml index 885b853557..eaa7a6470d 100644 --- a/eng/tsp-core/pipelines/templates/install-browsers.yml +++ b/eng/tsp-core/pipelines/templates/install-browsers.yml @@ -1,5 +1,4 @@ # Template installing browsers steps: - - script: npx playwright install --with-deps + - script: pnpm exec playwright install displayName: Install playwright browsers - workingDirectory: packages/playground-website diff --git a/package.json b/package.json index 21b6da4943..85eb954aa4 100644 --- a/package.json +++ b/package.json @@ -49,8 +49,8 @@ "@octokit/plugin-rest-endpoint-methods": "^13.3.0", "@pnpm/find-workspace-packages": "^6.0.9", "@types/micromatch": "^4.0.9", - "@types/node": "~22.10.7", - "@vitest/coverage-v8": "^3.0.3", + "@types/node": "~22.10.10", + "@vitest/coverage-v8": "^3.0.4", "c8": "^10.1.3", "cspell": "^8.17.2", "eslint": "^9.18.0", @@ -61,7 +61,7 @@ "eslint-plugin-vitest": "^0.5.4", "micromatch": "^4.0.8", "picocolors": "~1.1.1", - "playwright": "^1.49.1", + "playwright": "^1.50.0", "prettier": "~3.4.2", "prettier-plugin-astro": "^0.14.1", "prettier-plugin-organize-imports": "~4.1.0", @@ -70,7 +70,7 @@ "tsx": "^4.19.2", "typescript": "~5.7.3", "typescript-eslint": "^8.21.0", - "vitest": "^3.0.3", + "vitest": "^3.0.4", "yaml": "~2.7.0" }, "syncpack": { diff --git a/packages/best-practices/package.json b/packages/best-practices/package.json index 239b45d259..3c87802016 100644 --- a/packages/best-practices/package.json +++ b/packages/best-practices/package.json @@ -44,13 +44,13 @@ "@typespec/compiler": "workspace:~" }, "devDependencies": { - "@types/node": "~22.10.7", + "@types/node": "~22.10.10", "@typespec/compiler": "workspace:~", - "@vitest/coverage-v8": "^3.0.3", + "@vitest/coverage-v8": "^3.0.4", "@vitest/ui": "^3.0.3", "c8": "^10.1.3", "rimraf": "~6.0.1", "typescript": "~5.7.3", - "vitest": "^3.0.3" + "vitest": "^3.0.4" } } diff --git a/packages/bundle-uploader/package.json b/packages/bundle-uploader/package.json index c67f73ff3e..c3c2143d1a 100644 --- a/packages/bundle-uploader/package.json +++ b/packages/bundle-uploader/package.json @@ -46,13 +46,13 @@ "semver": "^7.6.3" }, "devDependencies": { - "@types/node": "~22.10.7", + "@types/node": "~22.10.10", "@types/semver": "^7.5.8", - "@vitest/coverage-v8": "^3.0.3", + "@vitest/coverage-v8": "^3.0.4", "@vitest/ui": "^3.0.3", "c8": "^10.1.3", "rimraf": "~6.0.1", "typescript": "~5.7.3", - "vitest": "^3.0.3" + "vitest": "^3.0.4" } } diff --git a/packages/bundler/package.json b/packages/bundler/package.json index 38b501f486..9418b2de2f 100644 --- a/packages/bundler/package.json +++ b/packages/bundler/package.json @@ -54,14 +54,14 @@ "yargs": "~17.7.2" }, "devDependencies": { - "@types/node": "~22.10.7", + "@types/node": "~22.10.10", "@types/yargs": "~17.0.33", - "@vitest/coverage-v8": "^3.0.3", + "@vitest/coverage-v8": "^3.0.4", "@vitest/ui": "^3.0.3", "c8": "^10.1.3", "rimraf": "~6.0.1", "typescript": "~5.7.3", "vite": "^6.0.11", - "vitest": "^3.0.3" + "vitest": "^3.0.4" } } diff --git a/packages/compiler/.scripts/build-init-templates.ts b/packages/compiler/.scripts/build-init-templates.ts index e6d4c04899..8500c4d8ae 100644 --- a/packages/compiler/.scripts/build-init-templates.ts +++ b/packages/compiler/.scripts/build-init-templates.ts @@ -39,7 +39,7 @@ const builtInTemplates: Record = { "emitter-output-dir": "{output-dir}/clients/java", }, }, - "@typespec/http-client-js": { + "@azure-tools/typespec-ts": { description: "JavaScript Client emitter", options: { "emitter-output-dir": "{output-dir}/clients/js", @@ -54,10 +54,10 @@ const builtInTemplates: Record = { "@typespec/http-server-csharp": { description: "CSharp server stubs", options: { - "emitter-output-dir": "{output-dir}/server", + "emitter-output-dir": "{output-dir}/server/generated", }, }, - "@typespec/http-server-js": { + "@typespec/http-server-javascript": { description: "Javascript server stubs", options: { "emitter-output-dir": "{output-dir}/server", diff --git a/packages/compiler/package.json b/packages/compiler/package.json index c589d26c5e..7edf6c7c29 100644 --- a/packages/compiler/package.json +++ b/packages/compiler/package.json @@ -45,6 +45,10 @@ "./experimental": { "types": "./dist/src/experimental/index.d.ts", "default": "./dist/src/experimental/index.js" + }, + "./experimental/typekit": { + "types": "./dist/src/experimental/typekit/index.d.ts", + "default": "./dist/src/experimental/typekit/index.js" } }, "browser": { @@ -105,12 +109,12 @@ "devDependencies": { "@types/babel__code-frame": "~7.0.6", "@types/mustache": "~4.2.5", - "@types/node": "~22.10.7", + "@types/node": "~22.10.10", "@types/prompts": "~2.4.9", "@types/semver": "^7.5.8", "@types/yargs": "~17.0.33", "@typespec/internal-build-utils": "workspace:~", - "@vitest/coverage-v8": "^3.0.3", + "@vitest/coverage-v8": "^3.0.4", "@vitest/ui": "^3.0.3", "c8": "^10.1.3", "grammarkdown": "~3.3.2", @@ -118,7 +122,7 @@ "source-map-support": "~0.5.21", "tmlanguage-generator": "workspace:~", "typescript": "~5.7.3", - "vitest": "^3.0.3", + "vitest": "^3.0.4", "vscode-oniguruma": "~2.0.1", "vscode-textmate": "~9.2.0" } diff --git a/packages/compiler/src/core/deprecation.ts b/packages/compiler/src/core/deprecation.ts index 8407342c9c..e8d42323cd 100644 --- a/packages/compiler/src/core/deprecation.ts +++ b/packages/compiler/src/core/deprecation.ts @@ -1,10 +1,7 @@ +import { createStateSymbol } from "../lib/utils.js"; import type { Program } from "./program.js"; import { BaseNode, Node, SyntaxKind, Type } from "./types.js"; -function createStateSymbol(name: string) { - return Symbol.for(`TypeSpec.${name}`); -} - const deprecatedKey = createStateSymbol("deprecated"); /** diff --git a/packages/compiler/src/core/intrinsic-type-state.ts b/packages/compiler/src/core/intrinsic-type-state.ts index 154dde0aa9..34fd947dc4 100644 --- a/packages/compiler/src/core/intrinsic-type-state.ts +++ b/packages/compiler/src/core/intrinsic-type-state.ts @@ -1,14 +1,11 @@ // Contains all intrinsic data setter or getter // Anything that the TypeSpec check might should be here. +import { createStateSymbol } from "../lib/utils.js"; import type { Model, Type, Union } from "./index.js"; import type { Numeric } from "./numeric.js"; import type { Program } from "./program.js"; -function createStateSymbol(name: string) { - return Symbol.for(`TypeSpec.${name}`); -} - const stateKeys = { minValues: createStateSymbol("minValues"), maxValues: createStateSymbol("maxValues"), diff --git a/packages/compiler/src/core/visibility/core.ts b/packages/compiler/src/core/visibility/core.ts index b6e88b68d3..4da55b04ac 100644 --- a/packages/compiler/src/core/visibility/core.ts +++ b/packages/compiler/src/core/visibility/core.ts @@ -29,7 +29,8 @@ import { } from "./lifecycle.js"; import type { VisibilityFilter as GeneratedVisibilityFilter } from "../../../generated-defs/TypeSpec.js"; -import { useStateMap, useStateSet } from "../../lib/utils.js"; +import { createStateSymbol } from "../../lib/utils.js"; +import { useStateMap, useStateSet } from "../../utils/index.js"; export { GeneratedVisibilityFilter }; @@ -44,7 +45,7 @@ type VisibilityModifiers = Map>; * This store is used to track the visibility modifiers */ const [getVisibilityStore, setVisibilityStore] = useStateMap( - "visibilityStore", + createStateSymbol("visibilityStore"), ); /** @@ -99,13 +100,13 @@ function getOrInitializeActiveModifierSetForClass( const VISIBILITY_PROGRAM_SEALS = new WeakSet(); const [isVisibilitySealedForProperty, sealVisibilityForProperty] = useStateSet( - "propertyVisibilitySealed", + createStateSymbol("propertyVisibilitySealed"), ); const [getSealedVisibilityClasses, setSealedVisibilityClasses] = useStateMap< ModelProperty, Set ->("sealedVisibilityClasses"); +>(createStateSymbol("sealedVisibilityClasses")); /** * Seals visibility modifiers for a property in a given visibility class. @@ -133,7 +134,7 @@ function sealVisibilityModifiersForClass( * Stores the default modifier set for a given visibility class. */ const [getDefaultModifiers, setDefaultModifiers] = useStateMap>( - "defaultVisibilityModifiers", + createStateSymbol("defaultVisibilityModifiers"), ); /** @@ -205,7 +206,7 @@ function groupModifiersByVisibilityClass(modifiers: EnumMember[]): Map("legacyVisibility"); + useStateMap(createStateSymbol("legacyVisibility")); export { getLegacyVisibility }; diff --git a/packages/compiler/src/experimental/index.ts b/packages/compiler/src/experimental/index.ts index a7b3a243e6..e6f4938564 100644 --- a/packages/compiler/src/experimental/index.ts +++ b/packages/compiler/src/experimental/index.ts @@ -1,5 +1,7 @@ export { MutableType as unsafe_MutableType, + mutateSubgraph as unsafe_mutateSubgraph, + mutateSubgraphWithNamespace as unsafe_mutateSubgraphWithNamespace, Mutator as unsafe_Mutator, MutatorFilterFn as unsafe_MutatorFilterFn, MutatorFlow as unsafe_MutatorFlow, @@ -7,9 +9,13 @@ export { MutatorRecord as unsafe_MutatorRecord, MutatorReplaceFn as unsafe_MutatorReplaceFn, MutatorWithNamespace as unsafe_MutatorWithNamespace, - mutateSubgraph as unsafe_mutateSubgraph, - mutateSubgraphWithNamespace as unsafe_mutateSubgraphWithNamespace, } from "./mutators.js"; export { Realm as unsafe_Realm } from "./realm.js"; -export { unsafe_useStateMap, unsafe_useStateSet } from "./state-accessor.js"; export { $ as unsafe_$ } from "./typekit/index.js"; + +import { useStateMap, useStateSet } from "../utils/state-accessor.js"; + +/** @deprecated use `useStateMap` from `@typespec/compiler/utils` instead */ +export const unsafe_useStateMap = useStateMap; +/** @deprecated use `useStateSet` from `@typespec/compiler/utils` instead */ +export const unsafe_useStateSet = useStateSet; diff --git a/packages/compiler/src/experimental/typekit/kits/literal.ts b/packages/compiler/src/experimental/typekit/kits/literal.ts index b0e5d7301b..ae6c5d0c38 100644 --- a/packages/compiler/src/experimental/typekit/kits/literal.ts +++ b/packages/compiler/src/experimental/typekit/kits/literal.ts @@ -3,71 +3,81 @@ import type { BooleanLiteral, NumericLiteral, StringLiteral, Type } from "../../ import { defineKit } from "../define-kit.js"; /** @experimental */ -interface LiteralKit { - literal: { - /** - * Create a literal type from a JavaScript value. - * - * @param value The JavaScript value to turn into a TypeSpec literal type. - */ - create(value: string | number | boolean): StringLiteral | NumericLiteral | BooleanLiteral; +export interface LiteralKit { + /** + * Create a literal type from a JavaScript value. + * + * @param value The JavaScript value to turn into a TypeSpec literal type. + */ + create(value: string | number | boolean): StringLiteral | NumericLiteral | BooleanLiteral; + + /** + * Create a string literal type from a JavaScript string value. + * + * @param value The string value. + */ + createString(value: string): StringLiteral; - /** - * Create a string literal type from a JavaScript string value. - * - * @param value The string value. - */ - createString(value: string): StringLiteral; + /** + * Create a numeric literal type from a JavaScript number value. + * + * @param value The numeric value. + */ + createNumeric(value: number): NumericLiteral; - /** - * Create a numeric literal type from a JavaScript number value. - * - * @param value The numeric value. - */ - createNumeric(value: number): NumericLiteral; + /** + * Create a boolean literal type from a JavaScript boolean value. + * + * @param value The boolean value. + */ + createBoolean(value: boolean): BooleanLiteral; - /** - * Create a boolean literal type from a JavaScript boolean value. - * - * @param value The boolean value. - */ - createBoolean(value: boolean): BooleanLiteral; + /** + * Check if `type` is a literal type. + * + * @param type The type to check. + */ + is(type: Type): type is StringLiteral | NumericLiteral | BooleanLiteral; - /** - * Check if `type` is a literal type. - * - * @param type The type to check. - */ - is(type: Type): type is StringLiteral | NumericLiteral | BooleanLiteral; + /** + * Check if `type` is a string literal type. + * + * @param type The type to check. + */ + isString(type: Type): type is StringLiteral; - /** - * Check if `type` is a string literal type. - * - * @param type The type to check. - */ - isString(type: Type): type is StringLiteral; + /** + * Check if `type` is a numeric literal type. + * + * @param type The type to check. + */ + isNumeric(type: Type): type is NumericLiteral; - /** - * Check if `type` is a numeric literal type. - * - * @param type The type to check. - */ - isNumeric(type: Type): type is NumericLiteral; + /** + * Check if `type` is a boolean literal type. + * + * @param type The type to check. + */ + isBoolean(type: Type): type is BooleanLiteral; +} - /** - * Check if `type` is a boolean literal type. - * - * @param type The type to check. - */ - isBoolean(type: Type): type is BooleanLiteral; - }; +interface TypekitExtension { + /** + * Utilities for working with literal types. + * + * Literal types are types that represent a single value, such as a string, + * number, or boolean. + * + * @experimental + */ + literal: LiteralKit; } declare module "../define-kit.js" { - interface Typekit extends LiteralKit {} + interface Typekit extends TypekitExtension {} } -defineKit({ +defineKit({ literal: { create(value) { if (typeof value === "string") { diff --git a/packages/compiler/src/experimental/typekit/kits/model-property.ts b/packages/compiler/src/experimental/typekit/kits/model-property.ts index 6495d8d532..a8f941b367 100644 --- a/packages/compiler/src/experimental/typekit/kits/model-property.ts +++ b/packages/compiler/src/experimental/typekit/kits/model-property.ts @@ -3,7 +3,15 @@ import { getVisibilityForClass } from "../../../core/visibility/core.js"; import { EncodeData, getEncode, getFormat } from "../../../lib/decorators.js"; import { defineKit } from "../define-kit.js"; -/** @experimental */ +/** + * @experimental + * Utilities for working with model properties. + * + * For many reflection operations, the metadata being asked for may be found + * on the model property or the type of the model property. In such cases, + * these operations will return the metadata from the model property if it + * exists, or the type of the model property if it exists. + */ export interface ModelPropertyKit { /** * Check if the given `type` is a model property. @@ -34,7 +42,7 @@ export interface ModelPropertyKit { getVisibilityForClass(property: ModelProperty, visibilityClass: Enum): Set; } -interface TypeKit { +interface TypekitExtension { /** * Utilities for working with model properties. * @@ -47,10 +55,10 @@ interface TypeKit { } declare module "../define-kit.js" { - interface Typekit extends TypeKit {} + interface Typekit extends TypekitExtension {} } -defineKit({ +defineKit({ modelProperty: { is(type) { return type.kind === "ModelProperty"; diff --git a/packages/compiler/src/experimental/typekit/kits/model.ts b/packages/compiler/src/experimental/typekit/kits/model.ts index ce7e7b62ff..990e5c3ff5 100644 --- a/packages/compiler/src/experimental/typekit/kits/model.ts +++ b/packages/compiler/src/experimental/typekit/kits/model.ts @@ -1,3 +1,4 @@ +import { getEffectiveModelType } from "../../../core/checker.js"; import type { Model, ModelProperty, SourceModel, Type } from "../../../core/types.js"; import { createRekeyableMap } from "../../../utils/misc.js"; import { defineKit } from "../define-kit.js"; @@ -32,29 +33,57 @@ interface ModelDescriptor { sourceModels?: SourceModel[]; } +/** + * Utilities for working with models. + * @experimental + */ export interface ModelKit { - model: { - /** - * Create a model type. - * - * @param desc The descriptor of the model. - */ - create(desc: ModelDescriptor): Model; + /** + * Create a model type. + * + * @param desc The descriptor of the model. + */ + create(desc: ModelDescriptor): Model; - /** - * Check if the given `type` is a model.. - * - * @param type The type to check. - */ - is(type: Type): type is Model; - }; + /** + * Check if the given `type` is a model.. + * + * @param type The type to check. + */ + is(type: Type): type is Model; + + /** + * If the input is anonymous (or the provided filter removes properties) + * and there exists a named model with the same set of properties + * (ignoring filtered properties), then return that named model. + * Otherwise, return the input unchanged. + * + * This can be used by emitters to find a better name for a set of + * properties after filtering. For example, given `{ @metadata prop: + * string} & SomeName`, and an emitter that wishes to discard properties + * marked with `@metadata`, the emitter can use this to recover that the + * best name for the remaining properties is `SomeName`. + * + * @param model The input model + * @param filter An optional filter to apply to the input model's + * properties. + */ + getEffectiveModel(model: Model, filter?: (property: ModelProperty) => boolean): Model; +} + +interface TypekitExtension { + /** + * Utilities for working with models. + * @experimental + */ + model: ModelKit; } declare module "../define-kit.js" { - interface Typekit extends ModelKit {} + interface Typekit extends TypekitExtension {} } -export const ModelKit = defineKit({ +export const ModelKit = defineKit({ model: { create(desc) { const properties = createRekeyableMap(Array.from(Object.entries(desc.properties))); @@ -76,5 +105,8 @@ export const ModelKit = defineKit({ is(type) { return type.kind === "Model"; }, + getEffectiveModel(model, filter?: (property: ModelProperty) => boolean) { + return getEffectiveModelType(this.program, model, filter); + }, }, }); diff --git a/packages/compiler/src/experimental/typekit/kits/scalar.ts b/packages/compiler/src/experimental/typekit/kits/scalar.ts index 1360a15fc7..55ef4f702f 100644 --- a/packages/compiler/src/experimental/typekit/kits/scalar.ts +++ b/packages/compiler/src/experimental/typekit/kits/scalar.ts @@ -5,412 +5,418 @@ import { defineKit, Typekit } from "../define-kit.js"; // eslint-disable-next-line @typescript-eslint/no-unused-vars import type { ModelPropertyKit } from "./model-property.js"; -/** @experimental */ -interface ScalarKit { +/** + * Operations for scalar types like strings, numerics, booleans, dates, etc. + * @experimental + */ +export interface ScalarKit { + /** + * Check if `type` is any scalar type. + * + * @param type The type to check. + */ + is(type: Type): type is Scalar; + + /** + * Check if `type` is exactly the standard boolean type. + * + * @param type The type to check. + */ + isBoolean(type: Type): type is Scalar; + + /** + * Check if `type` is exactly the standard bytes type. + * + * @param type The type to check. + */ + isBytes(type: Type): type is Scalar; + + /** + * Check if `type` is exactly the standard decimal type. + * + * @param type The type to check. + */ + isDecimal(type: Type): type is Scalar; + + /** + * Check if `type` is exactly the standard decimal128 type. + * + * @param type The type to check. + */ + isDecimal128(type: Type): type is Scalar; + + /** + * Check if `type` is exactly the standard duration type. + * + * @param type The type to check. + */ + isDuration(type: Type): type is Scalar; + + /** + * Check if `type` is exactly the standard float type. + * + * @param type The type to check. + */ + isFloat(type: Type): type is Scalar; + + /** + * Check if `type` is exactly the standard float32 type. + * + * @param type The type to check. + */ + isFloat32(type: Type): type is Scalar; + + /** + * Check if `type` is exactly the standard float64 type. + * + * @param type The type to check. + */ + isFloat64(type: Type): type is Scalar; + + /** + * Check if `type` is exactly the standard int8 type. + * + * @param type The type to check. + */ + isInt8(type: Type): type is Scalar; + + /** + * Check if `type` is exactly the standard int16 type. + * + * @param type The type to check. + */ + isInt16(type: Type): type is Scalar; + + /** + * Check if `type` is exactly the standard int32 type. + * + * @param type The type to check. + */ + isInt32(type: Type): type is Scalar; + + /** + * Check if `type` is exactly the standard int64 type. + * + * @param type The type to check. + */ + isInt64(type: Type): type is Scalar; + + /** + * Check if `type` is exactly the standard integer type. + * + * @param type The type to check. + */ + isInteger(type: Type): type is Scalar; + + /** + * Check if `type` is exactly the standard offsetDateTime type. + * + * @param type The type to check. + */ + isOffsetDateTime(type: Type): type is Scalar; + + /** + * Check if `type` is exactly the standard plainDate type. + * + * @param type The type to check. + */ + isPlainDate(type: Type): type is Scalar; + + /** + * Check if `type` is exactly the standard plainTime type. + * + * @param type The type to check. + */ + isPlainTime(type: Type): type is Scalar; + + /** + * Check if `type` is exactly the standard safeint type. + * + * @param type The type to check. + */ + isSafeint(type: Type): type is Scalar; + + /** + * Check if `type` is exactly the standard uint8 type. + * + * @param type The type to check. + */ + isUint8(type: Type): type is Scalar; + + /** + * Check if `type` is exactly the standard uint16 type. + * + * @param type The type to check. + */ + isUint16(type: Type): type is Scalar; + + /** + * Check if `type` is exactly the standard uint32 type. + * + * @param type The type to check. + */ + isUint32(type: Type): type is Scalar; + + /** + * Check if `type` is exactly the standard uint64 type. + * + * @param type The type to check. + */ + isUint64(type: Type): type is Scalar; + + /** + * Check if `type` is exactly the standard url type. + * + * @param type The type to check. + */ + isUrl(type: Type): type is Scalar; + + /** + * Check if `type` is exactly the standard utcDateTime type. + * + * @param type The type to check. + */ + isUtcDateTime(type: Type): type is Scalar; + + /** + * + * @param type The type to check. + */ + isNumeric(type: Type): type is Scalar; + + /** + * Check if `type` is exactly the standard string type. + * + * @param type The type to check. + */ + isString(type: Type): type is Scalar; + + /** + * Check if `type` extends the standard boolean type. + * + * @param type The type to check. + */ + extendsBoolean(type: Type): type is Scalar; + + /** + * Check if `type` extends the standard string type. + * + * @param type The type to check. + */ + extendsString(type: Type): type is Scalar; + + /** + * Check if `type` extends the standard numeric type. + * + * @param type The type to check. + */ + extendsNumeric(type: Type): type is Scalar; + + /** + * Check if `type` extends the standard bytes type. + * + * @param type The type to check. + */ + extendsBytes(type: Type): type is Scalar; + + /** + * Check if `type` extends the standard decimal type. + * + * @param type The type to check. + */ + extendsDecimal(type: Type): type is Scalar; + + /** + * Check if `type` extends the standard decimal128 type. + * + * @param type The type to check. + */ + extendsDecimal128(type: Type): type is Scalar; + + /** + * Check if `type` extends the standard duration type. + * + * @param type The type to check. + */ + extendsDuration(type: Type): type is Scalar; + + /** + * Check if `type` extends the standard float type. + * + * @param type The type to check. + */ + extendsFloat(type: Type): type is Scalar; + + /** + * Check if `type` extends the standard float32 type. + * + * @param type The type to check. + */ + extendsFloat32(type: Type): type is Scalar; + + /** + * Check if `type` extends the standard float64 type. + * + * @param type The type to check. + */ + extendsFloat64(type: Type): type is Scalar; + + /** + * Check if `type` extends the standard int8 type. + * + * @param type The type to check. + */ + extendsInt8(type: Type): type is Scalar; + + /** + * Check if `type` extends the standard int16 type. + * + * @param type The type to check. + */ + extendsInt16(type: Type): type is Scalar; + + /** + * Check if `type` extends the standard int32 type. + * + * @param type The type to check. + */ + extendsInt32(type: Type): type is Scalar; + + /** + * Check if `type` extends the standard int64 type. + * + * @param type The type to check. + */ + extendsInt64(type: Type): type is Scalar; + + /** + * Check if `type` extends the standard integer type. + * + * @param type The type to check. + */ + extendsInteger(type: Type): type is Scalar; + + /** + * Check if `type` extends the standard offsetDateTime type. + * + * @param type The type to check. + */ + extendsOffsetDateTime(type: Type): type is Scalar; + + /** + * Check if `type` extends the standard plainDate type. + * + * @param type The type to check. + */ + extendsPlainDate(type: Type): type is Scalar; + + /** + * Check if `type` extends the standard plainTime type. + * + * @param type The type to check. + */ + extendsPlainTime(type: Type): type is Scalar; + + /** + * Check if `type` extends the standard safeint type. + * + * @param type The type to check. + */ + extendsSafeint(type: Type): type is Scalar; + + /** + * Check if `type` extends the standard uint8 type. + * + * @param type The type to check. + */ + extendsUint8(type: Type): type is Scalar; + + /** + * Check if `type` extends the standard uint16 type. + * + * @param type The type to check. + */ + extendsUint16(type: Type): type is Scalar; + + /** + * Check if `type` extends the standard uint32 type. + * + * @param type The type to check. + */ + extendsUint32(type: Type): type is Scalar; + + /** + * Check if `type` extends the standard uint64 type. + * + * @param type The type to check. + */ + extendsUint64(type: Type): type is Scalar; + + /** + * Check if `type` extends the standard url type. + * + * @param type The type to check. + */ + extendsUrl(type: Type): type is Scalar; + + /** + * Check if `type` extends the standard utcDateTime type. + * + * @param type The type to check. + */ + extendsUtcDateTime(type: Type): type is Scalar; + + /** + * Get the standard built-in base type of a scalar. For all built-in scalar + * types (numeric, string, int32, etc.) this will just return the scalar + * type. For user-defined scalars, this will return the first base scalar + * that is built-in. For user-defined scalars without a standard base type, + * this will return null. + * + * @param type The scalar to check. + */ + getStdBase(type: Scalar): Scalar | null; + + /** + * Get the encoding information for a scalar type. Returns undefined if no + * encoding data is specified. + * + * Note: This will return the encoding data for the scalar type itself, not + * the model property that uses the scalar type. If this scalar might be + * referenced from a model property, use {@link modelProperty.getEncoding} + * instead. + * + * @param scalar The scalar to get the encoding data for. + */ + getEncoding(scalar: Scalar): EncodeData | undefined; + + /** + * Get the well-known format for a string scalar. Returns undefined if no + * format is specified. + * + * Note: This will return the format data for the scalar type itself, not + * the model property that uses the scalar type. If this scalar might be + * referenced from a model property, use {@link ModelPropertyKit.getEncoding} + * instead. + * + * @param scalar The scalar to get the format for. + */ + getFormat(scalar: Scalar): string | undefined; +} + +interface TypekitExtension { /** * Operations for scalar types like strings, numerics, booleans, dates, etc. + * @experimental */ - scalar: { - /** - * Check if `type` is any scalar type. - * - * @param type The type to check. - */ - is(type: Type): type is Scalar; - - /** - * Check if `type` is exactly the standard boolean type. - * - * @param type The type to check. - */ - isBoolean(type: Type): type is Scalar; - - /** - * Check if `type` is exactly the standard bytes type. - * - * @param type The type to check. - */ - isBytes(type: Type): type is Scalar; - - /** - * Check if `type` is exactly the standard decimal type. - * - * @param type The type to check. - */ - isDecimal(type: Type): type is Scalar; - - /** - * Check if `type` is exactly the standard decimal128 type. - * - * @param type The type to check. - */ - isDecimal128(type: Type): type is Scalar; - - /** - * Check if `type` is exactly the standard duration type. - * - * @param type The type to check. - */ - isDuration(type: Type): type is Scalar; - - /** - * Check if `type` is exactly the standard float type. - * - * @param type The type to check. - */ - isFloat(type: Type): type is Scalar; - - /** - * Check if `type` is exactly the standard float32 type. - * - * @param type The type to check. - */ - isFloat32(type: Type): type is Scalar; - - /** - * Check if `type` is exactly the standard float64 type. - * - * @param type The type to check. - */ - isFloat64(type: Type): type is Scalar; - - /** - * Check if `type` is exactly the standard int8 type. - * - * @param type The type to check. - */ - isInt8(type: Type): type is Scalar; - - /** - * Check if `type` is exactly the standard int16 type. - * - * @param type The type to check. - */ - isInt16(type: Type): type is Scalar; - - /** - * Check if `type` is exactly the standard int32 type. - * - * @param type The type to check. - */ - isInt32(type: Type): type is Scalar; - - /** - * Check if `type` is exactly the standard int64 type. - * - * @param type The type to check. - */ - isInt64(type: Type): type is Scalar; - - /** - * Check if `type` is exactly the standard integer type. - * - * @param type The type to check. - */ - isInteger(type: Type): type is Scalar; - - /** - * Check if `type` is exactly the standard offsetDateTime type. - * - * @param type The type to check. - */ - isOffsetDateTime(type: Type): type is Scalar; - - /** - * Check if `type` is exactly the standard plainDate type. - * - * @param type The type to check. - */ - isPlainDate(type: Type): type is Scalar; - - /** - * Check if `type` is exactly the standard plainTime type. - * - * @param type The type to check. - */ - isPlainTime(type: Type): type is Scalar; - - /** - * Check if `type` is exactly the standard safeint type. - * - * @param type The type to check. - */ - isSafeint(type: Type): type is Scalar; - - /** - * Check if `type` is exactly the standard uint8 type. - * - * @param type The type to check. - */ - isUint8(type: Type): type is Scalar; - - /** - * Check if `type` is exactly the standard uint16 type. - * - * @param type The type to check. - */ - isUint16(type: Type): type is Scalar; - - /** - * Check if `type` is exactly the standard uint32 type. - * - * @param type The type to check. - */ - isUint32(type: Type): type is Scalar; - - /** - * Check if `type` is exactly the standard uint64 type. - * - * @param type The type to check. - */ - isUint64(type: Type): type is Scalar; - - /** - * Check if `type` is exactly the standard url type. - * - * @param type The type to check. - */ - isUrl(type: Type): type is Scalar; - - /** - * Check if `type` is exactly the standard utcDateTime type. - * - * @param type The type to check. - */ - isUtcDateTime(type: Type): type is Scalar; - - /** - * - * @param type The type to check. - */ - isNumeric(type: Type): type is Scalar; - - /** - * Check if `type` is exactly the standard string type. - * - * @param type The type to check. - */ - isString(type: Type): type is Scalar; - - /** - * Check if `type` extends the standard boolean type. - * - * @param type The type to check. - */ - extendsBoolean(type: Type): type is Scalar; - - /** - * Check if `type` extends the standard string type. - * - * @param type The type to check. - */ - extendsString(type: Type): type is Scalar; - - /** - * Check if `type` extends the standard numeric type. - * - * @param type The type to check. - */ - extendsNumeric(type: Type): type is Scalar; - - /** - * Check if `type` extends the standard bytes type. - * - * @param type The type to check. - */ - extendsBytes(type: Type): type is Scalar; - - /** - * Check if `type` extends the standard decimal type. - * - * @param type The type to check. - */ - extendsDecimal(type: Type): type is Scalar; - - /** - * Check if `type` extends the standard decimal128 type. - * - * @param type The type to check. - */ - extendsDecimal128(type: Type): type is Scalar; - - /** - * Check if `type` extends the standard duration type. - * - * @param type The type to check. - */ - extendsDuration(type: Type): type is Scalar; - - /** - * Check if `type` extends the standard float type. - * - * @param type The type to check. - */ - extendsFloat(type: Type): type is Scalar; - - /** - * Check if `type` extends the standard float32 type. - * - * @param type The type to check. - */ - extendsFloat32(type: Type): type is Scalar; - - /** - * Check if `type` extends the standard float64 type. - * - * @param type The type to check. - */ - extendsFloat64(type: Type): type is Scalar; - - /** - * Check if `type` extends the standard int8 type. - * - * @param type The type to check. - */ - extendsInt8(type: Type): type is Scalar; - - /** - * Check if `type` extends the standard int16 type. - * - * @param type The type to check. - */ - extendsInt16(type: Type): type is Scalar; - - /** - * Check if `type` extends the standard int32 type. - * - * @param type The type to check. - */ - extendsInt32(type: Type): type is Scalar; - - /** - * Check if `type` extends the standard int64 type. - * - * @param type The type to check. - */ - extendsInt64(type: Type): type is Scalar; - - /** - * Check if `type` extends the standard integer type. - * - * @param type The type to check. - */ - extendsInteger(type: Type): type is Scalar; - - /** - * Check if `type` extends the standard offsetDateTime type. - * - * @param type The type to check. - */ - extendsOffsetDateTime(type: Type): type is Scalar; - - /** - * Check if `type` extends the standard plainDate type. - * - * @param type The type to check. - */ - extendsPlainDate(type: Type): type is Scalar; - - /** - * Check if `type` extends the standard plainTime type. - * - * @param type The type to check. - */ - extendsPlainTime(type: Type): type is Scalar; - - /** - * Check if `type` extends the standard safeint type. - * - * @param type The type to check. - */ - extendsSafeint(type: Type): type is Scalar; - - /** - * Check if `type` extends the standard uint8 type. - * - * @param type The type to check. - */ - extendsUint8(type: Type): type is Scalar; - - /** - * Check if `type` extends the standard uint16 type. - * - * @param type The type to check. - */ - extendsUint16(type: Type): type is Scalar; - - /** - * Check if `type` extends the standard uint32 type. - * - * @param type The type to check. - */ - extendsUint32(type: Type): type is Scalar; - - /** - * Check if `type` extends the standard uint64 type. - * - * @param type The type to check. - */ - extendsUint64(type: Type): type is Scalar; - - /** - * Check if `type` extends the standard url type. - * - * @param type The type to check. - */ - extendsUrl(type: Type): type is Scalar; - - /** - * Check if `type` extends the standard utcDateTime type. - * - * @param type The type to check. - */ - extendsUtcDateTime(type: Type): type is Scalar; - - /** - * Get the standard built-in base type of a scalar. For all built-in scalar - * types (numeric, string, int32, etc.) this will just return the scalar - * type. For user-defined scalars, this will return the first base scalar - * that is built-in. For user-defined scalars without a standard base type, - * this will return null. - * - * @param type The scalar to check. - */ - getStdBase(type: Scalar): Scalar | null; - - /** - * Get the encoding information for a scalar type. Returns undefined if no - * encoding data is specified. - * - * Note: This will return the encoding data for the scalar type itself, not - * the model property that uses the scalar type. If this scalar might be - * referenced from a model property, use {@link modelProperty.getEncoding} - * instead. - * - * @param scalar The scalar to get the encoding data for. - */ - getEncoding(scalar: Scalar): EncodeData | undefined; - - /** - * Get the well-known format for a string scalar. Returns undefined if no - * format is specified. - * - * Note: This will return the format data for the scalar type itself, not - * the model property that uses the scalar type. If this scalar might be - * referenced from a model property, use {@link ModelPropertyKit.getEncoding} - * instead. - * - * @param scalar The scalar to get the format for. - */ - getFormat(scalar: Scalar): string | undefined; - }; + scalar: ScalarKit; } declare module "../define-kit.js" { - interface Typekit extends ScalarKit {} + interface Typekit extends TypekitExtension {} } -defineKit({ +defineKit({ scalar: { is(type) { return type.kind === "Scalar"; diff --git a/packages/compiler/src/experimental/typekit/kits/type.ts b/packages/compiler/src/experimental/typekit/kits/type.ts index 074ee8e115..376e8b0773 100644 --- a/packages/compiler/src/experimental/typekit/kits/type.ts +++ b/packages/compiler/src/experimental/typekit/kits/type.ts @@ -3,7 +3,7 @@ import { defineKit, Typekit } from "../define-kit.js"; import { copyMap } from "../utils.js"; /** @experimental */ -export interface TypeKit { +export interface TypeTypekit { /** * Clones a type and adds it to the typekit's realm. * @param type Type to clone @@ -15,18 +15,19 @@ export interface TypeKit { finishType(type: Type): void; } -interface BaseTypeKit { +interface TypekitExtension { /** * Utilities for working with general types. + * @experimental */ - type: TypeKit; + type: TypeTypekit; } declare module "../define-kit.js" { - interface Typekit extends BaseTypeKit {} + interface Typekit extends TypekitExtension {} } -defineKit({ +defineKit({ type: { finishType(type: Type) { this.program.checker.finishType(type); diff --git a/packages/compiler/src/experimental/typekit/kits/union-variant.ts b/packages/compiler/src/experimental/typekit/kits/union-variant.ts index f4ce90d657..e814045c09 100644 --- a/packages/compiler/src/experimental/typekit/kits/union-variant.ts +++ b/packages/compiler/src/experimental/typekit/kits/union-variant.ts @@ -25,29 +25,43 @@ interface UnionVariantDescriptor { union?: Union; } +/** + * Utilities for working with union variants. + * + * Union variants are types that represent a single value within a union that can be one of + * several types. + * + * @experimental + */ export interface UnionVariantKit { - unionVariant: { - /** - * Create a union variant. - * - * @param desc The descriptor of the union variant. - */ - create(desc: UnionVariantDescriptor): UnionVariant; + /** + * Create a union variant. + * + * @param desc The descriptor of the union variant. + */ + create(desc: UnionVariantDescriptor): UnionVariant; - /** - * Check if the given `type` is a union. - * - * @param type The type to check. - */ - is(type: Type): type is UnionVariant; - }; + /** + * Check if the given `type` is a union. + * + * @param type The type to check. + */ + is(type: Type): type is UnionVariant; +} + +interface TypekitExtension { + /** + * Utilities for working with union variants. + * @experimental + */ + unionVariant: UnionVariantKit; } declare module "../define-kit.js" { - interface Typekit extends UnionVariantKit {} + interface Typekit extends TypekitExtension {} } -defineKit({ +defineKit({ unionVariant: { create(desc) { const variant: UnionVariant = this.program.checker.createType({ diff --git a/packages/compiler/src/experimental/typekit/kits/union.ts b/packages/compiler/src/experimental/typekit/kits/union.ts index 68812d8c37..e50dfb72d4 100644 --- a/packages/compiler/src/experimental/typekit/kits/union.ts +++ b/packages/compiler/src/experimental/typekit/kits/union.ts @@ -23,46 +23,56 @@ interface UnionDescriptor { variants?: Record | UnionVariant[]; } +/** + * Utilities for working with unions. + * @experimental + */ export interface UnionKit { - union: { - /** - * Create a union type. - * - * @param desc The descriptor of the union. - */ - create(desc: UnionDescriptor): Union; - - /** - * Check if the given `type` is a union. - * - * @param type The type to check. - */ - is(type: Type): type is Union; - - /** - * Check if the union is a valid enum. Specifically, this checks if the - * union has a name (since there are no enum expressions), and whether each - * of the variant types is a valid enum member value. - * - * @param type The union to check. - */ - isValidEnum(type: Union): boolean; - - /** - * Check if a union is extensible. Extensible unions are unions which contain a variant - * that is a supertype of all the other types. This means that the subtypes of the common - * supertype are known example values, but others may be present. - * @param type The union to check. - */ - isExtensible(type: Union): boolean; - }; + /** + * Create a union type. + * + * @param desc The descriptor of the union. + */ + create(desc: UnionDescriptor): Union; + + /** + * Check if the given `type` is a union. + * + * @param type The type to check. + */ + is(type: Type): type is Union; + + /** + * Check if the union is a valid enum. Specifically, this checks if the + * union has a name (since there are no enum expressions), and whether each + * of the variant types is a valid enum member value. + * + * @param type The union to check. + */ + isValidEnum(type: Union): boolean; + + /** + * Check if a union is extensible. Extensible unions are unions which contain a variant + * that is a supertype of all the other types. This means that the subtypes of the common + * supertype are known example values, but others may be present. + * @param type The union to check. + */ + isExtensible(type: Union): boolean; +} + +interface TypekitExtension { + /** + * Utilities for working with unions. + * @experimental + */ + union: UnionKit; } declare module "../define-kit.js" { - interface Typekit extends UnionKit {} + interface Typekit extends TypekitExtension {} } -export const UnionKit = defineKit({ +export const UnionKit = defineKit({ union: { create(desc) { const union: Union = this.program.checker.createType({ diff --git a/packages/compiler/src/lib/decorators.ts b/packages/compiler/src/lib/decorators.ts index 40f15e7867..d65f8f2ae6 100644 --- a/packages/compiler/src/lib/decorators.ts +++ b/packages/compiler/src/lib/decorators.ts @@ -98,8 +98,9 @@ import { UnionVariant, Value, } from "../core/types.js"; +import { useStateMap, useStateSet } from "../utils/index.js"; import { setKey } from "./key.js"; -import { useStateMap, useStateSet } from "./utils.js"; +import { createStateSymbol } from "./utils.js"; export { $encodedName, resolveEncodedName } from "./encoded-names.js"; export { serializeValueAsJson } from "./examples.js"; @@ -121,11 +122,7 @@ function replaceTemplatedStringFromProperties(formatString: string, sourceObject }); } -export function createStateSymbol(name: string) { - return Symbol.for(`TypeSpec.${name}`); -} - -const [getSummary, setSummary] = useStateMap("summary"); +const [getSummary, setSummary] = useStateMap(createStateSymbol("summary")); /** * @summary attaches a documentation string. It is typically used to give a short, single-line * description, and can be used in combination with or instead of @doc. @@ -326,7 +323,7 @@ function validateTargetingAString( // -- @error decorator ---------------------- -const [getErrorState, setErrorState] = useStateSet("error"); +const [getErrorState, setErrorState] = useStateSet(createStateSymbol("error")); /** * `@error` decorator marks a model as an error type. * Any derived models (using extends) will also be seen as error types. @@ -355,7 +352,7 @@ export function isErrorModel(program: Program, target: Type): boolean { // -- @format decorator --------------------- -const [getFormat, setFormat] = useStateMap("format"); +const [getFormat, setFormat] = useStateMap(createStateSymbol("format")); /** * `@format` - specify the data format hint for a string type @@ -395,7 +392,9 @@ export const $format: FormatDecorator = ( export { getFormat }; // -- @pattern decorator --------------------- -const [getPatternData, setPatternData] = useStateMap("patternValues"); +const [getPatternData, setPatternData] = useStateMap( + createStateSymbol("patternValues"), +); export interface PatternData { readonly pattern: string; @@ -656,7 +655,7 @@ export const $maxValueExclusive: MaxValueExclusiveDecorator = ( }; // -- @secret decorator --------------------- -const [isSecret, markSecret] = useStateSet("secretTypes"); +const [isSecret, markSecret] = useStateSet(createStateSymbol("secretTypes")); /** * Mark a string as a secret value that should be treated carefully to avoid exposure @@ -690,7 +689,9 @@ export interface EncodeData { type: Scalar; } -const [getEncode, setEncodeData] = useStateMap("encode"); +const [getEncode, setEncodeData] = useStateMap( + createStateSymbol("encode"), +); export const $encode: EncodeDecorator = ( context: DecoratorContext, target: Scalar | ModelProperty, @@ -893,7 +894,7 @@ export const $withoutDefaultValues: WithoutDefaultValuesDecorator = ( // -- @tag decorator --------------------- -const [getTagsState, setTags] = useStateMap("tagProperties"); +const [getTagsState, setTags] = useStateMap(createStateSymbol("tagProperties")); // Set a tag on an operation, interface, or namespace. There can be multiple tags on an // operation, interface, or namespace. @@ -943,7 +944,9 @@ export function getAllTags( // -- @friendlyName decorator --------------------- -const [getFriendlyName, setFriendlyName] = useStateMap("friendlyNames"); +const [getFriendlyName, setFriendlyName] = useStateMap( + createStateSymbol("friendlyNames"), +); export const $friendlyName: FriendlyNameDecorator = ( context: DecoratorContext, target: Type, @@ -981,7 +984,7 @@ export const $friendlyName: FriendlyNameDecorator = ( export { getFriendlyName }; -const [getKnownValues, setKnownValues] = useStateMap("knownValues"); +const [getKnownValues, setKnownValues] = useStateMap(createStateSymbol("knownValues")); /** * `@knownValues` marks a string type with an enum that contains all known values @@ -1100,9 +1103,11 @@ export function getDeprecated(program: Program, type: Type): string | undefined return getDeprecationDetails(program, type)?.message; } -const [getOverloads, setOverloads] = useStateMap("overloadedByKey"); +const [getOverloads, setOverloads] = useStateMap( + createStateSymbol("overloadedByKey"), +); const [getOverloadedOperation, setOverloadBase] = useStateMap( - "overloadsOperation", + createStateSymbol("overloadsOperation"), ); /** @@ -1293,7 +1298,7 @@ export interface OpExample extends ExampleOptions { const [getExamplesState, setExamples] = useStateMap< Model | Scalar | Enum | Union | ModelProperty | UnionVariant, Example[] ->("examples"); +>(createStateSymbol("examples")); export const $example: ExampleDecorator = ( context: DecoratorContext, target: Model | Scalar | Enum | Union | ModelProperty | UnionVariant, @@ -1334,7 +1339,9 @@ export function getExamples( return getExamplesState(program, target) ?? []; } -const [getOpExamplesState, setOpExamples] = useStateMap("opExamples"); +const [getOpExamplesState, setOpExamples] = useStateMap( + createStateSymbol("opExamples"), +); export const $opExample: OpExampleDecorator = ( context: DecoratorContext, target: Operation, diff --git a/packages/compiler/src/lib/encoded-names.ts b/packages/compiler/src/lib/encoded-names.ts index 6156ed72ee..3ccb45ecdd 100644 --- a/packages/compiler/src/lib/encoded-names.ts +++ b/packages/compiler/src/lib/encoded-names.ts @@ -2,13 +2,13 @@ import { reportDiagnostic } from "../core/messages.js"; import { parseMimeType } from "../core/mime-type.js"; import type { Program } from "../core/program.js"; import type { DecoratorContext, Enum, Model, Type, Union } from "../core/types.js"; -import { DuplicateTracker } from "../utils/index.js"; -import { useStateMap } from "./utils.js"; +import { DuplicateTracker, useStateMap } from "../utils/index.js"; +import { createStateSymbol } from "./utils.js"; const [getEncodedNamesMap, setEncodedNamesMap, getEncodedNamesStateMap] = useStateMap< Type, Map ->("encodedName"); +>(createStateSymbol("encodedName")); export function $encodedName( context: DecoratorContext, diff --git a/packages/compiler/src/lib/key.ts b/packages/compiler/src/lib/key.ts index 2e7ba1a96a..42db15292d 100644 --- a/packages/compiler/src/lib/key.ts +++ b/packages/compiler/src/lib/key.ts @@ -1,8 +1,9 @@ import { Program } from "../core/index.js"; import { ModelProperty, Type } from "../core/types.js"; -import { useStateMap } from "./utils.js"; +import { useStateMap } from "../utils/index.js"; +import { createStateSymbol } from "./utils.js"; -const [getKey, setKey] = useStateMap("key"); +const [getKey, setKey] = useStateMap(createStateSymbol("key")); export function isKey(program: Program, property: ModelProperty) { return getKey(program, property) !== undefined; diff --git a/packages/compiler/src/lib/paging.ts b/packages/compiler/src/lib/paging.ts index a462ca4b01..996a11dbc9 100644 --- a/packages/compiler/src/lib/paging.ts +++ b/packages/compiler/src/lib/paging.ts @@ -26,9 +26,9 @@ import type { Operation, Type, } from "../core/types.js"; -import { DuplicateTracker } from "../utils/duplicate-tracker.js"; +import { createStateSymbol } from "../lib/utils.js"; +import { DuplicateTracker, useStateSet } from "../utils/index.js"; import { isNumericType, isStringType } from "./decorators.js"; -import { useStateSet } from "./utils.js"; export const [ /** @@ -346,7 +346,7 @@ function createMarkerDecorator( key: string, validate?: (...args: Parameters) => boolean, ) { - const [isLink, markLink] = useStateSet[1]>(key); + const [isLink, markLink] = useStateSet[1]>(createStateSymbol(key)); const decorator = (...args: Parameters) => { if (validate && !validate(...args)) { return; diff --git a/packages/compiler/src/lib/service.ts b/packages/compiler/src/lib/service.ts index 36bad68430..c4b781b037 100644 --- a/packages/compiler/src/lib/service.ts +++ b/packages/compiler/src/lib/service.ts @@ -4,7 +4,7 @@ import { Type, getTypeName, reportDeprecated } from "../core/index.js"; import { reportDiagnostic } from "../core/messages.js"; import type { Program } from "../core/program.js"; import { DecoratorContext, Namespace } from "../core/types.js"; -import { useStateMap } from "./utils.js"; +import { useStateMap } from "../utils/index.js"; export interface ServiceDetails { title?: string; diff --git a/packages/compiler/src/lib/utils.ts b/packages/compiler/src/lib/utils.ts index 215a456f5f..09a70ea5b5 100644 --- a/packages/compiler/src/lib/utils.ts +++ b/packages/compiler/src/lib/utils.ts @@ -1,17 +1,4 @@ -import type { Model, ModelProperty, Type } from "../core/types.js"; -import { unsafe_useStateMap, unsafe_useStateSet } from "../experimental/state-accessor.js"; - -function createStateSymbol(name: string) { - return Symbol.for(`TypeSpec.${name}`); -} - -export function useStateMap(key: string | symbol) { - return unsafe_useStateMap(typeof key === "string" ? createStateSymbol(key) : key); -} - -export function useStateSet(key: string | symbol) { - return unsafe_useStateSet(typeof key === "string" ? createStateSymbol(key) : key); -} +import type { Model, ModelProperty } from "../core/types.js"; /** * Filters the properties of a model by removing them from the model instance if @@ -30,3 +17,11 @@ export function filterModelPropertiesInPlace( } } } + +/** + * Creates a unique symbol for storing state on objects + * @param name The name/description of the state + */ +export function createStateSymbol(name: string): symbol { + return Symbol.for(`TypeSpec.${name}`); +} diff --git a/packages/compiler/src/lib/visibility.ts b/packages/compiler/src/lib/visibility.ts index 811b4e87bd..846aa07ba5 100644 --- a/packages/compiler/src/lib/visibility.ts +++ b/packages/compiler/src/lib/visibility.ts @@ -50,8 +50,9 @@ import { normalizeVisibilityToLegacyLifecycleString, } from "../core/visibility/lifecycle.js"; import { isMutableType, mutateSubgraph, Mutator, MutatorFlow } from "../experimental/mutators.js"; +import { useStateMap } from "../utils/index.js"; import { isKey } from "./key.js"; -import { filterModelPropertiesInPlace, useStateMap } from "./utils.js"; +import { createStateSymbol, filterModelPropertiesInPlace } from "./utils.js"; // #region Legacy Visibility Utilities @@ -136,7 +137,7 @@ interface OperationVisibilityConfig { const [getOperationVisibilityConfigRaw, setOperationVisibilityConfigRaw] = useStateMap< Operation, OperationVisibilityConfig ->("operationVisibilityConfig"); +>(createStateSymbol("operationVisibilityConfig")); function getOperationVisibilityConfig( program: Program, diff --git a/packages/compiler/src/server/emitter-provider.ts b/packages/compiler/src/server/lib-provider.ts similarity index 57% rename from packages/compiler/src/server/emitter-provider.ts rename to packages/compiler/src/server/lib-provider.ts index 59d54e05da..746fa83dc4 100644 --- a/packages/compiler/src/server/emitter-provider.ts +++ b/packages/compiler/src/server/lib-provider.ts @@ -1,16 +1,19 @@ import { joinPaths } from "../core/path-utils.js"; import { NpmPackage, NpmPackageProvider } from "./npm-package-provider.js"; -export class EmitterProvider { - private isEmitterPackageCache = new Map(); - constructor(private npmPackageProvider: NpmPackageProvider) {} +export class LibraryProvider { + private libPackageFilterResultCache = new Map(); + constructor( + private npmPackageProvider: NpmPackageProvider, + private filter: (libExports: Record) => boolean, + ) {} /** * - * @param startFolder folder starts to search for package.json with emitters defined as dependencies + * @param startFolder folder starts to search for package.json with library defined as dependencies * @returns */ - async listEmitters(startFolder: string): Promise> { + async listLibraries(startFolder: string): Promise> { const packageJsonFolder = await this.npmPackageProvider.getPackageJsonFolder(startFolder); if (!packageJsonFolder) return {}; @@ -18,37 +21,37 @@ export class EmitterProvider { const data = await pkg?.getPackageJsonData(); if (!data) return {}; - const emitters: Record = {}; + const libs: Record = {}; const allDep = { ...(data.dependencies ?? {}), ...(data.devDependencies ?? {}), }; for (const dep of Object.keys(allDep)) { - const depPkg = await this.getEmitterFromDep(packageJsonFolder, dep); + const depPkg = await this.getLibraryFromDep(packageJsonFolder, dep); if (depPkg) { - emitters[dep] = depPkg; + libs[dep] = depPkg; } } - return emitters; + return libs; } /** * - * @param startFolder folder starts to search for package.json with emitters defined as dependencies - * @param emitterName + * @param startFolder folder starts to search for package.json with library defined as dependencies + * @param libName * @returns */ - async getEmitter(startFolder: string, emitterName: string): Promise { + async getLibrary(startFolder: string, libName: string): Promise { const packageJsonFolder = await this.npmPackageProvider.getPackageJsonFolder(startFolder); if (!packageJsonFolder) { return undefined; } - return this.getEmitterFromDep(packageJsonFolder, emitterName); + return this.getLibraryFromDep(packageJsonFolder, libName); } - private async isEmitter(depName: string, pkg: NpmPackage) { - if (this.isEmitterPackageCache.has(depName)) { - return this.isEmitterPackageCache.get(depName); + private async getLibFilterResult(depName: string, pkg: NpmPackage) { + if (this.libPackageFilterResultCache.has(depName)) { + return this.libPackageFilterResultCache.get(depName); } const data = await pkg.getPackageJsonData(); @@ -61,19 +64,20 @@ export class EmitterProvider { const exports = await pkg.getModuleExports(); // don't add to cache when failing to load exports which is unexpected if (!exports) return false; - const isEmitter = exports.$onEmit !== undefined; - this.isEmitterPackageCache.set(depName, isEmitter); - return isEmitter; + + const filterResult = this.filter(exports); + this.libPackageFilterResultCache.set(depName, filterResult); + return filterResult; } else { - this.isEmitterPackageCache.set(depName, false); + this.libPackageFilterResultCache.set(depName, false); return false; } } - private async getEmitterFromDep(packageJsonFolder: string, depName: string) { + private async getLibraryFromDep(packageJsonFolder: string, depName: string) { const depFolder = joinPaths(packageJsonFolder, "node_modules", depName); const depPkg = await this.npmPackageProvider.get(depFolder); - if (depPkg && (await this.isEmitter(depName, depPkg))) { + if (depPkg && (await this.getLibFilterResult(depName, depPkg))) { return depPkg; } return undefined; diff --git a/packages/compiler/src/server/serverlib.ts b/packages/compiler/src/server/serverlib.ts index eb484b0da8..4aa2baab82 100644 --- a/packages/compiler/src/server/serverlib.ts +++ b/packages/compiler/src/server/serverlib.ts @@ -96,9 +96,9 @@ import { createCompileService } from "./compile-service.js"; import { resolveCompletion } from "./completion.js"; import { Commands } from "./constants.js"; import { convertDiagnosticToLsp } from "./diagnostics.js"; -import { EmitterProvider } from "./emitter-provider.js"; import { createFileService } from "./file-service.js"; import { createFileSystemCache } from "./file-system-cache.js"; +import { LibraryProvider } from "./lib-provider.js"; import { NpmPackageProvider } from "./npm-package-provider.js"; import { getSymbolStructure } from "./symbol-structure.js"; import { provideTspconfigCompletionItems } from "./tspconfig/completion.js"; @@ -134,7 +134,14 @@ export function createServer(host: ServerHost): Server { }); const compilerHost = createCompilerHost(); const npmPackageProvider = new NpmPackageProvider(compilerHost); - const emitterProvider = new EmitterProvider(npmPackageProvider); + const emitterProvider = new LibraryProvider( + npmPackageProvider, + (exports) => exports.$onEmit !== undefined, + ); + const linterProvider = new LibraryProvider( + npmPackageProvider, + (exports) => exports.$linter !== undefined, + ); const compileService = createCompileService({ fileService, @@ -789,7 +796,9 @@ export function createServer(host: ServerHost): Server { if (doc) { const items = await provideTspconfigCompletionItems(doc, params.position, { fileService, + compilerHost, emitterProvider, + linterProvider, log, }); return CompletionList.create(items); diff --git a/packages/compiler/src/server/tspconfig/completion.ts b/packages/compiler/src/server/tspconfig/completion.ts index 691fa605f8..dddd783385 100644 --- a/packages/compiler/src/server/tspconfig/completion.ts +++ b/packages/compiler/src/server/tspconfig/completion.ts @@ -1,11 +1,30 @@ import { TextDocument } from "vscode-languageserver-textdocument"; -import { CompletionItem, CompletionItemKind, Position } from "vscode-languageserver/node.js"; +import { + CompletionItem, + CompletionItemKind, + Position, + Range, + TextEdit, +} from "vscode-languageserver/node.js"; +import { Document, isMap, isPair, Node } from "yaml"; import { emitterOptionsSchema, TypeSpecConfigJsonSchema } from "../../config/config-schema.js"; -import { JSONSchemaType, ServerLog } from "../../index.js"; +import { + getDirectoryPath, + getNormalizedAbsolutePath, + joinPaths, + normalizeSlashes, +} from "../../core/path-utils.js"; +import { + CompilerHost, + DiagnosticMessages, + JSONSchemaType, + LinterRuleDefinition, + ServerLog, +} from "../../index.js"; import { distinctArray } from "../../utils/misc.js"; -import { EmitterProvider } from "../emitter-provider.js"; import { FileService } from "../file-service.js"; -import { resolveYamlScalarTarget, YamlScalarTarget } from "../yaml-resolver.js"; +import { LibraryProvider } from "../lib-provider.js"; +import { resolveYamlPositionDetail, YamlPositionDetail } from "../yaml-resolver.js"; type ObjectJSONSchemaType = JSONSchemaType; @@ -14,24 +33,50 @@ export async function provideTspconfigCompletionItems( tspConfigPosition: Position, context: { fileService: FileService; - emitterProvider: EmitterProvider; + compilerHost: CompilerHost; + emitterProvider: LibraryProvider; + linterProvider: LibraryProvider; log: (log: ServerLog) => void; }, ): Promise { - const { fileService, emitterProvider, log } = context; - const target = resolveYamlScalarTarget(tspConfigDoc, tspConfigPosition, log); + const { fileService, compilerHost, emitterProvider, linterProvider, log } = context; + const target = resolveYamlPositionDetail(tspConfigDoc, tspConfigPosition, log); if (target === undefined) { return []; } - const items = resolveTspConfigCompleteItems(await fileService.getPath(tspConfigDoc), target); + + // Variable interpolation + if (target.sourceRange) { + const variableInterpolationItems = resolveVariableInterpolationCompleteItems( + target.yamlDoc, + target.path, + tspConfigDoc.getText().slice(target.sourceRange.pos, target.cursorPosition), + ); + if (variableInterpolationItems.length > 0) { + return variableInterpolationItems; + } + } + + const items = resolveTspConfigCompleteItems( + await fileService.getPath(tspConfigDoc), + target, + tspConfigPosition, + log, + ); return items; async function resolveTspConfigCompleteItems( tspConfigFile: string, - target: YamlScalarTarget, + target: YamlPositionDetail, + tspConfigPosition: Position, + log: (log: ServerLog) => void, ): Promise { - const { path: nodePath, type: targetType, siblings } = target; + const { path: nodePath, type: targetType, siblings, source } = target; const CONFIG_PATH_LENGTH_FOR_EMITTER_LIST = 2; + const CONFIG_PATH_LENGTH_FOR_LINTER_LIST = 2; + const CONFIG_PATH_LENGTH_FOR_EXTENDS = 1; + const CONFIG_PATH_LENGTH_FOR_IMPORTS = 2; + if ( (nodePath.length === CONFIG_PATH_LENGTH_FOR_EMITTER_LIST && nodePath[0] === "options" && @@ -40,30 +85,29 @@ export async function provideTspconfigCompletionItems( nodePath[0] === "emit" && targetType === "arr-item") ) { - const emitters = await emitterProvider.listEmitters(tspConfigFile); + const emitters = await emitterProvider.listLibraries(tspConfigFile); const items: CompletionItem[] = []; for (const [name, pkg] of Object.entries(emitters)) { if (!siblings.includes(name)) { - const item: CompletionItem = { - label: name, - kind: CompletionItemKind.Field, - documentation: (await pkg.getPackageJsonData())?.description ?? `Emitter from ${name}`, - insertText: `"${name}"`, - }; + const item = createCompletionItemWithQuote( + name, + (await pkg.getPackageJsonData())?.description ?? `Emitter from ${name}`, + tspConfigPosition, + target, + ); items.push(item); } } return items; } else if (nodePath.length > CONFIG_PATH_LENGTH_FOR_EMITTER_LIST && nodePath[0] === "options") { const emitterName = nodePath[CONFIG_PATH_LENGTH_FOR_EMITTER_LIST - 1]; - const emitter = await emitterProvider.getEmitter(tspConfigFile, emitterName); + const emitter = await emitterProvider.getLibrary(tspConfigFile, emitterName); if (!emitter) { return []; } - const exports = await emitter.getModuleExports(); + const exports = await emitter.getModuleExports(); const builtInEmitterSchema = emitterOptionsSchema; - const itemsFromBuiltIn = builtInEmitterSchema ? resolveCompleteItems(builtInEmitterSchema, { ...target, @@ -80,6 +124,93 @@ export async function provideTspconfigCompletionItems( itemsFromEmitter.push(...more); } return [...itemsFromBuiltIn, ...itemsFromEmitter]; + } else if (nodePath.length > CONFIG_PATH_LENGTH_FOR_LINTER_LIST && nodePath[0] === "linter") { + const extendKeyWord = nodePath[CONFIG_PATH_LENGTH_FOR_LINTER_LIST - 1]; + const items: CompletionItem[] = []; + const linters = await linterProvider.listLibraries(tspConfigFile); + + if (extendKeyWord === "extends") { + for (const [name, pkg] of Object.entries(linters)) { + // If a ruleSet exists for the linter, add it to the end of the library name. + const exports = await pkg.getModuleExports(); + if (exports?.$linter?.ruleSets !== undefined) { + // Below ruleSets are objects rather than arrays + for (const [ruleSet] of Object.entries(exports?.$linter?.ruleSets)) { + const labelName = `${name}/${ruleSet}`; + if (!siblings.includes(labelName)) { + const item = createCompletionItemWithQuote( + labelName, + (await pkg.getPackageJsonData())?.description ?? `Linters from ${labelName}`, + tspConfigPosition, + target, + ); + items.push(item); + } + } + } + + // Add the library name directly. + if (!siblings.includes(name)) { + const item = createCompletionItemWithQuote( + name, + (await pkg.getPackageJsonData())?.description ?? `Linters from ${name}`, + tspConfigPosition, + target, + ); + items.push(item); + } + } + } else if (extendKeyWord === "enable" || extendKeyWord === "disable") { + // enable/disable rules + for (const [name, pkg] of Object.entries(linters)) { + const exports = await pkg.getModuleExports(); + + if (exports?.$linter?.rules !== undefined) { + for (const [, rule] of Object.entries>( + exports?.$linter?.rules, + )) { + const labelName = `${name}/${rule.name}`; + const item = createCompletionItemWithQuote( + labelName, + rule.description, + tspConfigPosition, + target, + ); + items.push(item); + } + } + } + } else { + log({ + level: "warning", + message: "Unknown linter keyword, it should be 'extends', 'enable' or 'disable'", + }); + } + return items; + } else if (nodePath.length === CONFIG_PATH_LENGTH_FOR_EXTENDS && nodePath[0] === "extends") { + const currentFolder = getDirectoryPath(tspConfigFile); + const newFolderPath = joinPaths(currentFolder, source); + + // Exclude the current yaml configuration file + const relativeFiles = await findFilesOrDirsWithSameExtension( + compilerHost, + newFolderPath, + ".yaml", + [normalizeSlashes(tspConfigFile)], + ); + return getFilePathCompletionItems(relativeFiles, siblings, source); + } else if (nodePath.length >= CONFIG_PATH_LENGTH_FOR_IMPORTS && nodePath[0] === "imports") { + const currentFolder = getDirectoryPath(tspConfigFile); + const newFolderPath = joinPaths(currentFolder, source); + + // Exclude main.tsp files that are the same as the current yaml configuration directory + const relativeFiles = await findFilesOrDirsWithSameExtension( + compilerHost, + newFolderPath, + ".tsp", + [joinPaths(currentFolder, "main.tsp")], + ); + return getFilePathCompletionItems(relativeFiles, siblings, source); } else { const schema = TypeSpecConfigJsonSchema; return schema ? resolveCompleteItems(schema, target) : []; @@ -153,7 +284,7 @@ export async function provideTspconfigCompletionItems( function resolveCompleteItems( schema: ObjectJSONSchemaType, - target: YamlScalarTarget, + target: YamlPositionDetail, ): CompletionItem[] { const { path: nodePath, type: targetType } = target; // if the target is a key which means it's pointing to an object property, we should remove the last element of the path to get it's parent object for its schema @@ -174,7 +305,9 @@ export async function provideTspconfigCompletionItems( const item: CompletionItem = { label: key, kind: CompletionItemKind.Field, - documentation: cur.properties[key].description, + documentation: cur.required?.includes(key) + ? "[required]\n" + (cur.properties[key].description ?? "") + : "[optional]\n" + (cur.properties[key].description ?? ""), }; return item; }); @@ -211,3 +344,199 @@ export async function provideTspconfigCompletionItems( return distinctArray(result, (t) => t.label); } } + +/** + * Create the common CompletionItem object, which value is included in quotes + * @param labelName The value of the label attribute of the CompletionItem object + * @param description The value of the documentation attribute of the CompletionItem object + * @param tspConfigPosition Input current line location object, see {@link Position} + * @param target The target object of the current configuration file, see {@link YamlPositionDetail} + * @returns CompletionItem object + */ +function createCompletionItemWithQuote( + labelName: string, + description: string, + tspConfigPosition: Position, + target: YamlPositionDetail, +): CompletionItem { + if ( + target.sourceRange && + target.cursorPosition >= target.sourceRange.pos && + target.cursorPosition <= target.sourceRange.end + ) { + // If it is a quoted string, the relative position needs to be reduced by 1 + const lenRelativeToStartPos = + target.sourceType === "QUOTE_SINGLE" || target.sourceType === "QUOTE_DOUBLE" + ? target.cursorPosition - target.sourceRange.pos - 1 + : target.cursorPosition - target.sourceRange.pos; + return { + label: labelName, + kind: CompletionItemKind.Field, + documentation: description, + textEdit: TextEdit.replace( + Range.create( + Position.create( + tspConfigPosition.line, + tspConfigPosition.character - lenRelativeToStartPos, + ), + Position.create(tspConfigPosition.line, tspConfigPosition.character), + ), + target.sourceType === "QUOTE_SINGLE" || target.sourceType === "QUOTE_DOUBLE" + ? labelName + : `"${labelName}"`, + ), + }; + } + + return { + label: labelName, + kind: CompletionItemKind.Field, + documentation: description, + insertText: `"${labelName}"`, + }; +} + +/** + * Find a set of dirs/files with the same suffix + * @param compilerHost CompilerHost object for file operations, see {@link CompilerHost} + * @param rootPath The absolute input path or relative path of the current configuration file + * @param fileExtension File extension + * @param excludeFiles exclude files array, default is [] + * @returns dirs/files array + */ +async function findFilesOrDirsWithSameExtension( + compilerHost: CompilerHost, + rootPath: string, + fileExtension: ".yaml" | ".tsp", + excludeFiles: string[] = [], +): Promise { + const exclude = ["node_modules", "tsp-output", ".vs", ".vscode"]; + + const files: string[] = []; + try { + // When reading the content under the path, an error may be reported if the path is incorrect. + const dirs = await compilerHost.readDir(rootPath); + for (const d of dirs) { + if (!exclude.includes(d) && !excludeFiles.includes(getNormalizedAbsolutePath(d, rootPath))) { + try { + const stat = await compilerHost.stat(joinPaths(rootPath, d)); + if (stat.isDirectory() || (stat.isFile() && d.endsWith(fileExtension))) { + files.push(d); + } + } catch { + // If the path is incorrect, the error is ignored + continue; + } + } + } + } catch { + return files; + } + return files; +} + +/** + * Get the CompletionItem object array of the relative path of the file + * @param relativeFiles File relative path array + * @param siblings Sibling node array + * @param source The input source of the current node + * @returns CompletionItem object array + */ +function getFilePathCompletionItems( + relativeFiles: string[], + siblings: string[], + source: string, +): CompletionItem[] { + return relativeFiles + .filter((file) => !siblings.includes(joinPaths(source, file))) + .map((file) => { + return { + label: file, + kind: CompletionItemKind.File, + }; + }); +} + +/** + * resolve variable interpolation completion items + * @param yamlDocNodes tsp config yaml document nodes , see {@link Document} + * @param path current path of the target node, such as ["linter", "extends","- ┆"] + * @param curText current editing text, from startPos to curPos + * @returns variable interpolation completion items + */ +function resolveVariableInterpolationCompleteItems( + yamlDocNodes: Document, + path: string[], + curText: string, +): CompletionItem[] { + if (/{\s*env\.[^}]*$/.test(curText)) { + // environment-variables + return getVariableCompletionItem( + yamlDocNodes, + "environment-variables", + "Custom environment variables", + ); + } else if (/{[^}]*$/.test(curText)) { + // parameters and built-in variables + const result = [ + ...getVariableCompletionItem(yamlDocNodes, "parameters", "Custom paramters variables"), + ...["cwd", "project-root"].map((value) => { + const item: CompletionItem = { + label: value, + kind: CompletionItemKind.Value, + documentation: "Built-in variables", + }; + return item; + }), + ]; + + // if the current path is options, add output-dir and emitter-name + const CONFIG_PATH_LENGTH_FOR_OPTIONS = 2; + if (path.length > CONFIG_PATH_LENGTH_FOR_OPTIONS && path[0] === "options") { + result.push( + ...["output-dir", "emitter-name"].map((value) => { + const item: CompletionItem = { + label: value, + kind: CompletionItemKind.Value, + documentation: "Built-in variables", + }; + return item; + }), + ); + } + return result; + } + + return []; +} + +/** + * Get the corresponding CompletionItem array based on the filter name + * @param yamlDoc The contents of the YAML configuration file + * @param filterName The filter name + * @param description The description of the CompletionItem object + * @returns CompletionItem object array + */ +function getVariableCompletionItem( + yamlDoc: Document, + filterName: "parameters" | "environment-variables", + description: string, +): CompletionItem[] { + const result: CompletionItem[] = []; + if (isMap(yamlDoc.contents)) { + const yamlMap = yamlDoc.contents.items.find((item) => (item.key).source === filterName); + if (yamlMap && yamlMap.value !== null && isMap(yamlMap.value)) { + yamlMap.value.items.forEach((i) => { + if (isPair(i)) { + result.push({ + label: (i.key as any).source ?? "", + kind: CompletionItemKind.Value, + documentation: description, + }); + } + }); + } + } + + return result; +} diff --git a/packages/compiler/src/server/yaml-resolver.ts b/packages/compiler/src/server/yaml-resolver.ts index 07877ee792..d2f003c1e9 100644 --- a/packages/compiler/src/server/yaml-resolver.ts +++ b/packages/compiler/src/server/yaml-resolver.ts @@ -12,11 +12,12 @@ import { Scalar, visit, } from "yaml"; +import { TextRange } from "../core/index.js"; import { firstNonWhitespaceCharacterIndex, isWhitespaceStringOrUndefined } from "../utils/misc.js"; import { ServerLog } from "./types.js"; type YamlNodePathSegment = Document | Node | Pair; -export interface YamlScalarTarget { +export interface YamlPositionDetail { /** * The path of the yaml node at the position, it consists of object's property, array's index, empty string for potential object property (empty line) */ @@ -31,10 +32,26 @@ export interface YamlScalarTarget { * actual value of target in the doc */ source: string; + /** + * The input quotes (double quotes or single quotes) + */ + sourceType: Scalar.Type; + /** + * The position range of the text in the document, such as [startPos, endPos], see {@link TextRange} + */ + sourceRange: TextRange | undefined; /** * The siblings of the target node */ siblings: string[]; + /** + * The parsed yaml document + */ + yamlDoc: Document; + /** + * The cursor current position + */ + cursorPosition: number; } interface YamlVisitScalarNode { @@ -43,11 +60,11 @@ interface YamlVisitScalarNode { path: readonly YamlNodePathSegment[]; } -export function resolveYamlScalarTarget( +export function resolveYamlPositionDetail( document: TextDocument, position: Position, log: (log: ServerLog) => void, -): YamlScalarTarget | undefined { +): YamlPositionDetail | undefined { const pos = document.offsetAt(position); const content = document.getText(); const lines = content.split("\n"); @@ -85,7 +102,11 @@ export function resolveYamlScalarTarget( path: [""], type: "key", source: "", + sourceType: "PLAIN", siblings: rootProperties, + yamlDoc, + sourceRange: undefined, + cursorPosition: pos, }; } for (let i = position.line - 1; i >= 0; i--) { @@ -114,7 +135,7 @@ export function resolveYamlScalarTarget( }); return undefined; } - const yp = createYamlPathFromVisitScalarNode(found, pos, log); + const yp = createYamlPathFromVisitScalarNode(found, pos, log, yamlDoc); if (!yp || yp.path.length === 0) { log({ level: "debug", @@ -131,7 +152,11 @@ export function resolveYamlScalarTarget( path: [...yp.path.slice(0, yp.path.length - 1), ""], type: "key", source: "", + sourceType: "PLAIN", siblings: [...yp.siblings, yp.source], + yamlDoc, + sourceRange: yp.sourceRange, + cursorPosition: pos, }; } break; @@ -159,7 +184,7 @@ export function resolveYamlScalarTarget( isMap(last.value) || (isScalar(last.value) && isWhitespaceStringOrUndefined(last.value.source))) ) { - const yp = createYamlPathFromVisitScalarNode(found, pos, log); + const yp = createYamlPathFromVisitScalarNode(found, pos, log, yamlDoc); if (!yp || yp.path.length === 0) { log({ level: "debug", @@ -172,9 +197,13 @@ export function resolveYamlScalarTarget( path: [...yp.path, ""], type: "key", source: "", + sourceType: "PLAIN", siblings: isMap(last.value) ? (last.value?.items.map((item) => (item.key as any).source ?? "") ?? []) : [], + yamlDoc, + sourceRange: yp.sourceRange, + cursorPosition: pos, }; } break; @@ -190,7 +219,7 @@ export function resolveYamlScalarTarget( }); return undefined; } - const yp = createYamlPathFromVisitScalarNode(found, pos, log); + const yp = createYamlPathFromVisitScalarNode(found, pos, log, yamlDoc); return yp; } } @@ -199,7 +228,8 @@ function createYamlPathFromVisitScalarNode( info: YamlVisitScalarNode, offset: number, log: (log: ServerLog) => void, -): YamlScalarTarget | undefined { + yamlDoc: Document, +): YamlPositionDetail | undefined { const { key, n, path: nodePath } = info; if (nodePath.length === 0) { log({ @@ -208,6 +238,7 @@ function createYamlPathFromVisitScalarNode( }); return undefined; } + const path: string[] = []; for (let i = 0; i < nodePath.length; i++) { @@ -230,13 +261,23 @@ function createYamlPathFromVisitScalarNode( } const last = nodePath[nodePath.length - 1]; + let curSourceRange = undefined; + if (n.range) { + const [startPos, endPos] = n.range; + curSourceRange = { pos: startPos, end: endPos }; + } + if (isDocument(last)) { // we are at the root and the content is a pure text (otherwise there should be a Map under document node first) return { path: [], type: key === null ? "key" : "value", source: n.source ?? "", + sourceType: n.type ?? "PLAIN", siblings: [], + yamlDoc, + sourceRange: curSourceRange, + cursorPosition: offset, }; } else if (isPair(last)) { if (nodePath.length < 2) { @@ -251,22 +292,32 @@ function createYamlPathFromVisitScalarNode( // if the scalar node is marked as value but separated by newline from the key, it's more likely that the user is inputting the first property of an object // so build the target as an object key path.push(n.source ?? ""); + return { path, type: "key", source: n.source ?? "", + sourceType: n.type ?? "PLAIN", siblings: [], + yamlDoc, + sourceRange: curSourceRange, + cursorPosition: offset, }; } else { - const parent = nodePath[nodePath.length - 2]; + const parent = nodePath.length >= 2 ? nodePath[nodePath.length - 2] : undefined; const targetSiblings = isMap(parent) ? parent.items.filter((item) => item !== last).map((item) => (item.key as any).source ?? "") : []; + return { path: path, type: key === "key" ? "key" : "value", source: n.source ?? "", siblings: targetSiblings, + sourceType: n.type ?? "PLAIN", + yamlDoc, + sourceRange: curSourceRange, + cursorPosition: offset, }; } } else if (isSeq(last)) { @@ -274,9 +325,13 @@ function createYamlPathFromVisitScalarNode( path: path, type: "arr-item", source: n.source ?? "", + sourceType: n.type ?? "PLAIN", siblings: last.items .filter((i) => i !== n) .map((item) => (isScalar(item) ? (item.source ?? "") : "")), + yamlDoc, + sourceRange: curSourceRange, + cursorPosition: offset, }; } else { log({ diff --git a/packages/compiler/src/utils/index.ts b/packages/compiler/src/utils/index.ts index 8cec1d47b0..2af3b409d3 100644 --- a/packages/compiler/src/utils/index.ts +++ b/packages/compiler/src/utils/index.ts @@ -4,3 +4,4 @@ // --------------------------------------- export { DuplicateTracker } from "./duplicate-tracker.js"; export { Queue, TwoLevelMap, createRekeyableMap, deepClone, deepEquals } from "./misc.js"; +export { useStateMap, useStateSet } from "./state-accessor.js"; diff --git a/packages/compiler/src/experimental/state-accessor.ts b/packages/compiler/src/utils/state-accessor.ts similarity index 84% rename from packages/compiler/src/experimental/state-accessor.ts rename to packages/compiler/src/utils/state-accessor.ts index 7ae586342f..7f7ddbe996 100644 --- a/packages/compiler/src/experimental/state-accessor.ts +++ b/packages/compiler/src/utils/state-accessor.ts @@ -5,8 +5,7 @@ type StateMapGetter = (program: Program, type: K) => V | unde type StateMapSetter = (program: Program, type: K, value: V) => void; type StateMapMapGetter = (program: Program) => Map; -/** @experimental */ -export function unsafe_useStateMap( +export function useStateMap( key: symbol, ): [StateMapGetter, StateMapSetter, StateMapMapGetter] { const getter = (program: Program, target: K) => program.stateMap(key).get(target); @@ -19,10 +18,7 @@ export function unsafe_useStateMap( type StateSetGetter = (program: Program, type: K) => boolean; type StateSetSetter = (program: Program, type: K) => void; -/** @experimental */ -export function unsafe_useStateSet( - key: symbol, -): [StateSetGetter, StateSetSetter] { +export function useStateSet(key: symbol): [StateSetGetter, StateSetSetter] { const getter = (program: Program, target: K) => program.stateSet(key).has(target); const setter = (program: Program, target: K) => program.stateSet(key).add(target); diff --git a/packages/compiler/templates/__snapshots__/rest/main.tsp b/packages/compiler/templates/__snapshots__/rest/main.tsp index 6a185cca88..d5c1d97b5c 100644 --- a/packages/compiler/templates/__snapshots__/rest/main.tsp +++ b/packages/compiler/templates/__snapshots__/rest/main.tsp @@ -7,34 +7,40 @@ using TypeSpec.Http; namespace DemoService; model Widget { - @visibility("read", "update") - @path id: string; - weight: int32; color: "red" | "blue"; } +model WidgetList { + items: Widget[]; +} + @error model Error { code: int32; message: string; } +model AnalyzeResult { + id: string; + analysis: string; +} + @route("/widgets") @tag("Widgets") interface Widgets { /** List widgets */ - @get list(): Widget[] | Error; + @get list(): WidgetList | Error; /** Read widgets */ @get read(@path id: string): Widget | Error; /** Create a widget */ - @post create(...Widget): Widget | Error; + @post create(@body body: Widget): Widget | Error; /** Update a widget */ - @patch update(...Widget): Widget | Error; + @patch update(@path id: string, @body body: Widget): Widget | Error; /** Delete a widget */ @delete delete(@path id: string): void | Error; /** Analyze a widget */ - @route("{id}/analyze") @post analyze(@path id: string): string | Error; + @route("{id}/analyze") @post analyze(@path id: string): AnalyzeResult | Error; } diff --git a/packages/compiler/templates/rest/main.tsp b/packages/compiler/templates/rest/main.tsp index 6a185cca88..d5c1d97b5c 100644 --- a/packages/compiler/templates/rest/main.tsp +++ b/packages/compiler/templates/rest/main.tsp @@ -7,34 +7,40 @@ using TypeSpec.Http; namespace DemoService; model Widget { - @visibility("read", "update") - @path id: string; - weight: int32; color: "red" | "blue"; } +model WidgetList { + items: Widget[]; +} + @error model Error { code: int32; message: string; } +model AnalyzeResult { + id: string; + analysis: string; +} + @route("/widgets") @tag("Widgets") interface Widgets { /** List widgets */ - @get list(): Widget[] | Error; + @get list(): WidgetList | Error; /** Read widgets */ @get read(@path id: string): Widget | Error; /** Create a widget */ - @post create(...Widget): Widget | Error; + @post create(@body body: Widget): Widget | Error; /** Update a widget */ - @patch update(...Widget): Widget | Error; + @patch update(@path id: string, @body body: Widget): Widget | Error; /** Delete a widget */ @delete delete(@path id: string): void | Error; /** Analyze a widget */ - @route("{id}/analyze") @post analyze(@path id: string): string | Error; + @route("{id}/analyze") @post analyze(@path id: string): AnalyzeResult | Error; } diff --git a/packages/compiler/templates/scaffolding.json b/packages/compiler/templates/scaffolding.json index 6a7ebaca17..cf1501eb2e 100644 --- a/packages/compiler/templates/scaffolding.json +++ b/packages/compiler/templates/scaffolding.json @@ -34,7 +34,7 @@ "emitter-output-dir": "{output-dir}/clients/java" } }, - "@typespec/http-client-js": { + "@azure-tools/typespec-ts": { "description": "JavaScript Client emitter", "options": { "emitter-output-dir": "{output-dir}/clients/js" @@ -49,10 +49,10 @@ "@typespec/http-server-csharp": { "description": "CSharp server stubs", "options": { - "emitter-output-dir": "{output-dir}/server" + "emitter-output-dir": "{output-dir}/server/generated" } }, - "@typespec/http-server-js": { + "@typespec/http-server-javascript": { "description": "Javascript server stubs", "options": { "emitter-output-dir": "{output-dir}/server" diff --git a/packages/compiler/test/experimental/typekit/model.test.ts b/packages/compiler/test/experimental/typekit/model.test.ts new file mode 100644 index 0000000000..1a1fdfba91 --- /dev/null +++ b/packages/compiler/test/experimental/typekit/model.test.ts @@ -0,0 +1,56 @@ +import { expect, it } from "vitest"; +import { $ } from "../../../src/experimental/typekit/index.js"; +import { Operation } from "../../../src/index.js"; +import { getTypes } from "./utils.js"; + +it("can check if a type is a Model", async () => { + const { Foo } = await getTypes( + ` + model Foo {}; + `, + ["Foo"], + ); + + expect($.model.is(Foo)).toBe(true); +}); + +it("returns false whe the type is not a model", async () => { + const { Foo } = await getTypes( + ` + interface Foo {}; + `, + ["Foo"], + ); + + expect($.model.is(Foo)).toBe(false); +}); + +it("creates a new Model", async () => { + const foo = $.model.create({ + name: "Foo", + properties: {}, + }); + + expect($.model.is(foo)).toBe(true); +}); + +it("can get the effective model type", async () => { + const { Foo, create } = await getTypes( + ` + model Foo { + id: string; + }; + + op create(...Foo): void; + `, + ["Foo", "create"], + ); + + const createParameters = (create as Operation).parameters; + const model = $.model.getEffectiveModel(createParameters); + + // Since Foo is spread they are not the same model + expect(createParameters).not.toBe(Foo); + // But Foo is the effective model + expect(model).toBe(Foo); +}); diff --git a/packages/compiler/test/server/completion.tspconfig.test.ts b/packages/compiler/test/server/completion.tspconfig.test.ts index 2f3a12dd6f..f883747209 100644 --- a/packages/compiler/test/server/completion.tspconfig.test.ts +++ b/packages/compiler/test/server/completion.tspconfig.test.ts @@ -2,6 +2,7 @@ import { join } from "path"; import { describe, expect, it } from "vitest"; import { CompletionList } from "vscode-languageserver/node.js"; import { createTestServerHost, extractCursor } from "../../src/testing/test-server-host.js"; +import { resolveVirtualPath } from "../../src/testing/test-utils.js"; const rootOptions = [ "extends", @@ -71,12 +72,28 @@ describe("Test completion items for options and emitters", () => { it.each([ { config: `emit:\n - ┆`, + expected: ['"fake-emitter"', '"fake-emitter-no-schema"'], + }, + { + config: `emit:\n - "┆"`, expected: ["fake-emitter", "fake-emitter-no-schema"], }, { - config: `options:\n\n fak┆`, + config: `emit:\n - "┆`, + expected: ["fake-emitter", "fake-emitter-no-schema"], + }, + { + config: `emit:\n - '┆`, + expected: ["fake-emitter", "fake-emitter-no-schema"], + }, + { + config: `emit:\n - '┆'`, expected: ["fake-emitter", "fake-emitter-no-schema"], }, + { + config: `options:\n\n fak┆`, + expected: ['"fake-emitter"', '"fake-emitter-no-schema"'], + }, ])("#%# Test emitters: $config", async ({ config, expected }) => { await checkCompletionItems(config, true, expected); }); @@ -167,7 +184,27 @@ describe("Test completion items for emitters options", () => { expected: ["a", "b", "c"], }, ])("#%# Test emitter options: $config", async ({ config, expected }) => { - await checkCompletionItems(config, true, expected, "./subfolder/tspconfig.yaml"); + await checkCompletionItems(config, true, expected, false, "./subfolder/tspconfig.yaml"); + }); +}); + +describe("Test whether the completion items description of the emitters options is optional or required", () => { + it.each([ + { + config: `options:\n fake-emitter:\n ┆`, + expected: [ + "[required]\nThe name of the target to emit to.", //"target-name", + "[optional]\nWhether the target is valid.", //"is-valid", + "[required]\n", //"type", + "[optional]\n", //"emitter-output-dir", + "[optional]\n", //"options", + "[optional]\n", //"options-b", + "[optional]\n", //"options-arr-obj", + "[optional]\n", //"options-arr-boolean", + ], + }, + ])("#%# Test emitter options: $config", async ({ config, expected }) => { + await checkCompletionItems(config, true, expected, true, "./subfolder/tspconfig.yaml"); }); }); @@ -209,23 +246,47 @@ describe("Test completion items for linter", () => { expected: ["extends", "disable"], }, { - config: `linter:\n enable:\n linter-one: ┆`, - expected: ["true", "false"], + config: `linter:\n extends:\n - "┆`, + expected: ["fake-linter-no-schema", "fake-linter/recommended", "fake-linter"], + }, + { + config: `linter:\n extends:\n - "fake-linter/recommended"\n - "┆`, + expected: ["fake-linter-no-schema", "fake-linter"], + }, + { + config: `linter:\n extends:\n - "fake-linter"\n enable:\n "┆`, + expected: ["fake-linter/casing", "fake-linter/no-model-doc", "fake-linter/testing"], }, { - config: `linter:\n enable:\n linter-one┆:`, + config: `linter:\n extends:\n - "fake-linter/recommended"\n enable:\n "┆`, + expected: ["fake-linter/casing", "fake-linter/no-model-doc", "fake-linter/testing"], + }, + { + config: `linter:\n extends:\n - "fake-linter/recommended"\n disable:\n "┆`, + expected: ["fake-linter/casing", "fake-linter/no-model-doc", "fake-linter/testing"], + }, + { + config: `linter:\n extends:\n - "fake-linter/recommended"\n - "fake-linter-no-schema"\n enable:\n "┆`, + expected: ["fake-linter/casing", "fake-linter/no-model-doc", "fake-linter/testing"], + }, + { + config: `linter:\n extends:\n - "fake-linter/recommended"\n enable:\n "fake-linter/casing": true\n disable:\n "┆`, + expected: ["fake-linter/casing", "fake-linter/no-model-doc", "fake-linter/testing"], + }, + { + config: `linter:\n extends:\n - "fake-linter-no-schema" - "fake-linter/recommended"┆`, expected: [], }, { - config: `linter:\n disable:\n linter-one: true\n ┆`, + config: `linter:\n extends:\n enable: "fak┆e"`, expected: [], }, { - config: `linter:\n disable:\n linter-one: true\n linter-two: ┆`, + config: `linter:\n extends:\n - "fake-linter-no-schema" - "fake"┆`, expected: [], }, - ])("#%# Test linter: $config", async ({ config, expected }) => { - await checkCompletionItems(config, true, expected); + ])("#%# Test emitter options: $config", async ({ config, expected }) => { + await checkCompletionItems(config, true, expected, false, "./subfolder/tspconfig.yaml"); }); }); @@ -252,6 +313,179 @@ describe("Test completion items for additionalProperties", () => { }); }); +describe("Test completion items that use parameters and environment variables and built-in variables", () => { + it.each([ + { + config: `environment-variables:\n BASE_DIR:\n default: "{cwd}"\n test-env:\n default: ""\noutput-dir: "{env.┆}"`, + expected: ["BASE_DIR", "test-env"], + }, + { + config: `environment-variables:\n BASE_DIR:\n default: "{cwd}"\n test-env:\n default: ""\noutput-dir: "{ env.┆}"`, + expected: ["BASE_DIR", "test-env"], + }, + { + config: `environment-variables:\n BASE_DIR:\n default: "{cwd}"\n test-env:\n default: ""\noutput-dir: "outdir/{env.┆}"`, + expected: ["BASE_DIR", "test-env"], + }, + { + config: `environment-variables:\n BASE_DIR:\n default: "{cwd}"\n test-env:\n default: ""\noutput-dir: "outdir/{env.┆}/myDir"`, + expected: ["BASE_DIR", "test-env"], + }, + { + config: `environment-variables:\n BASE_DIR:\n default: "{cwd}"\n test-env:\n default: ""\noutput-dir: "{}env.┆}"`, + expected: [], + }, + { + config: `environment-variables:\n BASE_DIR:\n default: "{cwd}"\n test-env:\n default: ""\noutput-dir: "outdir/{env.}/my┆Dir"`, + expected: [], + }, + { + config: `environment-variables:\n BASE_DIR:\n default: "{cwd}"\n test-env:\n default: ""\noutput-dir: "{ abcenv.┆}"`, + expected: ["cwd", "project-root"], + }, + { + config: `environment-variables:\n BASE_DIR:\n default: "{cwd}"\n test-env:\n default: ""\noutput-dir: ┆"{ env.}"`, + expected: [], + }, + { + config: `parameters:\n base-dir:\n default: "{cwd}"\n test-param: default: ""\noutput-dir: "{┆}"`, + expected: ["cwd", "project-root", "base-dir", "test-param"], + }, + { + config: `parameters:\n base-dir:\n default: "{cwd}"\n test-param: default: ""\noutput-dir: "{cw┆}"`, + expected: ["cwd", "project-root", "base-dir", "test-param"], + }, + { + config: `environment-variables:\n BASE_DIR:\n default: "{cwd}"\n test-env:\n default: ""\nparameters:\n base-dir:\n default: "{cwd}"\n test-param: default: ""\noutput-dir: "{env.┆}"`, + expected: ["BASE_DIR", "test-env"], + }, + { + config: `parameters:\n base-dir:\n default: "{cwd}"\n test-param: default: ""\noutput-dir: "test/{cw┆}"`, + expected: ["cwd", "project-root", "base-dir", "test-param"], + }, + { + config: `parameters:\n base-dir:\n default: "{cwd}"\n test-param: default: ""\noutput-dir: "outDir/{cw┆}/myDir"`, + expected: ["cwd", "project-root", "base-dir", "test-param"], + }, + { + config: `parameters:\n base-dir:\n default: "{cwd}"\n test-param: default: ""\noptions:\n emitter-sub-folder:\n sub-folder: "{cw┆}/myDir"`, + expected: ["cwd", "project-root", "base-dir", "test-param", "output-dir", "emitter-name"], + }, + { + config: `parameters:\n base-dir:\n default: "{cwd}"\n test-param: default: ""\noutput-dir: "{env.┆}"`, + expected: [], + }, + { + config: `parameters:\n base-dir:\n default: "{cwd}"\n test-param: default: ""\noutput-dir: "{}┆"`, + expected: [], + }, + { + config: `parameters:\n base-dir:\n default: "{cwd}"\n test-param: default: ""\noutput-dir: ┆"{}"`, + expected: [], + }, + ])("#%# Test addProp: $config", async ({ config, expected }) => { + await checkCompletionItems(config, false, expected); + }); +}); + +describe("Test completion items for extends", () => { + const path = resolveVirtualPath("workspace"); + it.each([ + { + config: `extends: "┆`, + expected: ["tspconfigtest0.yaml", "demo_yaml", "demo_tsp"], + }, + { + config: `extends: "./┆`, + expected: ["tspconfigtest0.yaml", "demo_yaml", "demo_tsp"], + }, + { + config: `extends: "./demo_yaml┆"`, + expected: ["tspconfigtest2.yaml"], + }, + { + config: `extends: "${path}┆"`, + expected: ["tspconfigtest0.yaml", "demo_yaml", "demo_tsp"], + }, + { + config: `extends: \n┆`, + expected: [ + "emit", + "environment-variables", + "imports", + "linter", + "options", + "output-dir", + "parameters", + "trace", + "warn-as-error", + ], + }, + { + config: `extends: "./demo┆"`, + expected: [], + }, + { + config: `extends: "./tspconfigtest0.yaml"┆`, + expected: [], + }, + { + config: `extends: "./┆demo"`, + expected: [], + }, + { + config: `extends: "${path}/demo┆"`, + expected: [], + }, + ])("#%# Test addProp: $config", async ({ config, expected }) => { + await checkCompletionItems(config, true, expected); + }); +}); + +describe("Test completion items for imports", () => { + const path = resolveVirtualPath("workspace/"); + it.each([ + { + config: `imports:\n - "./┆`, + expected: ["demo_yaml", "demo_tsp"], + }, + { + config: `imports:\n - "./demo_tsp"\n - "./┆`, + expected: ["demo_yaml"], + }, + { + config: `imports:\n - "./demo_tsp/┆`, + expected: ["test1.tsp", "test3.tsp"], + }, + { + config: `imports:\n - "./demo_tsp/test1.tsp"\n - "./demo_tsp/┆`, + expected: ["test3.tsp"], + }, + { + config: `imports:\n - "${path}┆`, + expected: ["demo_yaml", "demo_tsp"], + }, + { + config: `imports:\n - "┆./demo"`, + expected: [], + }, + { + config: `imports:\n - "${path}demo┆`, + expected: [], + }, + { + config: `imports:\n - "./demo_tsp/test┆`, + expected: [], + }, + { + config: `imports:\n "./┆"`, + expected: [], + }, + ])("#%# Test addProp: $config", async ({ config, expected }) => { + await checkCompletionItems(config, true, expected); + }); +}); + describe("Test completion items with comments", () => { it.each([ { @@ -428,11 +662,14 @@ async function checkCompletionItems( configWithPosition: string, includeWorkspace: boolean, expected: string[], + isTestDesc: boolean = false, tspconfigPathUnderWorkspace: string = "./tspconfig.yaml", ) { const items = (await complete(configWithPosition, includeWorkspace, tspconfigPathUnderWorkspace)) .items; - expect(items.map((i) => i.label).sort()).toEqual(expected.sort()); + isTestDesc + ? expect(items.map((i) => i.documentation ?? "").sort()).toEqual(expected.sort()) + : expect(items.map((i) => i.textEdit?.newText ?? i.label).sort()).toEqual(expected.sort()); } async function complete( diff --git a/packages/compiler/test/server/workspace/.gitignore b/packages/compiler/test/server/workspace/.gitignore index d994bdc059..8f513e6006 100644 --- a/packages/compiler/test/server/workspace/.gitignore +++ b/packages/compiler/test/server/workspace/.gitignore @@ -1,3 +1,7 @@ # not ignore here which is for testing !node_modules/ +!demo_tsp/ +!demo_yaml/ !**/package.json +!tspconfigtest0.yaml + \ No newline at end of file diff --git a/packages/compiler/test/server/workspace/demo_tsp/test1.tsp b/packages/compiler/test/server/workspace/demo_tsp/test1.tsp new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/compiler/test/server/workspace/demo_tsp/test3.tsp b/packages/compiler/test/server/workspace/demo_tsp/test3.tsp new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/compiler/test/server/workspace/demo_tsp/tspconfigtest1.yaml b/packages/compiler/test/server/workspace/demo_tsp/tspconfigtest1.yaml new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/compiler/test/server/workspace/demo_yaml/test2.tsp b/packages/compiler/test/server/workspace/demo_yaml/test2.tsp new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/compiler/test/server/workspace/demo_yaml/tspconfigtest2.yaml b/packages/compiler/test/server/workspace/demo_yaml/tspconfigtest2.yaml new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/compiler/test/server/workspace/node_modules/fake-emitter/lib/index.js b/packages/compiler/test/server/workspace/node_modules/fake-emitter/lib/index.js index 99190288ed..993eca2d5f 100644 --- a/packages/compiler/test/server/workspace/node_modules/fake-emitter/lib/index.js +++ b/packages/compiler/test/server/workspace/node_modules/fake-emitter/lib/index.js @@ -3,8 +3,8 @@ const EmitterOptionsSchema = { type: "object", additionalProperties: false, properties: { - "target-name": { type: "string", nullable: true }, - "is-valid": { type: "boolean", nullable: true }, + "target-name": { type: "string", nullable: true, description: "The name of the target to emit to." }, + "is-valid": { type: "boolean", nullable: true, description: "Whether the target is valid." }, "type": { type: "string", nullable: true, enum: ["a", "b", "c"] }, "options": { type: "object", @@ -61,7 +61,7 @@ const EmitterOptionsSchema = { } } }, - required: [], + required: ["target-name","type"], }; export const $lib = { diff --git a/packages/compiler/test/server/workspace/node_modules/fake-linter-no-schema/lib/index.js b/packages/compiler/test/server/workspace/node_modules/fake-linter-no-schema/lib/index.js new file mode 100644 index 0000000000..7f03c37a5d --- /dev/null +++ b/packages/compiler/test/server/workspace/node_modules/fake-linter-no-schema/lib/index.js @@ -0,0 +1,5 @@ +import { defineLinter } from "@typespec/compiler"; + +export const $linter = defineLinter({ + rules: [] +}); diff --git a/packages/compiler/test/server/workspace/node_modules/fake-linter-no-schema/package.json b/packages/compiler/test/server/workspace/node_modules/fake-linter-no-schema/package.json new file mode 100644 index 0000000000..f2a60f8b9c --- /dev/null +++ b/packages/compiler/test/server/workspace/node_modules/fake-linter-no-schema/package.json @@ -0,0 +1,33 @@ +{ + "name": "fake-linter-no-schema", + "version": "0.1.2", + "main": "lib/index.js", + "dependencies": { + "@readme/openapi-parser": "~2.6.0", + "yaml": "~2.4.5" + }, + "peerDependencies": { + "@typespec/compiler": "~0.60.0", + "@typespec/http": "~0.60.0", + "@typespec/openapi": "~0.60.0", + "@typespec/versioning": "~0.60.0" + }, + "devDependencies": { + "@types/node": "~18.11.19", + "@types/yargs": "~17.0.32", + "@vitest/coverage-v8": "^2.0.4", + "@vitest/ui": "^2.0.4", + "c8": "^10.1.2", + "cross-env": "~7.0.3", + "rimraf": "~6.0.1", + "typescript": "~5.5.4", + "vitest": "^2.0.4", + "@typespec/compiler": "~0.60.0", + "@typespec/http": "~0.60.0", + "@typespec/library-linter": "~0.60.0", + "@typespec/openapi": "~0.60.0", + "@typespec/rest": "~0.60.0", + "@typespec/tspd": "~0.46.0", + "@typespec/versioning": "~0.60.0" + } +} diff --git a/packages/compiler/test/server/workspace/node_modules/fake-linter/lib/index.js b/packages/compiler/test/server/workspace/node_modules/fake-linter/lib/index.js new file mode 100644 index 0000000000..a2d335b063 --- /dev/null +++ b/packages/compiler/test/server/workspace/node_modules/fake-linter/lib/index.js @@ -0,0 +1,24 @@ +import { createRule ,defineLinter } from "@typespec/compiler"; + + +export const requiredDocRule = createRule({ + name: "no-model-doc", + severity: "warning", +}); +export const casingRule = createRule({ + name: "casing", + severity: "warning", +}); +export const testingRule = createRule({ + name: "testing", + severity: "warning", +}); + +export const $linter = defineLinter({ + rules: [requiredDocRule,casingRule,testingRule], + ruleSets: { + recommended: { + enable: {[`fake-linter/${testingRule.name}`]: true} + } + } +}); diff --git a/packages/compiler/test/server/workspace/node_modules/fake-linter/package.json b/packages/compiler/test/server/workspace/node_modules/fake-linter/package.json new file mode 100644 index 0000000000..48e6636c53 --- /dev/null +++ b/packages/compiler/test/server/workspace/node_modules/fake-linter/package.json @@ -0,0 +1,33 @@ +{ + "name": "fake-linter", + "version": "0.0.2", + "main": "lib/index.js", + "dependencies": { + "@readme/openapi-parser": "~2.6.0", + "yaml": "~2.4.5" + }, + "peerDependencies": { + "@typespec/compiler": "~0.60.0", + "@typespec/http": "~0.60.0", + "@typespec/openapi": "~0.60.0", + "@typespec/versioning": "~0.60.0" + }, + "devDependencies": { + "@types/node": "~18.11.19", + "@types/yargs": "~17.0.32", + "@vitest/coverage-v8": "^2.0.4", + "@vitest/ui": "^2.0.4", + "c8": "^10.1.2", + "cross-env": "~7.0.3", + "rimraf": "~6.0.1", + "typescript": "~5.5.4", + "vitest": "^2.0.4", + "@typespec/compiler": "~0.60.0", + "@typespec/http": "~0.60.0", + "@typespec/library-linter": "~0.60.0", + "@typespec/openapi": "~0.60.0", + "@typespec/rest": "~0.60.0", + "@typespec/tspd": "~0.46.0", + "@typespec/versioning": "~0.60.0" + } +} diff --git a/packages/compiler/test/server/workspace/package.json b/packages/compiler/test/server/workspace/package.json index 81d5d56bc4..a117767823 100644 --- a/packages/compiler/test/server/workspace/package.json +++ b/packages/compiler/test/server/workspace/package.json @@ -9,10 +9,12 @@ "author": "", "license": "ISC", "devDependencies": { - "fake-emitter-no-schema": "0.1.2" + "fake-emitter-no-schema": "0.1.2", + "fake-linter-no-schema": "0.1.2" }, "dependencies": { "fake-emitter": "0.0.2", + "fake-linter": "0.0.2", "fake-yaml": "0.0.1", "not-exist": "0.0.1" } diff --git a/packages/compiler/test/server/workspace/tspconfigtest0.yaml b/packages/compiler/test/server/workspace/tspconfigtest0.yaml new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/eslint-plugin-typespec/package.json b/packages/eslint-plugin-typespec/package.json index 88a777663a..d1b472558e 100644 --- a/packages/eslint-plugin-typespec/package.json +++ b/packages/eslint-plugin-typespec/package.json @@ -40,17 +40,17 @@ "eslint": "^9.18.0" }, "devDependencies": { - "@types/node": "~22.10.7", + "@types/node": "~22.10.10", "@typescript-eslint/parser": "^8.21.0", "@typescript-eslint/rule-tester": "^8.21.0", "@typescript-eslint/types": "^8.21.0", - "@vitest/coverage-v8": "^3.0.3", + "@vitest/coverage-v8": "^3.0.4", "@vitest/ui": "^3.0.3", "c8": "^10.1.3", "eslint": "^9.18.0", "rimraf": "~6.0.1", "typescript": "~5.7.3", - "vitest": "^3.0.3" + "vitest": "^3.0.4" }, "dependencies": { "@typescript-eslint/utils": "^8.21.0" diff --git a/packages/events/package.json b/packages/events/package.json index 8549d3196b..8a331bca2e 100644 --- a/packages/events/package.json +++ b/packages/events/package.json @@ -56,15 +56,15 @@ "@typespec/compiler": "workspace:~" }, "devDependencies": { - "@types/node": "~22.10.7", + "@types/node": "~22.10.10", "@typespec/compiler": "workspace:~", "@typespec/library-linter": "workspace:~", "@typespec/tspd": "workspace:~", - "@vitest/coverage-v8": "^3.0.3", + "@vitest/coverage-v8": "^3.0.4", "@vitest/ui": "^3.0.3", "c8": "^10.1.3", "rimraf": "~6.0.1", "typescript": "~5.7.3", - "vitest": "^3.0.3" + "vitest": "^3.0.4" } } diff --git a/packages/events/src/decorators.ts b/packages/events/src/decorators.ts index 1a2e7c6146..834b707ddf 100644 --- a/packages/events/src/decorators.ts +++ b/packages/events/src/decorators.ts @@ -1,5 +1,5 @@ import { type ModelProperty, type Union, type UnionVariant } from "@typespec/compiler"; -import { unsafe_useStateMap, unsafe_useStateSet } from "@typespec/compiler/experimental"; +import { useStateMap, useStateSet } from "@typespec/compiler/utils"; import type { ContentTypeDecorator, DataDecorator, @@ -7,7 +7,7 @@ import type { } from "../generated-defs/TypeSpec.Events.js"; import { EventsStateKeys } from "./lib.js"; -const [isEvents, setEvents] = unsafe_useStateSet(EventsStateKeys.events); +const [isEvents, setEvents] = useStateSet(EventsStateKeys.events); export const $eventsDecorator: EventsDecorator = (context, target) => { setEvents(context.program, target); @@ -15,7 +15,7 @@ export const $eventsDecorator: EventsDecorator = (context, target) => { export { isEvents }; -const [getContentType, setContentType] = unsafe_useStateMap( +const [getContentType, setContentType] = useStateMap( EventsStateKeys.contentType, ); @@ -25,7 +25,7 @@ export const $contentTypeDecorator: ContentTypeDecorator = (context, target, con export { getContentType }; -const [isEventData, setEventData] = unsafe_useStateSet(EventsStateKeys.data); +const [isEventData, setEventData] = useStateSet(EventsStateKeys.data); export const $dataDecorator: DataDecorator = (context, target) => { setEventData(context.program, target); diff --git a/packages/html-program-viewer/package.json b/packages/html-program-viewer/package.json index 4ef0b46ec1..14fc1e665e 100644 --- a/packages/html-program-viewer/package.json +++ b/packages/html-program-viewer/package.json @@ -63,13 +63,13 @@ "@testing-library/dom": "^10.4.0", "@testing-library/jest-dom": "^6.6.3", "@testing-library/react": "^16.2.0", - "@types/node": "~22.10.7", + "@types/node": "~22.10.10", "@types/react": "~18.3.11", "@types/react-dom": "~18.3.0", "@typespec/compiler": "workspace:~", "@typespec/react-components": "workspace:~", "@vitejs/plugin-react": "~4.3.4", - "@vitest/coverage-v8": "^3.0.3", + "@vitest/coverage-v8": "^3.0.4", "@vitest/ui": "^3.0.3", "c8": "^10.1.3", "rimraf": "~6.0.1", @@ -77,6 +77,6 @@ "vite": "^6.0.11", "vite-plugin-checker": "^0.8.0", "vite-plugin-dts": "4.5.0", - "vitest": "^3.0.3" + "vitest": "^3.0.4" } } diff --git a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp.ClientModel/src/Providers/MrwSerializationTypeDefinition.cs b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp.ClientModel/src/Providers/MrwSerializationTypeDefinition.cs index 01ea3e209a..6c031ccbb5 100644 --- a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp.ClientModel/src/Providers/MrwSerializationTypeDefinition.cs +++ b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp.ClientModel/src/Providers/MrwSerializationTypeDefinition.cs @@ -762,8 +762,8 @@ private List BuildDeserializePropertiesStatements(ScopedApi var parameters = SerializationConstructor.Signature.Parameters; // Parse the custom serialization attributes - List serializationAttributes = _model.CustomCodeView?.GetAttributes() - .Where(a => a.AttributeClass?.Name == CodeGenAttributes.CodeGenSerializationAttributeName) + List serializationAttributes = _model.CustomCodeView?.Attributes + .Where(a => a.Type.Name == CodeGenAttributes.CodeGenSerializationAttributeName) .ToList() ?? []; var baseModelProvider = _model.BaseModelProvider; @@ -773,8 +773,8 @@ private List BuildDeserializePropertiesStatements(ScopedApi if (customCodeView != null) { serializationAttributes - .AddRange(customCodeView.GetAttributes() - .Where(a => a.AttributeClass?.Name == CodeGenAttributes.CodeGenSerializationAttributeName)); + .AddRange(customCodeView.Attributes + .Where(a => a.Type.Name == CodeGenAttributes.CodeGenSerializationAttributeName)); } baseModelProvider = baseModelProvider.BaseModelProvider; } @@ -1111,7 +1111,7 @@ private MethodBodyStatement[] DeserializeProperty( PropertyWireInformation wireInfo, VariableExpression variableExpression, ScopedApi jsonProperty, - IEnumerable serializationAttributes) + IEnumerable serializationAttributes) { bool useCustomDeserializationHook = false; var serializationFormat = wireInfo.SerializationFormat; @@ -1410,8 +1410,8 @@ private MethodBodyStatement CreateWritePropertyStatement( var serializationStatement = CreateSerializationStatement(propertyType, propertyExpression, propertySerializationFormat); // Check for custom serialization hooks - foreach (var attribute in _model.CustomCodeView?.GetAttributes() - .Where(a => a.AttributeClass?.Name == CodeGenAttributes.CodeGenSerializationAttributeName) ?? []) + foreach (var attribute in _model.CustomCodeView?.Attributes + .Where(a => a.Type.Name == CodeGenAttributes.CodeGenSerializationAttributeName) ?? []) { if (CodeGenAttributes.TryGetCodeGenSerializationAttributeValue( attribute, diff --git a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Configuration.cs b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Configuration.cs index 9ae7f9620f..edd58649af 100644 --- a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Configuration.cs +++ b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Configuration.cs @@ -150,7 +150,10 @@ private static class Options /// Gets the namespace for the models. public string ModelNamespace { get; } - internal string OutputDirectory { get; } + /// + /// Gets the root output directory for the generated library. + /// + public string OutputDirectory { get; } internal static UnreferencedTypesHandlingOption UnreferencedTypesHandling { get; private set; } = UnreferencedTypesHandlingOption.RemoveOrInternalize; diff --git a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Providers/CanonicalTypeProvider.cs b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Providers/CanonicalTypeProvider.cs index dc8c8caf93..2a19653c76 100644 --- a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Providers/CanonicalTypeProvider.cs +++ b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Providers/CanonicalTypeProvider.cs @@ -295,10 +295,8 @@ private bool TryGetCandidateSpecProperty(FieldProvider customField, [NotNullWhen private Dictionary BuildSerializationNameMap() { - var serializationAttributes = _generatedTypeProvider.CustomCodeView?.GetAttributes(). - Where(a => a.AttributeClass?.Name == CodeGenAttributes.CodeGenSerializationAttributeName) ?? []; var serializedNameMapping = new Dictionary(); - foreach (var serializationAttribute in serializationAttributes) + foreach (var serializationAttribute in _generatedTypeProvider.CustomCodeView?.Attributes ?? []) { if (CodeGenAttributes.TryGetCodeGenSerializationAttributeValue( serializationAttribute, diff --git a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Providers/NamedTypeSymbolProvider.cs b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Providers/NamedTypeSymbolProvider.cs index 995914b902..4bbdd1df49 100644 --- a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Providers/NamedTypeSymbolProvider.cs +++ b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Providers/NamedTypeSymbolProvider.cs @@ -13,7 +13,7 @@ namespace Microsoft.Generator.CSharp.Providers { - public sealed class NamedTypeSymbolProvider : TypeProvider + internal sealed class NamedTypeSymbolProvider : TypeProvider { private INamedTypeSymbol _namedTypeSymbol; @@ -30,7 +30,8 @@ public NamedTypeSymbolProvider(INamedTypeSymbol namedTypeSymbol) protected override string BuildNamespace() => _namedTypeSymbol.ContainingNamespace.GetFullyQualifiedNameFromDisplayString(); - public IEnumerable GetAttributes() => _namedTypeSymbol.GetAttributes(); + protected override IReadOnlyList BuildAttributes() + => [.._namedTypeSymbol.GetAttributes().Select(a => new AttributeStatement(a))]; protected override TypeSignatureModifiers BuildDeclarationModifiers() { diff --git a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Providers/TypeProvider.cs b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Providers/TypeProvider.cs index 3212fda97f..91965ae0d0 100644 --- a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Providers/TypeProvider.cs +++ b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Providers/TypeProvider.cs @@ -16,7 +16,7 @@ namespace Microsoft.Generator.CSharp.Providers { public abstract class TypeProvider { - private Lazy _customCodeView; + private Lazy _customCodeView; private Lazy _canonicalView; private readonly InputType? _inputType; @@ -34,10 +34,10 @@ protected TypeProvider() : this(null) { } - private protected virtual NamedTypeSymbolProvider? GetCustomCodeView() + private protected virtual TypeProvider? GetCustomCodeView() => CodeModelPlugin.Instance.SourceInputModel.FindForType(BuildNamespace(), BuildName()); - public NamedTypeSymbolProvider? CustomCodeView => _customCodeView.Value; + public TypeProvider? CustomCodeView => _customCodeView.Value; private IReadOnlyList BuildAllCustomProperties() { @@ -601,6 +601,7 @@ private static FileLinePositionSpan GetFileLinePosition(SyntaxReference? syntaxR => syntaxReference?.SyntaxTree.GetLocation(syntaxReference.Span).GetLineSpan() ?? default; private IEnumerable GetMemberSuppressionAttributes() - => CustomCodeView?.GetAttributes()?.Where(a => a.AttributeClass?.Name == CodeGenAttributes.CodeGenSuppressAttributeName) ?? []; + => CustomCodeView?.Attributes.Where(a => a.Data?.AttributeClass?.Name == CodeGenAttributes.CodeGenSuppressAttributeName). + Select(a => a.Data!).ToList() ?? []; } } diff --git a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/SourceInput/CodeGenAttributes.cs b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/SourceInput/CodeGenAttributes.cs index 8becbc26fc..8eb66262e7 100644 --- a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/SourceInput/CodeGenAttributes.cs +++ b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/SourceInput/CodeGenAttributes.cs @@ -1,12 +1,12 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -using System.Collections.Generic; using System.Collections.Immutable; using System.Diagnostics.CodeAnalysis; using System.Linq; using Microsoft.CodeAnalysis; using Microsoft.Generator.CSharp.Customization; +using Microsoft.Generator.CSharp.Statements; namespace Microsoft.Generator.CSharp.SourceInput { @@ -24,7 +24,7 @@ public static class CodeGenAttributes public const string CodeGenSerializationAttributeName = "CodeGenSerializationAttribute"; - public static bool TryGetCodeGenMemberAttributeValue(AttributeData attributeData, [MaybeNullWhen(false)] out string name) + internal static bool TryGetCodeGenMemberAttributeValue(AttributeData attributeData, [MaybeNullWhen(false)] out string name) { name = null; if (attributeData.AttributeClass?.Name != CodeGenMemberAttributeName) @@ -34,14 +34,15 @@ public static bool TryGetCodeGenMemberAttributeValue(AttributeData attributeData return name != null; } - public static bool TryGetCodeGenSerializationAttributeValue(AttributeData attributeData, [MaybeNullWhen(false)] out string propertyName, out string? serializationName, out string? serializationHook, out string? deserializationHook, out string? bicepSerializationHook) + public static bool TryGetCodeGenSerializationAttributeValue(AttributeStatement attribute, [MaybeNullWhen(false)] out string propertyName, out string? serializationName, out string? serializationHook, out string? deserializationHook, out string? bicepSerializationHook) { propertyName = null; serializationName = null; serializationHook = null; deserializationHook = null; bicepSerializationHook = null; - if (attributeData.AttributeClass?.Name != CodeGenSerializationAttributeName) + var attributeData = attribute.Data; + if (attributeData!.AttributeClass?.Name != CodeGenSerializationAttributeName) { return false; } @@ -79,7 +80,7 @@ public static bool TryGetCodeGenSerializationAttributeValue(AttributeData attrib return propertyName != null && (serializationName != null || serializationHook != null || deserializationHook != null || bicepSerializationHook != null); } - public static bool TryGetCodeGenModelAttributeValue(AttributeData attributeData, out string[]? usage, out string[]? formats) + internal static bool TryGetCodeGenModelAttributeValue(AttributeData attributeData, out string[]? usage, out string[]? formats) { usage = null; formats = null; diff --git a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/SourceInput/SourceInputModel.cs b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/SourceInput/SourceInputModel.cs index 11deff98e2..eb82c9f3d3 100644 --- a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/SourceInput/SourceInputModel.cs +++ b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/SourceInput/SourceInputModel.cs @@ -53,7 +53,7 @@ private IReadOnlyDictionary PopulateNameMap() return nameMap; } - public NamedTypeSymbolProvider? FindForType(string ns, string name) + public TypeProvider? FindForType(string ns, string name) { if (Customization == null) { diff --git a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Statements/AttributeStatement.cs b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Statements/AttributeStatement.cs index 8e02ad3c3f..5fb6ccbd2c 100644 --- a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Statements/AttributeStatement.cs +++ b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Statements/AttributeStatement.cs @@ -1,23 +1,36 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. +using System; using System.Collections.Generic; +using System.Linq; +using Microsoft.CodeAnalysis; using Microsoft.Generator.CSharp.Expressions; using Microsoft.Generator.CSharp.Primitives; +using static Microsoft.Generator.CSharp.Snippets.Snippet; namespace Microsoft.Generator.CSharp.Statements { public sealed class AttributeStatement : MethodBodyStatement { - public CSharpType Type { get; } - public IReadOnlyList Arguments { get; } - public IReadOnlyList> PositionalArguments { get; } + public CSharpType Type => _type ??= Data!.AttributeClass!.GetCSharpType(); + private CSharpType? _type; + + public IReadOnlyList Arguments + => _arguments ??= Data!.ConstructorArguments.SelectMany(ConvertArgumentToValueExpression).ToList(); + private IReadOnlyList? _arguments; + + public IReadOnlyList> PositionalArguments + => _positionalArguments ??= Data!.NamedArguments.Select(a => new KeyValuePair(a.Key, ConvertArgumentToValueExpression(a.Value)[0])).ToList(); + private IReadOnlyList>? _positionalArguments; + + internal AttributeData? Data { get; } public AttributeStatement(CSharpType type, IReadOnlyList arguments, IReadOnlyList> positionalArguments) { - Type = type; - Arguments = arguments; - PositionalArguments = positionalArguments; + _type = type; + _arguments = arguments; + _positionalArguments = positionalArguments; } public AttributeStatement(CSharpType type, IReadOnlyList arguments) : this(type, arguments, []) { } @@ -26,6 +39,23 @@ public AttributeStatement(CSharpType type, IReadOnlyList ConvertArgumentToValueExpression(TypedConstant argument) + { + return argument.Kind switch + { + TypedConstantKind.Primitive => [Literal(argument.Value)], + TypedConstantKind.Enum => [Literal(argument.Value)], + TypedConstantKind.Type => [TypeOf(((ITypeSymbol)argument.Value!).GetCSharpType())], + TypedConstantKind.Array => [..argument.Values.SelectMany(ConvertArgumentToValueExpression)], + _ => throw new NotSupportedException($"Unsupported argument kind: {argument.Kind}") + }; + } + internal override void Write(CodeWriter writer) { writer.Append($"[{Type}"); diff --git a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/Providers/ModelProviders/ClientCustomizationTests.cs b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/Providers/ModelProviders/ClientCustomizationTests.cs index 9cfdb9849b..c144ced4f0 100644 --- a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/Providers/ModelProviders/ClientCustomizationTests.cs +++ b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/Providers/ModelProviders/ClientCustomizationTests.cs @@ -226,6 +226,33 @@ [new ParameterProvider("param1", $"", typeof(bool))]), Assert.AreEqual(3, plugin.Object.OutputLibrary.TypeProviders.Single(t => t.Name == "MockInputClient").Constructors.Count); } + [Test] + public async Task CustomCodeAttributesAreLoadedIntoAttributeStatements() + { + var client = new ClientTypeProvider(); + + var outputLibrary = new ClientOutputLibrary(client); + var plugin = await MockHelpers.LoadMockPluginAsync( + createOutputLibrary: () => outputLibrary, + compilation: async () => await Helpers.GetCompilationFromDirectoryAsync()); + + var csharpGen = new CSharpGen(); + await csharpGen.ExecuteAsync(); + + var attributes = plugin.Object.OutputLibrary.TypeProviders.Single(t => t.Name == "MockInputClient").CustomCodeView!.Attributes; + Assert.AreEqual(4, attributes.Count); + Assert.AreEqual("[global::Microsoft.Generator.CSharp.Customization.CodeGenSuppressAttribute(\"MockInputClient\")]\n", attributes[0].ToDisplayString()); + Assert.AreEqual("[global::Microsoft.Generator.CSharp.Customization.CodeGenSuppressAttribute(\"MockInputClient\", typeof(bool))]\n", attributes[1].ToDisplayString()); + Assert.AreEqual("[global::Microsoft.Generator.CSharp.Customization.CodeGenSuppressAttribute(\"MockInputClient\", typeof(bool), typeof(int))]\n", attributes[2].ToDisplayString()); + Assert.AreEqual("[global::Microsoft.Generator.CSharp.Customization.CodeGenSerializationAttribute(\"MockInputClient\", SerializationValueHook = \"foo\", DeserializationValueHook = \"bar\")]\n", attributes[3].ToDisplayString()); + + // validate that the properties are cached + Assert.AreSame(attributes[0].Type, attributes[0].Type); + Assert.AreSame(attributes[0].Arguments, attributes[0].Arguments); + Assert.AreSame(attributes[0].PositionalArguments, attributes[0].PositionalArguments); + + } + private class ClientOutputLibrary : OutputLibrary { private readonly ClientTypeProvider _client; diff --git a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/Providers/ModelProviders/TestData/ClientCustomizationTests/CustomCodeAttributesAreLoadedIntoAttributeStatements/MockInputClient.cs b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/Providers/ModelProviders/TestData/ClientCustomizationTests/CustomCodeAttributesAreLoadedIntoAttributeStatements/MockInputClient.cs new file mode 100644 index 0000000000..23cae09942 --- /dev/null +++ b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/Providers/ModelProviders/TestData/ClientCustomizationTests/CustomCodeAttributesAreLoadedIntoAttributeStatements/MockInputClient.cs @@ -0,0 +1,12 @@ +using System.Collections.Generic; +using Microsoft.Generator.CSharp.Customization; + +namespace Sample; + +[CodeGenSuppress("MockInputClient"] +[CodeGenSuppress("MockInputClient", typeof(bool))] +[CodeGenSuppress("MockInputClient", typeof(bool), typeof(int))] +[CodeGenSerialization("MockInputClient", SerializationValueHook = "foo", DeserializationValueHook = "bar"] +public partial class MockInputClient +{ +} diff --git a/packages/http-client-java/emitter/src/code-model-builder.ts b/packages/http-client-java/emitter/src/code-model-builder.ts index 6b91e02c22..2bfd89326d 100644 --- a/packages/http-client-java/emitter/src/code-model-builder.ts +++ b/packages/http-client-java/emitter/src/code-model-builder.ts @@ -68,16 +68,17 @@ import { SdkUnionType, createSdkContext, getAllModels, - getWireName, isApiVersion, isSdkBuiltInKind, isSdkIntKind, } from "@azure-tools/typespec-client-generator-core"; import { EmitContext, + Interface, Model, ModelProperty, Namespace, + NoTarget, Operation, Program, Type, @@ -99,13 +100,7 @@ import { HttpStatusCodesEntry, Visibility, getAuthentication, - getHeaderFieldName, - getPathParamName, - getQueryParamName, isCookieParam, - isHeader, - isPathParam, - isQueryParam, } from "@typespec/http"; import { getSegment } from "@typespec/rest"; import { getAddedOnVersions } from "@typespec/versioning"; @@ -120,8 +115,8 @@ import { ConstantSchema, ConstantValue } from "./common/schemas/constant.js"; import { OrSchema } from "./common/schemas/relationship.js"; import { DurationSchema } from "./common/schemas/time.js"; import { SchemaContext, SchemaUsage } from "./common/schemas/usage.js"; -import { EmitterOptions } from "./emitter.js"; import { createPollOperationDetailsSchema, getFileDetailsSchema } from "./external-schemas.js"; +import { EmitterOptions, createDiagnostic, reportDiagnostic } from "./lib.js"; import { ClientContext } from "./models.js"; import { CONTENT_TYPE_KEY, @@ -148,9 +143,8 @@ import { pushDistinct, } from "./type-utils.js"; import { + DiagnosticError, getNamespace, - logError, - logWarning, pascalCase, removeClientSuffix, stringArrayContainsIgnoreCase, @@ -193,7 +187,10 @@ export class CodeModelBuilder { const service = listServices(this.program)[0]; if (!service) { - this.logWarning("TypeSpec for HTTP client should define a service."); + reportDiagnostic(this.program, { + code: "no-service", + target: NoTarget, + }); } this.serviceNamespace = service?.type ?? this.program.getGlobalNamespaceType(); @@ -259,7 +256,7 @@ export class CodeModelBuilder { // TODO: it is not very likely, but different client could have different auth const auth = getAuthentication(this.program, this.serviceNamespace); if (auth) { - this.processAuth(auth); + this.processAuth(auth, this.serviceNamespace); } if (this.sdkContext.arm) { @@ -315,7 +312,7 @@ export class CodeModelBuilder { return hostParameters; } - private processAuth(auth: Authentication) { + private processAuth(auth: Authentication, serviceNamespace: Namespace | Interface | Operation) { const securitySchemes: SecurityScheme[] = []; for (const option of auth.options) { for (const scheme of option.schemes) { @@ -332,7 +329,11 @@ export class CodeModelBuilder { securitySchemes.push(oauth2Scheme); } else { // there is no TokenCredential in clientcore, hence use Bearer Authentication directly - this.logWarning(`OAuth2 auth scheme is generated as KeyCredential.`); + reportDiagnostic(this.program, { + code: "auth-scheme-not-supported", + messageId: "oauth2Unbranded", + target: serviceNamespace, + }); const keyScheme = new KeySecurityScheme({ name: "authorization", @@ -351,9 +352,11 @@ export class CodeModelBuilder { }); securitySchemes.push(keyScheme); } else { - this.logWarning( - `ApiKey auth is currently only supported for ApiKeyLocation.header.`, - ); + reportDiagnostic(this.program, { + code: "auth-scheme-not-supported", + messageId: "apiKeyLocation", + target: serviceNamespace, + }); } } break; @@ -367,9 +370,12 @@ export class CodeModelBuilder { if (this.isBranded()) { // Azure would not allow BasicAuth or BearerAuth - this.logWarning( - `HTTP auth with ${scheme.scheme} scheme is not supported for Azure.`, - ); + reportDiagnostic(this.program, { + code: "auth-scheme-not-supported", + messageId: "basicAuthBranded", + format: { scheme: scheme.scheme }, + target: serviceNamespace, + }); continue; } } @@ -561,7 +567,11 @@ export class CodeModelBuilder { } else { this.apiVersion = versions.find((it: string) => it === this.sdkContext.apiVersion); if (!this.apiVersion) { - this.logError("Unrecognized api-version: " + this.sdkContext.apiVersion); + reportDiagnostic(this.program, { + code: "invalid-api-version", + format: { apiVersion: this.sdkContext.apiVersion }, + target: NoTarget, + }); } } @@ -593,7 +603,10 @@ export class CodeModelBuilder { } } } else if (initializationProperty.type.variantTypes.length > 2) { - this.logError("Multiple server URL defined for one client is not supported yet."); + reportDiagnostic(this.program, { + code: "multiple-server-not-supported", + target: initializationProperty.type.__raw ?? NoTarget, + }); } } else if (initializationProperty.type.kind === "endpoint") { sdkPathParameters = initializationProperty.type.templateArguments; @@ -830,36 +843,51 @@ export class CodeModelBuilder { let generateConvenienceApi: boolean = sdkMethod.generateConvenient; let generateProtocolApi: boolean = sdkMethod.generateProtocol; - let apiComment: string | undefined = undefined; + let diagnostic = undefined; if (generateConvenienceApi) { // check if the convenience API need to be disabled for some special cases if (operationIsMultipart(httpOperation)) { // do not generate protocol method for multipart/form-data, as it be very hard for user to prepare the request body as BinaryData generateProtocolApi = false; - apiComment = `Protocol API requires serialization of parts with content-disposition and data, as operation '${operationName}' is 'multipart/form-data'`; - this.logWarning(apiComment); + diagnostic = createDiagnostic({ + code: "protocol-api-not-generated", + messageId: "multipartFormData", + format: { operationName: operationName }, + target: sdkMethod.__raw ?? NoTarget, + }); + this.program.reportDiagnostic(diagnostic); } else if (operationIsMultipleContentTypes(httpOperation)) { // and multiple content types // issue link: https://github.com/Azure/autorest.java/issues/1958#issuecomment-1562558219 generateConvenienceApi = false; - apiComment = `Convenience API is not generated, as operation '${operationName}' is multiple content-type`; - this.logWarning(apiComment); + diagnostic = createDiagnostic({ + code: "convenience-api-not-generated", + messageId: "multipleContentType", + format: { operationName: operationName }, + target: sdkMethod.__raw ?? NoTarget, + }); + this.program.reportDiagnostic(diagnostic); } else if ( operationIsJsonMergePatch(httpOperation) && this.options["stream-style-serialization"] === false ) { // do not generate convenient method for json merge patch operation if stream-style-serialization is not enabled generateConvenienceApi = false; - apiComment = `Convenience API is not generated, as operation '${operationName}' is 'application/merge-patch+json' and stream-style-serialization is not enabled`; - this.logWarning(apiComment); + diagnostic = createDiagnostic({ + code: "convenience-api-not-generated", + messageId: "jsonMergePatch", + format: { operationName: operationName }, + target: sdkMethod.__raw ?? NoTarget, + }); + this.program.reportDiagnostic(diagnostic); } } if (generateConvenienceApi && convenienceApiName) { codeModelOperation.convenienceApi = new ConvenienceApi(convenienceApiName); } - if (apiComment) { + if (diagnostic) { codeModelOperation.language.java = new Language(); - codeModelOperation.language.java.comment = apiComment; + codeModelOperation.language.java.comment = diagnostic.message; } // check for generating protocol api or not @@ -1081,11 +1109,12 @@ export class CodeModelBuilder { lroMetadata.finalResponse.envelopeResult.properties?.forEach((p) => { // TODO: "p.__raw?.name" should be "p.name", after TCGC fix https://github.com/Azure/typespec-azure/issues/2072 if ( + !finalResultPropertySerializedName && p.kind === "property" && - p.serializedName && + p.serializationOptions.json?.name && p.__raw?.name === finalResultPropertyClientName ) { - finalResultPropertySerializedName = p.serializedName; + finalResultPropertySerializedName = p.serializationOptions.json?.name; } }); } @@ -1247,7 +1276,11 @@ export class CodeModelBuilder { default: if (format) { - this.logWarning(`Unrecognized header parameter format: '${format}'.`); + reportDiagnostic(this.program, { + code: "header-parameter-format-not-supported", + format: { format: format }, + target: param.__raw ?? NoTarget, + }); } break; } @@ -1879,9 +1912,12 @@ export class CodeModelBuilder { } } } - const errorMsg = `Unrecognized type: '${type.kind}'.`; - this.logError(errorMsg); - throw new Error(errorMsg); + const diagnostic = createDiagnostic({ + code: "unrecognized-type", + format: { typeKind: type.kind }, + target: type.__raw ?? NoTarget, + }); + throw new DiagnosticError(diagnostic); } private processBuiltInType(type: SdkBuiltInType, nameHint: string): Schema { @@ -2295,24 +2331,38 @@ export class CodeModelBuilder { schema = this.processSchema(nonNullType, ""); } + const getPropertySerializedName = (property: SdkBodyModelPropertyType) => { + // TODO: remove the "property.serializedName" after bug https://github.com/microsoft/typespec/pull/5702 is fixed + return ( + property.serializationOptions.json?.name ?? + property.serializationOptions.multipart?.name ?? + property.serializedName + ); + }; + return new Property(prop.name, prop.doc ?? "", schema, { summary: prop.summary, required: !prop.optional, nullable: nullable, readOnly: this.isReadOnly(prop), - serializedName: prop.kind === "property" ? prop.serializedName : undefined, + serializedName: prop.kind === "property" ? getPropertySerializedName(prop) : undefined, extensions: extensions, }); } private processUnionSchema(type: SdkUnionType, name: string): Schema { if (!(type.__raw && type.__raw.kind === "Union")) { - this.logError(`Invalid type for union: '${type.kind}'.`); + reportDiagnostic(this.program, { + code: "unrecognized-type", + messageId: "unionType", + format: { typeKind: type.kind }, + target: type.__raw ?? NoTarget, + }); } const rawUnionType: Union = type.__raw as Union; const namespace = getNamespace(rawUnionType); const baseName = type.name ?? pascalCase(name) + "Model"; - this.logWarning( + this.trace( `Convert TypeSpec Union '${getUnionDescription(rawUnionType, this.typeNameOptions)}' to Class '${baseName}'`, ); const unionSchema = new OrSchema(baseName + "Base", type.doc ?? "", { @@ -2360,7 +2410,7 @@ export class CodeModelBuilder { private getUnionVariantName(type: Type | undefined, option: any): string { if (type === undefined) { - this.logWarning("Union variant type is undefined."); + this.trace("Union variant type is undefined."); return "UnionVariant"; } switch (type.kind) { @@ -2413,7 +2463,7 @@ export class CodeModelBuilder { case "UnionVariant": return (typeof type.name === "string" ? type.name : undefined) ?? "UnionVariant"; default: - this.logWarning(`Unrecognized type for union variable: '${type.kind}'.`); + this.trace(`Unrecognized type for union variable: '${type.kind}'.`); return "UnionVariant"; } } @@ -2461,9 +2511,13 @@ export class CodeModelBuilder { }, ); } else { - const errorMsg = `Invalid type for multipart form data: '${property.type.kind}'.`; - this.logError(errorMsg); - throw new Error(errorMsg); + const diagnostic = createDiagnostic({ + code: "unrecognized-type", + messageId: "multipartFormData", + format: { typeKind: property.type.kind }, + target: property.type.__raw ?? NoTarget, + }); + throw new DiagnosticError(diagnostic); } } @@ -2475,19 +2529,6 @@ export class CodeModelBuilder { return target ? getSummary(this.program, target) : undefined; } - private getSerializedName(target: ModelProperty): string { - if (isHeader(this.program, target)) { - return getHeaderFieldName(this.program, target); - } else if (isQueryParam(this.program, target)) { - return getQueryParamName(this.program, target); - } else if (isPathParam(this.program, target)) { - return getPathParamName(this.program, target); - } else { - // TODO: currently this is only for JSON - return getWireName(this.sdkContext, target); - } - } - private isReadOnly(target: SdkModelPropertyType): boolean { const segment = target.__raw ? getSegment(this.program, target.__raw) !== undefined : false; if (segment) { @@ -2618,14 +2659,6 @@ export class CodeModelBuilder { } } - private logError(msg: string) { - logError(this.program, msg); - } - - private logWarning(msg: string) { - logWarning(this.program, msg); - } - private trace(msg: string) { trace(this.program, msg); } diff --git a/packages/http-client-java/emitter/src/emitter.ts b/packages/http-client-java/emitter/src/emitter.ts index 8c8929bc97..fb47cc4cb1 100644 --- a/packages/http-client-java/emitter/src/emitter.ts +++ b/packages/http-client-java/emitter/src/emitter.ts @@ -1,124 +1,19 @@ -import { - createTypeSpecLibrary, - EmitContext, - getNormalizedAbsolutePath, - JSONSchemaType, - resolvePath, -} from "@typespec/compiler"; +import { EmitContext, getNormalizedAbsolutePath, NoTarget, resolvePath } from "@typespec/compiler"; import { promises } from "fs"; import { dump } from "js-yaml"; import { dirname } from "path"; import { fileURLToPath } from "url"; import { CodeModelBuilder } from "./code-model-builder.js"; import { CodeModel } from "./common/code-model.js"; -import { logError, spawnAsync, SpawnError } from "./utils.js"; -import { - CODE_JAVA_SDK_DEPENDENCY, - JDK_NOT_FOUND_MESSAGE, - validateDependencies, -} from "./validate.js"; - -export interface EmitterOptions { - namespace?: string; - "package-dir"?: string; - - flavor?: string; - - "service-name"?: string; - "service-versions"?: string[]; - - "skip-special-headers"?: string[]; - - "generate-samples"?: boolean; - "generate-tests"?: boolean; - - "enable-sync-stack"?: boolean; - "stream-style-serialization"?: boolean; - "use-object-for-unknown"?: boolean; - - "partial-update"?: boolean; - "models-subpackage"?: string; - "custom-types"?: string; - "custom-types-subpackage"?: string; - "customization-class"?: string; - polling?: any; - - "group-etag-headers"?: boolean; - - "enable-subclient"?: boolean; - - "advanced-versioning"?: boolean; - "api-version"?: string; - "service-version-exclude-preview"?: boolean; - - "dev-options"?: DevOptions; -} - -export interface DevOptions { - "generate-code-model"?: boolean; - debug?: boolean; - loglevel?: "off" | "debug" | "info" | "warn" | "error"; - "java-temp-dir"?: string; // working directory for java codegen, e.g. transformed code-model file -} +import { EmitterOptions, LibName, reportDiagnostic } from "./lib.js"; +import { DiagnosticError, spawnAsync, SpawnError, trace } from "./utils.js"; +import { validateDependencies } from "./validate.js"; type CodeModelEmitterOptions = EmitterOptions & { "output-dir": string; arm?: boolean; }; -const EmitterOptionsSchema: JSONSchemaType = { - type: "object", - additionalProperties: true, - properties: { - namespace: { type: "string", nullable: true }, - "package-dir": { type: "string", nullable: true }, - - flavor: { type: "string", nullable: true }, - - // service - "service-name": { type: "string", nullable: true }, - "service-versions": { type: "array", items: { type: "string" }, nullable: true }, - - // header - "skip-special-headers": { type: "array", items: { type: "string" }, nullable: true }, - - // sample and test - "generate-samples": { type: "boolean", nullable: true, default: true }, - "generate-tests": { type: "boolean", nullable: true, default: true }, - - "enable-sync-stack": { type: "boolean", nullable: true, default: true }, - "stream-style-serialization": { type: "boolean", nullable: true, default: true }, - "use-object-for-unknown": { type: "boolean", nullable: true, default: false }, - - // customization - "partial-update": { type: "boolean", nullable: true, default: false }, - "models-subpackage": { type: "string", nullable: true }, - "custom-types": { type: "string", nullable: true }, - "custom-types-subpackage": { type: "string", nullable: true }, - "customization-class": { type: "string", nullable: true }, - polling: { type: "object", additionalProperties: true, nullable: true }, - - "group-etag-headers": { type: "boolean", nullable: true }, - - "enable-subclient": { type: "boolean", nullable: true, default: false }, - - "advanced-versioning": { type: "boolean", nullable: true, default: false }, - "api-version": { type: "string", nullable: true }, - "service-version-exclude-preview": { type: "boolean", nullable: true, default: false }, - - "dev-options": { type: "object", additionalProperties: true, nullable: true }, - }, - required: [], -}; - -export const $lib = createTypeSpecLibrary({ - name: "@typespec/http-client-java", - diagnostics: {}, - emitter: { - options: EmitterOptionsSchema, - }, -}); - export async function $onEmit(context: EmitContext) { const program = context.program; if (!program.compilerOptions.noEmit) { @@ -128,7 +23,7 @@ export async function $onEmit(context: EmitContext) { if (!program.hasError()) { const options = context.options; if (!options["flavor"]) { - if ($lib.name === "@azure-tools/typespec-java") { + if (LibName === "@azure-tools/typespec-java") { options["flavor"] = "azure"; } } @@ -138,7 +33,18 @@ export async function $onEmit(context: EmitContext) { const builder = new CodeModelBuilder(program, context); codeModel = await builder.build(); } catch (error: any) { - logError(program, error.message); + if (error instanceof DiagnosticError) { + // diagnostic thrown as error + program.reportDiagnostic(error.diagnostic); + } else { + // unknown error + reportDiagnostic(program, { + code: "unknown-error", + format: { errorMessage: error.message }, + target: NoTarget, + }); + trace(program, error.stack); + } } if (codeModel && !program.hasError() && !program.compilerOptions.noEmit) { @@ -157,24 +63,28 @@ export async function $onEmit(context: EmitContext) { await promises.mkdir(outputPath, { recursive: true }).catch((err) => { if (err.code !== "EISDIR" && err.code !== "EEXIST") { - logError(program, `Failed to create output directory: ${outputPath}`); + reportDiagnostic(program, { + code: "unknown-error", + format: { errorMessage: `Failed to create output directory: ${outputPath}.` }, + target: NoTarget, + }); return; } }); await program.host.writeFile(codeModelFileName, dump(codeModel)); - program.trace("http-client-java", `Code model file written to ${codeModelFileName}`); + trace(program, `Code model file written to ${codeModelFileName}`); const emitterOptions = JSON.stringify(options); - program.trace("http-client-java", `Emitter options ${emitterOptions}`); + trace(program, `Emitter options ${emitterOptions}`); const jarFileName = resolvePath( moduleRoot, "generator/http-client-generator/target", "emitter.jar", ); - program.trace("http-client-java", `Exec JAR ${jarFileName}`); + trace(program, `Exec JAR ${jarFileName}`); const javaArgs: string[] = []; javaArgs.push(`-DemitterOptions=${emitterOptions}`); @@ -194,17 +104,25 @@ export async function $onEmit(context: EmitContext) { javaArgs.push(codeModelFileName); try { const result = await spawnAsync("java", javaArgs, { stdio: "pipe" }); - program.trace("http-client-java", `Code generation log: ${result.stdout}`); + trace(program, `Code generation log: ${result.stdout}`); } catch (error: any) { if (error && "code" in error && error["code"] === "ENOENT") { - logError(program, JDK_NOT_FOUND_MESSAGE, CODE_JAVA_SDK_DEPENDENCY); + reportDiagnostic(program, { + code: "invalid-java-sdk-dependency", + target: NoTarget, + }); } else { - logError( - program, - 'The emitter was unable to generate client code from this TypeSpec, please run this command again with "--trace http-client-java" to get diagnostic information, and open an issue on https://github.com/microsoft/typespec', - ); + // error in Java codegen, report as unknown error + reportDiagnostic(program, { + code: "unknown-error", + format: { + errorMessage: + 'The emitter was unable to generate client code from this TypeSpec, please run this command again with "--trace http-client-java" to get diagnostic information, and open an issue on https://github.com/microsoft/typespec', + }, + target: NoTarget, + }); if (error instanceof SpawnError) { - program.trace("http-client-java", `Code generation error: ${error.stdout}`); + trace(program, `Code generation error: ${error.stdout}`); } } } diff --git a/packages/http-client-java/emitter/src/index.ts b/packages/http-client-java/emitter/src/index.ts index cd5bcc0701..82206f8725 100644 --- a/packages/http-client-java/emitter/src/index.ts +++ b/packages/http-client-java/emitter/src/index.ts @@ -1 +1,4 @@ -export * from "./emitter.js"; +// $onEmit is the entry of the emitter +export { $onEmit } from "./emitter.js"; +// emit options interface is required to be exported +export { $lib, DevOptions, EmitterOptions } from "./lib.js"; diff --git a/packages/http-client-java/emitter/src/lib.ts b/packages/http-client-java/emitter/src/lib.ts new file mode 100644 index 0000000000..05cf2d29fc --- /dev/null +++ b/packages/http-client-java/emitter/src/lib.ts @@ -0,0 +1,173 @@ +import { createTypeSpecLibrary, JSONSchemaType, paramMessage } from "@typespec/compiler"; + +export interface DevOptions { + "generate-code-model"?: boolean; + debug?: boolean; + loglevel?: "off" | "debug" | "info" | "warn" | "error"; + "java-temp-dir"?: string; // working directory for java codegen, e.g. transformed code-model file +} + +export interface EmitterOptions { + namespace?: string; + "package-dir"?: string; + + flavor?: string; + + "service-name"?: string; + "service-versions"?: string[]; + + "skip-special-headers"?: string[]; + + "generate-samples"?: boolean; + "generate-tests"?: boolean; + + "enable-sync-stack"?: boolean; + "stream-style-serialization"?: boolean; + "use-object-for-unknown"?: boolean; + + "partial-update"?: boolean; + "models-subpackage"?: string; + "custom-types"?: string; + "custom-types-subpackage"?: string; + "customization-class"?: string; + polling?: any; + + "group-etag-headers"?: boolean; + + "enable-subclient"?: boolean; + + "advanced-versioning"?: boolean; + "api-version"?: string; + "service-version-exclude-preview"?: boolean; + + "dev-options"?: DevOptions; +} + +const EmitterOptionsSchema: JSONSchemaType = { + type: "object", + additionalProperties: true, + properties: { + namespace: { type: "string", nullable: true }, + "package-dir": { type: "string", nullable: true }, + + flavor: { type: "string", nullable: true }, + + // service + "service-name": { type: "string", nullable: true }, + "service-versions": { type: "array", items: { type: "string" }, nullable: true }, + + // header + "skip-special-headers": { type: "array", items: { type: "string" }, nullable: true }, + + // sample and test + "generate-samples": { type: "boolean", nullable: true, default: true }, + "generate-tests": { type: "boolean", nullable: true, default: true }, + + "enable-sync-stack": { type: "boolean", nullable: true, default: true }, + "stream-style-serialization": { type: "boolean", nullable: true, default: true }, + "use-object-for-unknown": { type: "boolean", nullable: true, default: false }, + + // customization + "partial-update": { type: "boolean", nullable: true, default: false }, + "models-subpackage": { type: "string", nullable: true }, + "custom-types": { type: "string", nullable: true }, + "custom-types-subpackage": { type: "string", nullable: true }, + "customization-class": { type: "string", nullable: true }, + polling: { type: "object", additionalProperties: true, nullable: true }, + + "group-etag-headers": { type: "boolean", nullable: true }, + + "enable-subclient": { type: "boolean", nullable: true, default: false }, + + "advanced-versioning": { type: "boolean", nullable: true, default: false }, + "api-version": { type: "string", nullable: true }, + "service-version-exclude-preview": { type: "boolean", nullable: true, default: false }, + + "dev-options": { type: "object", additionalProperties: true, nullable: true }, + }, + required: [], +}; + +export const $lib = createTypeSpecLibrary({ + name: "@typespec/http-client-java", + diagnostics: { + // error + "unknown-error": { + severity: "error", + messages: { + default: paramMessage`An unknown error occurred. '${"errorMessage"}'`, + }, + }, + "invalid-java-sdk-dependency": { + severity: "error", + messages: { + default: + "Java Development Kit (JDK) is not found in PATH. Please install JDK 17 or above. Microsoft Build of OpenJDK can be downloaded from https://learn.microsoft.com/java/openjdk/download", + jdkVersion: paramMessage`Java Development Kit (JDK) in PATH is version '${"javaVersion"}'. Please install JDK 17 or above. Microsoft Build of OpenJDK can be downloaded from https://learn.microsoft.com/java/openjdk/download`, + maven: + "Apache Maven is not found in PATH. Apache Maven can be downloaded from https://maven.apache.org/download.cgi", + }, + }, + "multiple-server-not-supported": { + severity: "error", + messages: { + default: "Multiple server on client is not supported.", + }, + }, + "invalid-api-version": { + severity: "error", + messages: { + default: paramMessage`Invalid api-version option: '${"apiVersion"}'. The value should be an api-version, 'latest', or 'all'.`, + }, + }, + "unrecognized-type": { + severity: "error", + messages: { + default: paramMessage`Unrecognized type, kind '${"typeKind"}'. Updating the version of the emitter may resolve this issue.`, + unionType: paramMessage`Unrecognized type for Union, kind '${"typeKind"}'.`, + multipartFormData: paramMessage`Unrecognized type for multipart form data, kind '${"typeKind"}'.`, + }, + }, + + // warning + "no-service": { + severity: "warning", + messages: { + default: "No service found in this TypeSpec. Client will not be generated.", + }, + }, + "auth-scheme-not-supported": { + severity: "warning", + messages: { + oauth2Unbranded: + "OAuth2 auth scheme is not supported in unbranded. Client builder will fallback to use KeyCredential.", + apiKeyLocation: "ApiKey auth is currently only supported for ApiKeyLocation.header.", + basicAuthBranded: paramMessage`HTTP auth with '${"scheme"}' scheme is not supported for Azure. Azure service should use Oauth2Auth or ApiKeyAuth.`, + }, + }, + "protocol-api-not-generated": { + severity: "warning", + messages: { + multipartFormData: paramMessage`Operation '${"operationName"}' is of content-type 'multipart/form-data'. Protocol API is not usable and hence not generated.`, + }, + }, + "convenience-api-not-generated": { + severity: "warning", + messages: { + multipleContentType: paramMessage`Operation '${"operationName"}' can be invoked with multiple content-type. It is difficult to form a correct method signature for convenience API, and hence the convenience API is not generated.`, + jsonMergePatch: paramMessage`Operation '${"operationName"}' is of content-type 'application/merge-patch+json'. Enable 'stream-style-serialization' in emitter options.`, + }, + }, + "header-parameter-format-not-supported": { + severity: "warning", + messages: { + default: paramMessage`Header parameter format '${"format"}' is not supported.`, + }, + }, + }, + emitter: { + options: EmitterOptionsSchema as JSONSchemaType, + }, +} as const); + +export const { name: LibName, reportDiagnostic, createDiagnostic, getTracer } = $lib; diff --git a/packages/http-client-java/emitter/src/utils.ts b/packages/http-client-java/emitter/src/utils.ts index b70ace8bc7..62ced52e78 100644 --- a/packages/http-client-java/emitter/src/utils.ts +++ b/packages/http-client-java/emitter/src/utils.ts @@ -1,24 +1,6 @@ -import { NoTarget, Program, Type } from "@typespec/compiler"; +import { Diagnostic, Program, Type } from "@typespec/compiler"; import { spawn, SpawnOptions } from "child_process"; -export function logError(program: Program, msg: string, code: string = "http-client-java") { - program.reportDiagnostic({ - code: code, - severity: "error", - message: msg, - target: NoTarget, - }); -} - -export function logWarning(program: Program, msg: string, code: string = "http-client-java") { - program.reportDiagnostic({ - code: code, - severity: "warning", - message: msg, - target: NoTarget, - }); -} - export function trace(program: Program, msg: string) { program.trace("http-client-java", msg); } @@ -79,6 +61,15 @@ export class SpawnError extends Error { } } +export class DiagnosticError extends Error { + diagnostic: Diagnostic; + + constructor(diagnostic: Diagnostic) { + super(diagnostic.message); + this.diagnostic = diagnostic; + } +} + export async function spawnAsync( command: string, args: readonly string[], diff --git a/packages/http-client-java/emitter/src/validate.ts b/packages/http-client-java/emitter/src/validate.ts index a624b8bd21..ab9e7e0d9e 100644 --- a/packages/http-client-java/emitter/src/validate.ts +++ b/packages/http-client-java/emitter/src/validate.ts @@ -1,5 +1,6 @@ -import { Program } from "@typespec/compiler"; -import { logError, spawnAsync, trace } from "./utils.js"; +import { NoTarget, Program } from "@typespec/compiler"; +import { reportDiagnostic } from "./lib.js"; +import { spawnAsync, trace } from "./utils.js"; export const JDK_NOT_FOUND_MESSAGE = "Java Development Kit (JDK) is not found in PATH. Please install JDK 17 or above. Microsoft Build of OpenJDK can be downloaded from https://learn.microsoft.com/java/openjdk/download"; @@ -21,23 +22,32 @@ export async function validateDependencies( if (javaMajorVersion < 11) { // the message is JDK 17, because clientcore depends on JDK 17 // emitter only require JDK 11 - const message = `Java Development Kit (JDK) in PATH is version ${javaVersion}. Please install JDK 17 or above. Microsoft Build of OpenJDK can be downloaded from https://learn.microsoft.com/java/openjdk/download`; - // // eslint-disable-next-line no-console - // console.log("[ERROR] " + message); if (program && logDiagnostic) { - logError(program, message, CODE_JAVA_SDK_DEPENDENCY); + reportDiagnostic(program, { + code: "invalid-java-sdk-dependency", + messageId: "jdkVersion", + format: { javaVersion: javaVersion }, + target: NoTarget, + }); } } } } catch (error: any) { - let message = error.message; if (error && "code" in error && error["code"] === "ENOENT") { - message = JDK_NOT_FOUND_MESSAGE; - } - // // eslint-disable-next-line no-console - // console.log("[ERROR] " + message); - if (program && logDiagnostic) { - logError(program, message, CODE_JAVA_SDK_DEPENDENCY); + if (program && logDiagnostic) { + reportDiagnostic(program, { + code: "invalid-java-sdk-dependency", + target: NoTarget, + }); + } + } else { + if (program && logDiagnostic) { + reportDiagnostic(program, { + code: "unknown-error", + format: { errorMessage: error.message }, + target: NoTarget, + }); + } } } @@ -53,15 +63,22 @@ export async function validateDependencies( } } } catch (error: any) { - let message = error.message; if (shell || (error && "code" in error && error["code"] === "ENOENT")) { - message = - "Apache Maven is not found in PATH. Apache Maven can be downloaded from https://maven.apache.org/download.cgi"; - } - // // eslint-disable-next-line no-console - // console.log("[ERROR] " + message); - if (program && logDiagnostic) { - logError(program, message, CODE_JAVA_SDK_DEPENDENCY); + if (program && logDiagnostic) { + reportDiagnostic(program, { + code: "invalid-java-sdk-dependency", + messageId: "maven", + target: NoTarget, + }); + } + } else { + if (program && logDiagnostic) { + reportDiagnostic(program, { + code: "unknown-error", + format: { errorMessage: error.message }, + target: NoTarget, + }); + } } } } diff --git a/packages/http-client-java/generator/http-client-generator-clientcore-test/package.json b/packages/http-client-java/generator/http-client-generator-clientcore-test/package.json index a2f53b6041..c84a413913 100644 --- a/packages/http-client-java/generator/http-client-generator-clientcore-test/package.json +++ b/packages/http-client-java/generator/http-client-generator-clientcore-test/package.json @@ -24,7 +24,7 @@ "@typespec/openapi": "~0.64.0", "@typespec/xml": "~0.64.0", "@azure-tools/typespec-azure-core": "~0.50.0", - "@azure-tools/typespec-client-generator-core": "~0.50.0", + "@azure-tools/typespec-client-generator-core": "~0.50.2", "@azure-tools/typespec-azure-resource-manager": "~0.50.0", "@azure-tools/typespec-autorest": "~0.50.0" }, diff --git a/packages/http-client-java/generator/http-client-generator-clientcore-test/src/main/java/payload/multipart/FormDataClient.java b/packages/http-client-java/generator/http-client-generator-clientcore-test/src/main/java/payload/multipart/FormDataClient.java index ca0d882cbd..a6cc97be4d 100644 --- a/packages/http-client-java/generator/http-client-generator-clientcore-test/src/main/java/payload/multipart/FormDataClient.java +++ b/packages/http-client-java/generator/http-client-generator-clientcore-test/src/main/java/payload/multipart/FormDataClient.java @@ -41,8 +41,8 @@ public final class FormDataClient { */ @Metadata(generated = true) Response basicWithResponse(BinaryData body, RequestOptions requestOptions) { - // Protocol API requires serialization of parts with content-disposition and data, as operation 'basic' is - // 'multipart/form-data' + // Operation 'basic' is of content-type 'multipart/form-data'. Protocol API is not usable and hence not + // generated. return this.serviceClient.basicWithResponse(body, requestOptions); } @@ -56,8 +56,8 @@ Response basicWithResponse(BinaryData body, RequestOptions requestOptions) */ @Metadata(generated = true) Response fileArrayAndBasicWithResponse(BinaryData body, RequestOptions requestOptions) { - // Protocol API requires serialization of parts with content-disposition and data, as operation - // 'fileArrayAndBasic' is 'multipart/form-data' + // Operation 'fileArrayAndBasic' is of content-type 'multipart/form-data'. Protocol API is not usable and hence + // not generated. return this.serviceClient.fileArrayAndBasicWithResponse(body, requestOptions); } @@ -71,8 +71,8 @@ Response fileArrayAndBasicWithResponse(BinaryData body, RequestOptions req */ @Metadata(generated = true) Response jsonPartWithResponse(BinaryData body, RequestOptions requestOptions) { - // Protocol API requires serialization of parts with content-disposition and data, as operation 'jsonPart' is - // 'multipart/form-data' + // Operation 'jsonPart' is of content-type 'multipart/form-data'. Protocol API is not usable and hence not + // generated. return this.serviceClient.jsonPartWithResponse(body, requestOptions); } @@ -86,8 +86,8 @@ Response jsonPartWithResponse(BinaryData body, RequestOptions requestOptio */ @Metadata(generated = true) Response binaryArrayPartsWithResponse(BinaryData body, RequestOptions requestOptions) { - // Protocol API requires serialization of parts with content-disposition and data, as operation - // 'binaryArrayParts' is 'multipart/form-data' + // Operation 'binaryArrayParts' is of content-type 'multipart/form-data'. Protocol API is not usable and hence + // not generated. return this.serviceClient.binaryArrayPartsWithResponse(body, requestOptions); } @@ -101,8 +101,8 @@ Response binaryArrayPartsWithResponse(BinaryData body, RequestOptions requ */ @Metadata(generated = true) Response multiBinaryPartsWithResponse(BinaryData body, RequestOptions requestOptions) { - // Protocol API requires serialization of parts with content-disposition and data, as operation - // 'multiBinaryParts' is 'multipart/form-data' + // Operation 'multiBinaryParts' is of content-type 'multipart/form-data'. Protocol API is not usable and hence + // not generated. return this.serviceClient.multiBinaryPartsWithResponse(body, requestOptions); } @@ -116,8 +116,8 @@ Response multiBinaryPartsWithResponse(BinaryData body, RequestOptions requ */ @Metadata(generated = true) Response checkFileNameAndContentTypeWithResponse(BinaryData body, RequestOptions requestOptions) { - // Protocol API requires serialization of parts with content-disposition and data, as operation - // 'checkFileNameAndContentType' is 'multipart/form-data' + // Operation 'checkFileNameAndContentType' is of content-type 'multipart/form-data'. Protocol API is not usable + // and hence not generated. return this.serviceClient.checkFileNameAndContentTypeWithResponse(body, requestOptions); } @@ -131,8 +131,8 @@ Response checkFileNameAndContentTypeWithResponse(BinaryData body, RequestO */ @Metadata(generated = true) Response anonymousModelWithResponse(BinaryData anonymousModelRequest, RequestOptions requestOptions) { - // Protocol API requires serialization of parts with content-disposition and data, as operation 'anonymousModel' - // is 'multipart/form-data' + // Operation 'anonymousModel' is of content-type 'multipart/form-data'. Protocol API is not usable and hence not + // generated. return this.serviceClient.anonymousModelWithResponse(anonymousModelRequest, requestOptions); } diff --git a/packages/http-client-java/generator/http-client-generator-clientcore-test/src/main/java/payload/multipart/FormDataHttpPartsClient.java b/packages/http-client-java/generator/http-client-generator-clientcore-test/src/main/java/payload/multipart/FormDataHttpPartsClient.java index fa3b2c53cd..fb3ee97c58 100644 --- a/packages/http-client-java/generator/http-client-generator-clientcore-test/src/main/java/payload/multipart/FormDataHttpPartsClient.java +++ b/packages/http-client-java/generator/http-client-generator-clientcore-test/src/main/java/payload/multipart/FormDataHttpPartsClient.java @@ -40,8 +40,8 @@ public final class FormDataHttpPartsClient { */ @Metadata(generated = true) Response jsonArrayAndFileArrayWithResponse(BinaryData body, RequestOptions requestOptions) { - // Protocol API requires serialization of parts with content-disposition and data, as operation - // 'jsonArrayAndFileArray' is 'multipart/form-data' + // Operation 'jsonArrayAndFileArray' is of content-type 'multipart/form-data'. Protocol API is not usable and + // hence not generated. return this.serviceClient.jsonArrayAndFileArrayWithResponse(body, requestOptions); } diff --git a/packages/http-client-java/generator/http-client-generator-clientcore-test/src/main/java/payload/multipart/FormDataHttpPartsContentTypeClient.java b/packages/http-client-java/generator/http-client-generator-clientcore-test/src/main/java/payload/multipart/FormDataHttpPartsContentTypeClient.java index d95396ad70..36abcaee8a 100644 --- a/packages/http-client-java/generator/http-client-generator-clientcore-test/src/main/java/payload/multipart/FormDataHttpPartsContentTypeClient.java +++ b/packages/http-client-java/generator/http-client-generator-clientcore-test/src/main/java/payload/multipart/FormDataHttpPartsContentTypeClient.java @@ -39,8 +39,8 @@ public final class FormDataHttpPartsContentTypeClient { */ @Metadata(generated = true) Response imageJpegContentTypeWithResponse(BinaryData body, RequestOptions requestOptions) { - // Protocol API requires serialization of parts with content-disposition and data, as operation - // 'imageJpegContentType' is 'multipart/form-data' + // Operation 'imageJpegContentType' is of content-type 'multipart/form-data'. Protocol API is not usable and + // hence not generated. return this.serviceClient.imageJpegContentTypeWithResponse(body, requestOptions); } @@ -54,8 +54,8 @@ Response imageJpegContentTypeWithResponse(BinaryData body, RequestOptions */ @Metadata(generated = true) Response requiredContentTypeWithResponse(BinaryData body, RequestOptions requestOptions) { - // Protocol API requires serialization of parts with content-disposition and data, as operation - // 'requiredContentType' is 'multipart/form-data' + // Operation 'requiredContentType' is of content-type 'multipart/form-data'. Protocol API is not usable and + // hence not generated. return this.serviceClient.requiredContentTypeWithResponse(body, requestOptions); } @@ -69,8 +69,8 @@ Response requiredContentTypeWithResponse(BinaryData body, RequestOptions r */ @Metadata(generated = true) Response optionalContentTypeWithResponse(BinaryData body, RequestOptions requestOptions) { - // Protocol API requires serialization of parts with content-disposition and data, as operation - // 'optionalContentType' is 'multipart/form-data' + // Operation 'optionalContentType' is of content-type 'multipart/form-data'. Protocol API is not usable and + // hence not generated. return this.serviceClient.optionalContentTypeWithResponse(body, requestOptions); } diff --git a/packages/http-client-java/generator/http-client-generator-clientcore-test/src/main/java/payload/multipart/FormDataHttpPartsNonStringClient.java b/packages/http-client-java/generator/http-client-generator-clientcore-test/src/main/java/payload/multipart/FormDataHttpPartsNonStringClient.java index ba5c106c2a..16bff5bdbc 100644 --- a/packages/http-client-java/generator/http-client-generator-clientcore-test/src/main/java/payload/multipart/FormDataHttpPartsNonStringClient.java +++ b/packages/http-client-java/generator/http-client-generator-clientcore-test/src/main/java/payload/multipart/FormDataHttpPartsNonStringClient.java @@ -40,8 +40,8 @@ public final class FormDataHttpPartsNonStringClient { */ @Metadata(generated = true) Response floatMethodWithResponse(BinaryData body, RequestOptions requestOptions) { - // Protocol API requires serialization of parts with content-disposition and data, as operation 'float' is - // 'multipart/form-data' + // Operation 'float' is of content-type 'multipart/form-data'. Protocol API is not usable and hence not + // generated. return this.serviceClient.floatMethodWithResponse(body, requestOptions); } diff --git a/packages/http-client-java/generator/http-client-generator-core/pom.xml b/packages/http-client-java/generator/http-client-generator-core/pom.xml index b65210b561..a883b2f816 100644 --- a/packages/http-client-java/generator/http-client-generator-core/pom.xml +++ b/packages/http-client-java/generator/http-client-generator-core/pom.xml @@ -95,6 +95,12 @@ 5.11.2 test + + io.clientcore + core + 1.0.0-beta.2 + test + org.junit.jupiter junit-jupiter-engine diff --git a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/mapper/ClientMethodMapper.java b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/mapper/ClientMethodMapper.java index 54ef3c1860..a1c1626e4d 100644 --- a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/mapper/ClientMethodMapper.java +++ b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/mapper/ClientMethodMapper.java @@ -784,7 +784,9 @@ private static void createPageableClientMethods(Operation operation, boolean isP .groupedParameterRequired(false) .methodVisibility(methodVisibility); - methods.add(builder.build()); + if (settings.getSyncMethods() != SyncMethodsGeneration.NONE) { + methods.add(builder.build()); + } // Generate an overload with all parameters, optionally include context. builder.methodVisibility(visibilityFunction.methodVisibility(true, defaultOverloadType, true)); @@ -806,10 +808,14 @@ private static void createPageableClientMethods(Operation operation, boolean isP .groupedParameterRequired(false) .methodVisibility(visibilityFunction.methodVisibility(false, defaultOverloadType, false)); - methods.add(builder.build()); + if (settings.getSyncMethods() != SyncMethodsGeneration.NONE) { + // generate the overload, if "sync-methods != NONE" - // overload for versioning - createOverloadForVersioning(isProtocolMethod, methods, builder, parameters); + methods.add(builder.build()); + + // overload for versioning + createOverloadForVersioning(isProtocolMethod, methods, builder, parameters); + } if (generateClientMethodWithOnlyRequiredParameters) { methods.add(builder.onlyRequiredParameters(true) diff --git a/packages/http-client-java/generator/http-client-generator-core/src/test/java/com/microsoft/typespec/http/client/generator/core/template/ClientMethodSerializeItemValueCodeTests.java b/packages/http-client-java/generator/http-client-generator-core/src/test/java/com/microsoft/typespec/http/client/generator/core/template/ClientMethodSerializeItemValueCodeTests.java new file mode 100644 index 0000000000..d040660ce5 --- /dev/null +++ b/packages/http-client-java/generator/http-client-generator-core/src/test/java/com/microsoft/typespec/http/client/generator/core/template/ClientMethodSerializeItemValueCodeTests.java @@ -0,0 +1,151 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.microsoft.typespec.http.client.generator.core.template; + +import com.azure.core.annotation.Generated; +import com.azure.core.util.ExpandableEnum; +import io.clientcore.core.util.binarydata.BinaryData; +import java.time.OffsetDateTime; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Function; +import java.util.stream.Collectors; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class ClientMethodSerializeItemValueCodeTests { + + @Test + public void testClientMethodSerializeItemValueCode() { + // code from resources/ClientMethodSerializeItemValue.java + Function testCode = paramItemValue -> { + if (paramItemValue == null) { + return ""; + } else { + String itemValueString = BinaryData.fromObject(paramItemValue).toString(); + int strLength = itemValueString.length(); + int startOffset = 0; + while (startOffset < strLength) { + if (itemValueString.charAt(startOffset) != '"') { + break; + } + startOffset++; + } + if (startOffset == strLength) { + return ""; + } + int endOffset = strLength - 1; + while (endOffset >= 0) { + if (itemValueString.charAt(endOffset) != '"') { + break; + } + + endOffset--; + } + return itemValueString.substring(startOffset, endOffset + 1); + } + }; + + Function, String> serializeCsvCode + = paramItems -> paramItems.stream().map(testCode).collect(Collectors.joining(",")); + + // Long + Assertions.assertEquals("1,2,3", serializeCsvCode.apply(List.of(1L, 2L, 3L))); + + // String + Assertions.assertEquals("a,b,c", serializeCsvCode.apply(List.of("a", "b", "c"))); + + // Enum + Assertions.assertEquals("0,100", serializeCsvCode.apply(List.of(PriorityModel.LOW, PriorityModel.HIGH))); + + // date-time + Assertions.assertEquals("2025-01-24T07:34:05Z,2024-05-20T00:00:01Z", serializeCsvCode.apply( + List.of(OffsetDateTime.parse("2025-01-24T07:34:05Z"), OffsetDateTime.parse("2024-05-20T00:00:01Z")))); + } + + /** + * Defines values for PriorityModel. + */ + public static final class PriorityModel implements ExpandableEnum { + private static final Map VALUES = new ConcurrentHashMap<>(); + + private static final Function NEW_INSTANCE = PriorityModel::new; + + /** + * Static value 100 for PriorityModel. + */ + @Generated + public static final PriorityModel HIGH = fromValue(100); + + /** + * Static value 0 for PriorityModel. + */ + @Generated + public static final PriorityModel LOW = fromValue(0); + + private final Integer value; + + private PriorityModel(Integer value) { + this.value = value; + } + + /** + * Creates or finds a PriorityModel. + * + * @param value a value to look for. + * @return the corresponding PriorityModel. + * @throws IllegalArgumentException if value is null. + */ + @Generated + public static PriorityModel fromValue(Integer value) { + if (value == null) { + throw new IllegalArgumentException("'value' cannot be null."); + } + return VALUES.computeIfAbsent(value, NEW_INSTANCE); + } + + /** + * Gets known PriorityModel values. + * + * @return Known PriorityModel values. + */ + @Generated + public static Collection values() { + return new ArrayList<>(VALUES.values()); + } + + /** + * Gets the value of the PriorityModel instance. + * + * @return the value of the PriorityModel instance. + */ + @Generated + @Override + public Integer getValue() { + return this.value; + } + + @Generated + @Override + public String toString() { + return Objects.toString(this.value); + } + + @Generated + @Override + public boolean equals(Object obj) { + return this == obj; + } + + @Generated + @Override + public int hashCode() { + return Objects.hashCode(this.value); + } + } +} diff --git a/packages/http-client-java/generator/http-client-generator-test/package.json b/packages/http-client-java/generator/http-client-generator-test/package.json index 47542ab2ed..b080f744ca 100644 --- a/packages/http-client-java/generator/http-client-generator-test/package.json +++ b/packages/http-client-java/generator/http-client-generator-test/package.json @@ -25,7 +25,7 @@ "@typespec/openapi": "~0.64.0", "@typespec/xml": "~0.64.0", "@azure-tools/typespec-azure-core": "~0.50.0", - "@azure-tools/typespec-client-generator-core": "~0.50.0", + "@azure-tools/typespec-client-generator-core": "~0.50.2", "@azure-tools/typespec-azure-resource-manager": "~0.50.0", "@azure-tools/typespec-autorest": "~0.50.0" }, diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/payload/multipart/FormDataAsyncClient.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/payload/multipart/FormDataAsyncClient.java index 0e7f229a0d..693fe07551 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/main/java/payload/multipart/FormDataAsyncClient.java +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/payload/multipart/FormDataAsyncClient.java @@ -61,8 +61,8 @@ public final class FormDataAsyncClient { @Generated @ServiceMethod(returns = ReturnType.SINGLE) Mono> basicWithResponse(BinaryData body, RequestOptions requestOptions) { - // Protocol API requires serialization of parts with content-disposition and data, as operation 'basic' is - // 'multipart/form-data' + // Operation 'basic' is of content-type 'multipart/form-data'. Protocol API is not usable and hence not + // generated. return this.serviceClient.basicWithResponseAsync(body, requestOptions); } @@ -80,8 +80,8 @@ Mono> basicWithResponse(BinaryData body, RequestOptions requestOp @Generated @ServiceMethod(returns = ReturnType.SINGLE) Mono> fileArrayAndBasicWithResponse(BinaryData body, RequestOptions requestOptions) { - // Protocol API requires serialization of parts with content-disposition and data, as operation - // 'fileArrayAndBasic' is 'multipart/form-data' + // Operation 'fileArrayAndBasic' is of content-type 'multipart/form-data'. Protocol API is not usable and hence + // not generated. return this.serviceClient.fileArrayAndBasicWithResponseAsync(body, requestOptions); } @@ -99,8 +99,8 @@ Mono> fileArrayAndBasicWithResponse(BinaryData body, RequestOptio @Generated @ServiceMethod(returns = ReturnType.SINGLE) Mono> jsonPartWithResponse(BinaryData body, RequestOptions requestOptions) { - // Protocol API requires serialization of parts with content-disposition and data, as operation 'jsonPart' is - // 'multipart/form-data' + // Operation 'jsonPart' is of content-type 'multipart/form-data'. Protocol API is not usable and hence not + // generated. return this.serviceClient.jsonPartWithResponseAsync(body, requestOptions); } @@ -118,8 +118,8 @@ Mono> jsonPartWithResponse(BinaryData body, RequestOptions reques @Generated @ServiceMethod(returns = ReturnType.SINGLE) Mono> binaryArrayPartsWithResponse(BinaryData body, RequestOptions requestOptions) { - // Protocol API requires serialization of parts with content-disposition and data, as operation - // 'binaryArrayParts' is 'multipart/form-data' + // Operation 'binaryArrayParts' is of content-type 'multipart/form-data'. Protocol API is not usable and hence + // not generated. return this.serviceClient.binaryArrayPartsWithResponseAsync(body, requestOptions); } @@ -137,8 +137,8 @@ Mono> binaryArrayPartsWithResponse(BinaryData body, RequestOption @Generated @ServiceMethod(returns = ReturnType.SINGLE) Mono> multiBinaryPartsWithResponse(BinaryData body, RequestOptions requestOptions) { - // Protocol API requires serialization of parts with content-disposition and data, as operation - // 'multiBinaryParts' is 'multipart/form-data' + // Operation 'multiBinaryParts' is of content-type 'multipart/form-data'. Protocol API is not usable and hence + // not generated. return this.serviceClient.multiBinaryPartsWithResponseAsync(body, requestOptions); } @@ -156,8 +156,8 @@ Mono> multiBinaryPartsWithResponse(BinaryData body, RequestOption @Generated @ServiceMethod(returns = ReturnType.SINGLE) Mono> checkFileNameAndContentTypeWithResponse(BinaryData body, RequestOptions requestOptions) { - // Protocol API requires serialization of parts with content-disposition and data, as operation - // 'checkFileNameAndContentType' is 'multipart/form-data' + // Operation 'checkFileNameAndContentType' is of content-type 'multipart/form-data'. Protocol API is not usable + // and hence not generated. return this.serviceClient.checkFileNameAndContentTypeWithResponseAsync(body, requestOptions); } @@ -175,8 +175,8 @@ Mono> checkFileNameAndContentTypeWithResponse(BinaryData body, Re @Generated @ServiceMethod(returns = ReturnType.SINGLE) Mono> anonymousModelWithResponse(BinaryData anonymousModelRequest, RequestOptions requestOptions) { - // Protocol API requires serialization of parts with content-disposition and data, as operation 'anonymousModel' - // is 'multipart/form-data' + // Operation 'anonymousModel' is of content-type 'multipart/form-data'. Protocol API is not usable and hence not + // generated. return this.serviceClient.anonymousModelWithResponseAsync(anonymousModelRequest, requestOptions); } diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/payload/multipart/FormDataClient.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/payload/multipart/FormDataClient.java index 72605756fb..2adade27b5 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/main/java/payload/multipart/FormDataClient.java +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/payload/multipart/FormDataClient.java @@ -59,8 +59,8 @@ public final class FormDataClient { @Generated @ServiceMethod(returns = ReturnType.SINGLE) Response basicWithResponse(BinaryData body, RequestOptions requestOptions) { - // Protocol API requires serialization of parts with content-disposition and data, as operation 'basic' is - // 'multipart/form-data' + // Operation 'basic' is of content-type 'multipart/form-data'. Protocol API is not usable and hence not + // generated. return this.serviceClient.basicWithResponse(body, requestOptions); } @@ -78,8 +78,8 @@ Response basicWithResponse(BinaryData body, RequestOptions requestOptions) @Generated @ServiceMethod(returns = ReturnType.SINGLE) Response fileArrayAndBasicWithResponse(BinaryData body, RequestOptions requestOptions) { - // Protocol API requires serialization of parts with content-disposition and data, as operation - // 'fileArrayAndBasic' is 'multipart/form-data' + // Operation 'fileArrayAndBasic' is of content-type 'multipart/form-data'. Protocol API is not usable and hence + // not generated. return this.serviceClient.fileArrayAndBasicWithResponse(body, requestOptions); } @@ -97,8 +97,8 @@ Response fileArrayAndBasicWithResponse(BinaryData body, RequestOptions req @Generated @ServiceMethod(returns = ReturnType.SINGLE) Response jsonPartWithResponse(BinaryData body, RequestOptions requestOptions) { - // Protocol API requires serialization of parts with content-disposition and data, as operation 'jsonPart' is - // 'multipart/form-data' + // Operation 'jsonPart' is of content-type 'multipart/form-data'. Protocol API is not usable and hence not + // generated. return this.serviceClient.jsonPartWithResponse(body, requestOptions); } @@ -116,8 +116,8 @@ Response jsonPartWithResponse(BinaryData body, RequestOptions requestOptio @Generated @ServiceMethod(returns = ReturnType.SINGLE) Response binaryArrayPartsWithResponse(BinaryData body, RequestOptions requestOptions) { - // Protocol API requires serialization of parts with content-disposition and data, as operation - // 'binaryArrayParts' is 'multipart/form-data' + // Operation 'binaryArrayParts' is of content-type 'multipart/form-data'. Protocol API is not usable and hence + // not generated. return this.serviceClient.binaryArrayPartsWithResponse(body, requestOptions); } @@ -135,8 +135,8 @@ Response binaryArrayPartsWithResponse(BinaryData body, RequestOptions requ @Generated @ServiceMethod(returns = ReturnType.SINGLE) Response multiBinaryPartsWithResponse(BinaryData body, RequestOptions requestOptions) { - // Protocol API requires serialization of parts with content-disposition and data, as operation - // 'multiBinaryParts' is 'multipart/form-data' + // Operation 'multiBinaryParts' is of content-type 'multipart/form-data'. Protocol API is not usable and hence + // not generated. return this.serviceClient.multiBinaryPartsWithResponse(body, requestOptions); } @@ -154,8 +154,8 @@ Response multiBinaryPartsWithResponse(BinaryData body, RequestOptions requ @Generated @ServiceMethod(returns = ReturnType.SINGLE) Response checkFileNameAndContentTypeWithResponse(BinaryData body, RequestOptions requestOptions) { - // Protocol API requires serialization of parts with content-disposition and data, as operation - // 'checkFileNameAndContentType' is 'multipart/form-data' + // Operation 'checkFileNameAndContentType' is of content-type 'multipart/form-data'. Protocol API is not usable + // and hence not generated. return this.serviceClient.checkFileNameAndContentTypeWithResponse(body, requestOptions); } @@ -173,8 +173,8 @@ Response checkFileNameAndContentTypeWithResponse(BinaryData body, RequestO @Generated @ServiceMethod(returns = ReturnType.SINGLE) Response anonymousModelWithResponse(BinaryData anonymousModelRequest, RequestOptions requestOptions) { - // Protocol API requires serialization of parts with content-disposition and data, as operation 'anonymousModel' - // is 'multipart/form-data' + // Operation 'anonymousModel' is of content-type 'multipart/form-data'. Protocol API is not usable and hence not + // generated. return this.serviceClient.anonymousModelWithResponse(anonymousModelRequest, requestOptions); } diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/payload/multipart/FormDataHttpPartsAsyncClient.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/payload/multipart/FormDataHttpPartsAsyncClient.java index 5f53b61a16..ac78bac81a 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/main/java/payload/multipart/FormDataHttpPartsAsyncClient.java +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/payload/multipart/FormDataHttpPartsAsyncClient.java @@ -55,8 +55,8 @@ public final class FormDataHttpPartsAsyncClient { @Generated @ServiceMethod(returns = ReturnType.SINGLE) Mono> jsonArrayAndFileArrayWithResponse(BinaryData body, RequestOptions requestOptions) { - // Protocol API requires serialization of parts with content-disposition and data, as operation - // 'jsonArrayAndFileArray' is 'multipart/form-data' + // Operation 'jsonArrayAndFileArray' is of content-type 'multipart/form-data'. Protocol API is not usable and + // hence not generated. return this.serviceClient.jsonArrayAndFileArrayWithResponseAsync(body, requestOptions); } diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/payload/multipart/FormDataHttpPartsClient.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/payload/multipart/FormDataHttpPartsClient.java index cc6f8dbe3c..2a1059fe70 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/main/java/payload/multipart/FormDataHttpPartsClient.java +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/payload/multipart/FormDataHttpPartsClient.java @@ -53,8 +53,8 @@ public final class FormDataHttpPartsClient { @Generated @ServiceMethod(returns = ReturnType.SINGLE) Response jsonArrayAndFileArrayWithResponse(BinaryData body, RequestOptions requestOptions) { - // Protocol API requires serialization of parts with content-disposition and data, as operation - // 'jsonArrayAndFileArray' is 'multipart/form-data' + // Operation 'jsonArrayAndFileArray' is of content-type 'multipart/form-data'. Protocol API is not usable and + // hence not generated. return this.serviceClient.jsonArrayAndFileArrayWithResponse(body, requestOptions); } diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/payload/multipart/FormDataHttpPartsContentTypeAsyncClient.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/payload/multipart/FormDataHttpPartsContentTypeAsyncClient.java index 463c8ff86a..6a7ae8ceec 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/main/java/payload/multipart/FormDataHttpPartsContentTypeAsyncClient.java +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/payload/multipart/FormDataHttpPartsContentTypeAsyncClient.java @@ -55,8 +55,8 @@ public final class FormDataHttpPartsContentTypeAsyncClient { @Generated @ServiceMethod(returns = ReturnType.SINGLE) Mono> imageJpegContentTypeWithResponse(BinaryData body, RequestOptions requestOptions) { - // Protocol API requires serialization of parts with content-disposition and data, as operation - // 'imageJpegContentType' is 'multipart/form-data' + // Operation 'imageJpegContentType' is of content-type 'multipart/form-data'. Protocol API is not usable and + // hence not generated. return this.serviceClient.imageJpegContentTypeWithResponseAsync(body, requestOptions); } @@ -74,8 +74,8 @@ Mono> imageJpegContentTypeWithResponse(BinaryData body, RequestOp @Generated @ServiceMethod(returns = ReturnType.SINGLE) Mono> requiredContentTypeWithResponse(BinaryData body, RequestOptions requestOptions) { - // Protocol API requires serialization of parts with content-disposition and data, as operation - // 'requiredContentType' is 'multipart/form-data' + // Operation 'requiredContentType' is of content-type 'multipart/form-data'. Protocol API is not usable and + // hence not generated. return this.serviceClient.requiredContentTypeWithResponseAsync(body, requestOptions); } @@ -93,8 +93,8 @@ Mono> requiredContentTypeWithResponse(BinaryData body, RequestOpt @Generated @ServiceMethod(returns = ReturnType.SINGLE) Mono> optionalContentTypeWithResponse(BinaryData body, RequestOptions requestOptions) { - // Protocol API requires serialization of parts with content-disposition and data, as operation - // 'optionalContentType' is 'multipart/form-data' + // Operation 'optionalContentType' is of content-type 'multipart/form-data'. Protocol API is not usable and + // hence not generated. return this.serviceClient.optionalContentTypeWithResponseAsync(body, requestOptions); } diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/payload/multipart/FormDataHttpPartsContentTypeClient.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/payload/multipart/FormDataHttpPartsContentTypeClient.java index e29f7c4f86..ba6a6786b9 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/main/java/payload/multipart/FormDataHttpPartsContentTypeClient.java +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/payload/multipart/FormDataHttpPartsContentTypeClient.java @@ -53,8 +53,8 @@ public final class FormDataHttpPartsContentTypeClient { @Generated @ServiceMethod(returns = ReturnType.SINGLE) Response imageJpegContentTypeWithResponse(BinaryData body, RequestOptions requestOptions) { - // Protocol API requires serialization of parts with content-disposition and data, as operation - // 'imageJpegContentType' is 'multipart/form-data' + // Operation 'imageJpegContentType' is of content-type 'multipart/form-data'. Protocol API is not usable and + // hence not generated. return this.serviceClient.imageJpegContentTypeWithResponse(body, requestOptions); } @@ -72,8 +72,8 @@ Response imageJpegContentTypeWithResponse(BinaryData body, RequestOptions @Generated @ServiceMethod(returns = ReturnType.SINGLE) Response requiredContentTypeWithResponse(BinaryData body, RequestOptions requestOptions) { - // Protocol API requires serialization of parts with content-disposition and data, as operation - // 'requiredContentType' is 'multipart/form-data' + // Operation 'requiredContentType' is of content-type 'multipart/form-data'. Protocol API is not usable and + // hence not generated. return this.serviceClient.requiredContentTypeWithResponse(body, requestOptions); } @@ -91,8 +91,8 @@ Response requiredContentTypeWithResponse(BinaryData body, RequestOptions r @Generated @ServiceMethod(returns = ReturnType.SINGLE) Response optionalContentTypeWithResponse(BinaryData body, RequestOptions requestOptions) { - // Protocol API requires serialization of parts with content-disposition and data, as operation - // 'optionalContentType' is 'multipart/form-data' + // Operation 'optionalContentType' is of content-type 'multipart/form-data'. Protocol API is not usable and + // hence not generated. return this.serviceClient.optionalContentTypeWithResponse(body, requestOptions); } diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/payload/multipart/FormDataHttpPartsNonStringAsyncClient.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/payload/multipart/FormDataHttpPartsNonStringAsyncClient.java index 554bba640d..3bde6e4119 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/main/java/payload/multipart/FormDataHttpPartsNonStringAsyncClient.java +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/payload/multipart/FormDataHttpPartsNonStringAsyncClient.java @@ -53,8 +53,8 @@ public final class FormDataHttpPartsNonStringAsyncClient { @Generated @ServiceMethod(returns = ReturnType.SINGLE) Mono> floatMethodWithResponse(BinaryData body, RequestOptions requestOptions) { - // Protocol API requires serialization of parts with content-disposition and data, as operation 'float' is - // 'multipart/form-data' + // Operation 'float' is of content-type 'multipart/form-data'. Protocol API is not usable and hence not + // generated. return this.serviceClient.floatMethodWithResponseAsync(body, requestOptions); } diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/payload/multipart/FormDataHttpPartsNonStringClient.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/payload/multipart/FormDataHttpPartsNonStringClient.java index a1a88a5bde..a31ef62543 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/main/java/payload/multipart/FormDataHttpPartsNonStringClient.java +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/payload/multipart/FormDataHttpPartsNonStringClient.java @@ -51,8 +51,8 @@ public final class FormDataHttpPartsNonStringClient { @Generated @ServiceMethod(returns = ReturnType.SINGLE) Response floatMethodWithResponse(BinaryData body, RequestOptions requestOptions) { - // Protocol API requires serialization of parts with content-disposition and data, as operation 'float' is - // 'multipart/form-data' + // Operation 'float' is of content-type 'multipart/form-data'. Protocol API is not usable and hence not + // generated. return this.serviceClient.floatMethodWithResponse(body, requestOptions); } diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/flatten/FlattenAsyncClient.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/flatten/FlattenAsyncClient.java index 57c7541eb5..881c2b0431 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/flatten/FlattenAsyncClient.java +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/flatten/FlattenAsyncClient.java @@ -225,8 +225,8 @@ public Mono> updateWithResponse(long id, BinaryData updateR @ServiceMethod(returns = ReturnType.SINGLE) Mono> uploadFileWithResponse(String name, BinaryData uploadFileRequest, RequestOptions requestOptions) { - // Protocol API requires serialization of parts with content-disposition and data, as operation 'uploadFile' is - // 'multipart/form-data' + // Operation 'uploadFile' is of content-type 'multipart/form-data'. Protocol API is not usable and hence not + // generated. return this.serviceClient.uploadFileWithResponseAsync(name, uploadFileRequest, requestOptions); } @@ -244,8 +244,8 @@ Mono> uploadFileWithResponse(String name, BinaryData uploadFileRe @Generated @ServiceMethod(returns = ReturnType.SINGLE) Mono> uploadTodoWithResponse(BinaryData uploadTodoRequest, RequestOptions requestOptions) { - // Protocol API requires serialization of parts with content-disposition and data, as operation 'uploadTodo' is - // 'multipart/form-data' + // Operation 'uploadTodo' is of content-type 'multipart/form-data'. Protocol API is not usable and hence not + // generated. return this.serviceClient.uploadTodoWithResponseAsync(uploadTodoRequest, requestOptions); } diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/flatten/FlattenClient.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/flatten/FlattenClient.java index abcd998aac..53d3797c3f 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/flatten/FlattenClient.java +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/flatten/FlattenClient.java @@ -220,8 +220,8 @@ public Response updateWithResponse(long id, BinaryData updateRequest @Generated @ServiceMethod(returns = ReturnType.SINGLE) Response uploadFileWithResponse(String name, BinaryData uploadFileRequest, RequestOptions requestOptions) { - // Protocol API requires serialization of parts with content-disposition and data, as operation 'uploadFile' is - // 'multipart/form-data' + // Operation 'uploadFile' is of content-type 'multipart/form-data'. Protocol API is not usable and hence not + // generated. return this.serviceClient.uploadFileWithResponse(name, uploadFileRequest, requestOptions); } @@ -239,8 +239,8 @@ Response uploadFileWithResponse(String name, BinaryData uploadFileRequest, @Generated @ServiceMethod(returns = ReturnType.SINGLE) Response uploadTodoWithResponse(BinaryData uploadTodoRequest, RequestOptions requestOptions) { - // Protocol API requires serialization of parts with content-disposition and data, as operation 'uploadTodo' is - // 'multipart/form-data' + // Operation 'uploadTodo' is of content-type 'multipart/form-data'. Protocol API is not usable and hence not + // generated. return this.serviceClient.uploadTodoWithResponse(uploadTodoRequest, requestOptions); } diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/multicontenttypes/MultiContentTypesAsyncClient.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/multicontenttypes/MultiContentTypesAsyncClient.java index e6797a78d5..5cd3c7365d 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/multicontenttypes/MultiContentTypesAsyncClient.java +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/multicontenttypes/MultiContentTypesAsyncClient.java @@ -60,7 +60,8 @@ public final class MultiContentTypesAsyncClient { @ServiceMethod(returns = ReturnType.SINGLE) public Mono> uploadWithOverloadWithResponse(String contentType, BinaryData data, RequestOptions requestOptions) { - // Convenience API is not generated, as operation 'uploadWithOverload' is multiple content-type + // Operation 'uploadWithOverload' can be invoked with multiple content-type. It is difficult to form a correct + // method signature for convenience API, and hence the convenience API is not generated. return this.serviceClient.uploadWithOverloadWithResponseAsync(contentType, data, requestOptions); } } diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/multicontenttypes/MultiContentTypesClient.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/multicontenttypes/MultiContentTypesClient.java index 0d180e1264..9648124a0c 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/multicontenttypes/MultiContentTypesClient.java +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/multicontenttypes/MultiContentTypesClient.java @@ -59,7 +59,8 @@ public final class MultiContentTypesClient { @ServiceMethod(returns = ReturnType.SINGLE) public Response uploadWithOverloadWithResponse(String contentType, BinaryData data, RequestOptions requestOptions) { - // Convenience API is not generated, as operation 'uploadWithOverload' is multiple content-type + // Operation 'uploadWithOverload' can be invoked with multiple content-type. It is difficult to form a correct + // method signature for convenience API, and hence the convenience API is not generated. return this.serviceClient.uploadWithOverloadWithResponse(contentType, data, requestOptions); } } diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/multicontenttypes/MultipleContentTypesOnRequestAsyncClient.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/multicontenttypes/MultipleContentTypesOnRequestAsyncClient.java index 4e95de7133..61c77a150a 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/multicontenttypes/MultipleContentTypesOnRequestAsyncClient.java +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/multicontenttypes/MultipleContentTypesOnRequestAsyncClient.java @@ -62,8 +62,9 @@ public final class MultipleContentTypesOnRequestAsyncClient { @ServiceMethod(returns = ReturnType.SINGLE) public Mono> uploadBytesWithSingleBodyTypeForMultiContentTypesWithResponse(String contentType, BinaryData data, RequestOptions requestOptions) { - // Convenience API is not generated, as operation 'uploadBytesWithSingleBodyTypeForMultiContentTypes' is - // multiple content-type + // Operation 'uploadBytesWithSingleBodyTypeForMultiContentTypes' can be invoked with multiple content-type. It + // is difficult to form a correct method signature for convenience API, and hence the convenience API is not + // generated. return this.serviceClient.uploadBytesWithSingleBodyTypeForMultiContentTypesWithResponseAsync(contentType, data, requestOptions); } @@ -92,8 +93,9 @@ public Mono> uploadBytesWithSingleBodyTypeForMultiContentTypesWit @ServiceMethod(returns = ReturnType.SINGLE) public Mono> uploadBytesWithMultiBodyTypesForMultiContentTypesWithResponse(String contentType, BinaryData data, RequestOptions requestOptions) { - // Convenience API is not generated, as operation 'uploadBytesWithMultiBodyTypesForMultiContentTypes' is - // multiple content-type + // Operation 'uploadBytesWithMultiBodyTypesForMultiContentTypes' can be invoked with multiple content-type. It + // is difficult to form a correct method signature for convenience API, and hence the convenience API is not + // generated. return this.serviceClient.uploadBytesWithMultiBodyTypesForMultiContentTypesWithResponseAsync(contentType, data, requestOptions); } @@ -151,8 +153,9 @@ public Mono> uploadJsonWithMultiBodyTypesForMultiContentTypesWith @ServiceMethod(returns = ReturnType.SINGLE) public Mono> uploadJsonOrBytesWithMultiBodyTypesForMultiContentTypesWithResponse(String contentType, BinaryData data, RequestOptions requestOptions) { - // Convenience API is not generated, as operation 'uploadJsonOrBytesWithMultiBodyTypesForMultiContentTypes' is - // multiple content-type + // Operation 'uploadJsonOrBytesWithMultiBodyTypesForMultiContentTypes' can be invoked with multiple + // content-type. It is difficult to form a correct method signature for convenience API, and hence the + // convenience API is not generated. return this.serviceClient.uploadJsonOrBytesWithMultiBodyTypesForMultiContentTypesWithResponseAsync(contentType, data, requestOptions); } diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/multicontenttypes/MultipleContentTypesOnRequestClient.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/multicontenttypes/MultipleContentTypesOnRequestClient.java index 897df58acb..4756ef09f1 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/multicontenttypes/MultipleContentTypesOnRequestClient.java +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/multicontenttypes/MultipleContentTypesOnRequestClient.java @@ -60,8 +60,9 @@ public final class MultipleContentTypesOnRequestClient { @ServiceMethod(returns = ReturnType.SINGLE) public Response uploadBytesWithSingleBodyTypeForMultiContentTypesWithResponse(String contentType, BinaryData data, RequestOptions requestOptions) { - // Convenience API is not generated, as operation 'uploadBytesWithSingleBodyTypeForMultiContentTypes' is - // multiple content-type + // Operation 'uploadBytesWithSingleBodyTypeForMultiContentTypes' can be invoked with multiple content-type. It + // is difficult to form a correct method signature for convenience API, and hence the convenience API is not + // generated. return this.serviceClient.uploadBytesWithSingleBodyTypeForMultiContentTypesWithResponse(contentType, data, requestOptions); } @@ -90,8 +91,9 @@ public Response uploadBytesWithSingleBodyTypeForMultiContentTypesWithRespo @ServiceMethod(returns = ReturnType.SINGLE) public Response uploadBytesWithMultiBodyTypesForMultiContentTypesWithResponse(String contentType, BinaryData data, RequestOptions requestOptions) { - // Convenience API is not generated, as operation 'uploadBytesWithMultiBodyTypesForMultiContentTypes' is - // multiple content-type + // Operation 'uploadBytesWithMultiBodyTypesForMultiContentTypes' can be invoked with multiple content-type. It + // is difficult to form a correct method signature for convenience API, and hence the convenience API is not + // generated. return this.serviceClient.uploadBytesWithMultiBodyTypesForMultiContentTypesWithResponse(contentType, data, requestOptions); } @@ -148,8 +150,9 @@ public Response uploadJsonWithMultiBodyTypesForMultiContentTypesWithRespon @ServiceMethod(returns = ReturnType.SINGLE) public Response uploadJsonOrBytesWithMultiBodyTypesForMultiContentTypesWithResponse(String contentType, BinaryData data, RequestOptions requestOptions) { - // Convenience API is not generated, as operation 'uploadJsonOrBytesWithMultiBodyTypesForMultiContentTypes' is - // multiple content-type + // Operation 'uploadJsonOrBytesWithMultiBodyTypesForMultiContentTypes' can be invoked with multiple + // content-type. It is difficult to form a correct method signature for convenience API, and hence the + // convenience API is not generated. return this.serviceClient.uploadJsonOrBytesWithMultiBodyTypesForMultiContentTypesWithResponse(contentType, data, requestOptions); } diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/multipart/MultipartAsyncClient.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/multipart/MultipartAsyncClient.java index 8932e3602d..e1809c50ac 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/multipart/MultipartAsyncClient.java +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/multipart/MultipartAsyncClient.java @@ -65,8 +65,8 @@ public final class MultipartAsyncClient { @Generated @ServiceMethod(returns = ReturnType.SINGLE) Mono> uploadWithResponse(String name, BinaryData data, RequestOptions requestOptions) { - // Protocol API requires serialization of parts with content-disposition and data, as operation 'upload' is - // 'multipart/form-data' + // Operation 'upload' is of content-type 'multipart/form-data'. Protocol API is not usable and hence not + // generated. return this.serviceClient.uploadWithResponseAsync(name, data, requestOptions); } @@ -92,8 +92,8 @@ Mono> uploadWithResponse(String name, BinaryData data, RequestOpt @Generated @ServiceMethod(returns = ReturnType.SINGLE) Mono> uploadHttpPartWithResponse(String name, BinaryData body, RequestOptions requestOptions) { - // Protocol API requires serialization of parts with content-disposition and data, as operation 'uploadHttpPart' - // is 'multipart/form-data' + // Operation 'uploadHttpPart' is of content-type 'multipart/form-data'. Protocol API is not usable and hence not + // generated. return this.serviceClient.uploadHttpPartWithResponseAsync(name, body, requestOptions); } diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/multipart/MultipartClient.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/multipart/MultipartClient.java index 36bc7a83d1..35578997a4 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/multipart/MultipartClient.java +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/multipart/MultipartClient.java @@ -63,8 +63,8 @@ public final class MultipartClient { @Generated @ServiceMethod(returns = ReturnType.SINGLE) Response uploadWithResponse(String name, BinaryData data, RequestOptions requestOptions) { - // Protocol API requires serialization of parts with content-disposition and data, as operation 'upload' is - // 'multipart/form-data' + // Operation 'upload' is of content-type 'multipart/form-data'. Protocol API is not usable and hence not + // generated. return this.serviceClient.uploadWithResponse(name, data, requestOptions); } @@ -90,8 +90,8 @@ Response uploadWithResponse(String name, BinaryData data, RequestOptions r @Generated @ServiceMethod(returns = ReturnType.SINGLE) Response uploadHttpPartWithResponse(String name, BinaryData body, RequestOptions requestOptions) { - // Protocol API requires serialization of parts with content-disposition and data, as operation 'uploadHttpPart' - // is 'multipart/form-data' + // Operation 'uploadHttpPart' is of content-type 'multipart/form-data'. Protocol API is not usable and hence not + // generated. return this.serviceClient.uploadHttpPartWithResponse(name, body, requestOptions); } diff --git a/packages/http-client-java/generator/http-client-generator/src/main/java/com/microsoft/typespec/http/client/generator/Main.java b/packages/http-client-java/generator/http-client-generator/src/main/java/com/microsoft/typespec/http/client/generator/Main.java index 4d65d994de..2c933710e6 100644 --- a/packages/http-client-java/generator/http-client-generator/src/main/java/com/microsoft/typespec/http/client/generator/Main.java +++ b/packages/http-client-java/generator/http-client-generator/src/main/java/com/microsoft/typespec/http/client/generator/Main.java @@ -212,7 +212,7 @@ private static EmitterOptions loadEmitterOptions(CodeModel codeModel) { options.setOutputDir(options.getOutputDir() + "/"); } } catch (IOException e) { - LOGGER.info("Read emitter options failed, emitter options json: {}", emitterOptionsJson); + LOGGER.warn("Read emitter options failed, emitter options json: {}", emitterOptionsJson); } } diff --git a/packages/http-client-java/package-lock.json b/packages/http-client-java/package-lock.json index 44c94bf700..2e33139114 100644 --- a/packages/http-client-java/package-lock.json +++ b/packages/http-client-java/package-lock.json @@ -19,7 +19,7 @@ "@azure-tools/typespec-azure-core": "0.50.0", "@azure-tools/typespec-azure-resource-manager": "0.50.0", "@azure-tools/typespec-azure-rulesets": "0.50.0", - "@azure-tools/typespec-client-generator-core": "0.50.0", + "@azure-tools/typespec-client-generator-core": "0.50.2", "@microsoft/api-extractor": "^7.49.1", "@microsoft/api-extractor-model": "^7.30.2", "@types/js-yaml": "~4.0.9", @@ -44,7 +44,7 @@ "peerDependencies": { "@azure-tools/typespec-autorest": ">=0.50.0 <1.0.0", "@azure-tools/typespec-azure-core": ">=0.50.0 <1.0.0", - "@azure-tools/typespec-client-generator-core": ">=0.50.0 <1.0.0", + "@azure-tools/typespec-client-generator-core": ">=0.50.2 <1.0.0", "@typespec/compiler": ">=0.64.0 <1.0.0", "@typespec/http": ">=0.64.0 <1.0.0", "@typespec/openapi": ">=0.64.0 <1.0.0", @@ -181,10 +181,11 @@ } }, "node_modules/@azure-tools/typespec-client-generator-core": { - "version": "0.50.0", - "resolved": "https://registry.npmjs.org/@azure-tools/typespec-client-generator-core/-/typespec-client-generator-core-0.50.0.tgz", - "integrity": "sha512-Zk62SZb6W5neTtajcQAKll4zYSf3aKaMEDLymMTajXTsWxAlrb7sqnc8vTZWSIymaRI0A9olEL2luw9OLywUYA==", + "version": "0.50.2", + "resolved": "https://registry.npmjs.org/@azure-tools/typespec-client-generator-core/-/typespec-client-generator-core-0.50.2.tgz", + "integrity": "sha512-xSyJ5OWqu9BToUoQrmoN6a9pxHpTUqDEyc5pmhRwzeuz3zOIvFs2DFKimE2wqVmhFTYg6LTVqle/UU4sr/vdyQ==", "dev": true, + "license": "MIT", "dependencies": { "change-case": "~5.4.4", "pluralize": "^8.0.0", @@ -199,7 +200,8 @@ "@typespec/http": "~0.64.0", "@typespec/openapi": "~0.64.0", "@typespec/rest": "~0.64.0", - "@typespec/versioning": "~0.64.0" + "@typespec/versioning": "~0.64.0", + "@typespec/xml": "~0.64.0" } }, "node_modules/@azure/abort-controller": { diff --git a/packages/http-client-java/package.json b/packages/http-client-java/package.json index 661da1941c..234ddd5c75 100644 --- a/packages/http-client-java/package.json +++ b/packages/http-client-java/package.json @@ -17,9 +17,9 @@ }, "license": "MIT", "type": "module", - "main": "dist/emitter/emitter.js", + "main": "dist/emitter/index.js", "exports": { - ".": "./dist/emitter/emitter.js" + ".": "./dist/emitter/index.js" }, "engines": { "node": ">=18.0.0" @@ -44,7 +44,7 @@ "peerDependencies": { "@azure-tools/typespec-autorest": ">=0.50.0 <1.0.0", "@azure-tools/typespec-azure-core": ">=0.50.0 <1.0.0", - "@azure-tools/typespec-client-generator-core": ">=0.50.0 <1.0.0", + "@azure-tools/typespec-client-generator-core": ">=0.50.2 <1.0.0", "@typespec/compiler": ">=0.64.0 <1.0.0", "@typespec/http": ">=0.64.0 <1.0.0", "@typespec/openapi": ">=0.64.0 <1.0.0", @@ -63,7 +63,7 @@ "@azure-tools/typespec-azure-core": "0.50.0", "@azure-tools/typespec-azure-resource-manager": "0.50.0", "@azure-tools/typespec-azure-rulesets": "0.50.0", - "@azure-tools/typespec-client-generator-core": "0.50.0", + "@azure-tools/typespec-client-generator-core": "0.50.2", "@typespec/spector": "0.1.0-alpha.6", "@microsoft/api-extractor": "^7.49.1", "@microsoft/api-extractor-model": "^7.30.2", diff --git a/packages/http-client-python/CHANGELOG.md b/packages/http-client-python/CHANGELOG.md index 1abc43c233..aeba9a78b9 100644 --- a/packages/http-client-python/CHANGELOG.md +++ b/packages/http-client-python/CHANGELOG.md @@ -1,10 +1,17 @@ # Change Log - @typespec/http-client-python +## 0.6.9 + +### Bug Fixes + +- Fix output folder of models when output folder is different with namespace in configuration + ## 0.6.8 ### Bug Fixes - Fix for scenario that output folder is different with namespace +- Improve XML serialization information in generated models ## 0.6.7 diff --git a/packages/http-client-python/eng/scripts/ci/dev_requirements.txt b/packages/http-client-python/eng/scripts/ci/dev_requirements.txt new file mode 100644 index 0000000000..38c286da5d --- /dev/null +++ b/packages/http-client-python/eng/scripts/ci/dev_requirements.txt @@ -0,0 +1,11 @@ +pyright==1.1.391 +pylint==3.2.7 +tox==4.16.0 +mypy==1.14.1 +colorama==0.4.6 +debugpy==1.8.2 +pytest==8.3.2 +coverage==7.6.1 +black==24.8.0 +ptvsd==4.3.2 +types-PyYAML==6.0.12.8 diff --git a/packages/http-client-python/generator/dev_requirements.txt b/packages/http-client-python/generator/dev_requirements.txt index 99b5bfa176..5ad915cc9c 100644 --- a/packages/http-client-python/generator/dev_requirements.txt +++ b/packages/http-client-python/generator/dev_requirements.txt @@ -1,12 +1,2 @@ -e ./generator -pyright==1.1.391 -pylint==3.2.7 -tox==4.16.0 -mypy==1.14.1 -colorama==0.4.6 -debugpy==1.8.2 -pytest==8.3.2 -coverage==7.6.1 -black==24.8.0 -ptvsd==4.3.2 -types-PyYAML==6.0.12.8 +-r ../eng/scripts/ci/dev_requirements.txt diff --git a/packages/http-client-python/generator/pygen/codegen/serializers/__init__.py b/packages/http-client-python/generator/pygen/codegen/serializers/__init__.py index 99fa85c430..25531abe3c 100644 --- a/packages/http-client-python/generator/pygen/codegen/serializers/__init__.py +++ b/packages/http-client-python/generator/pygen/codegen/serializers/__init__.py @@ -238,7 +238,7 @@ def _serialize_and_write_models_folder( self, env: Environment, namespace: str, models: List[ModelType], enums: List[EnumType] ) -> None: # Write the models folder - models_path = self.exec_path(namespace + ".models") + models_path = self.exec_path(namespace) / "models" serializer = DpgModelSerializer if self.code_model.options["models_mode"] == "dpg" else MsrestModelSerializer if self.code_model.has_non_json_models(models): self.write_file( diff --git a/packages/http-client-python/generator/test/azure/requirements.txt b/packages/http-client-python/generator/test/azure/requirements.txt index cd2fa0481f..5c4e0d05a3 100644 --- a/packages/http-client-python/generator/test/azure/requirements.txt +++ b/packages/http-client-python/generator/test/azure/requirements.txt @@ -1,15 +1,7 @@ -setuptools==69.5.1 +-r ../dev_requirements.txt -e ../../ -aiohttp;python_full_version>="3.5.2" -requests==2.32.2 -pytest -pytest-asyncio==0.14.0;python_full_version>="3.5.2" azure-core==1.30.0 azure-mgmt-core==1.3.2 -pyright==1.1.391 -pylint==3.2.7 -tox==4.18.1 -mypy==1.14.1 # only for azure -e ./generated/azure-client-generator-core-access diff --git a/packages/http-client-python/generator/test/dev_requirements.txt b/packages/http-client-python/generator/test/dev_requirements.txt new file mode 100644 index 0000000000..aa9d18c9eb --- /dev/null +++ b/packages/http-client-python/generator/test/dev_requirements.txt @@ -0,0 +1,4 @@ +-r ../../eng/scripts/ci/dev_requirements.txt +aiohttp +pytest-asyncio==0.14.0 +requests==2.32.2 diff --git a/packages/http-client-python/generator/test/unbranded/requirements.txt b/packages/http-client-python/generator/test/unbranded/requirements.txt index 295c6de28e..1e08545659 100644 --- a/packages/http-client-python/generator/test/unbranded/requirements.txt +++ b/packages/http-client-python/generator/test/unbranded/requirements.txt @@ -1,14 +1,5 @@ -setuptools==69.5.1 +-r ../dev_requirements.txt -e ../../ -aiohttp;python_full_version>="3.5.2" -requests==2.32.2 -pytest -pytest-asyncio==0.14.0;python_full_version>="3.5.2" -pyright==1.1.391 -pylint==3.2.7 -tox==4.18.1 -mypy==1.14.1 - # common test case -e ./generated/authentication-api-key diff --git a/packages/http-client-python/package-lock.json b/packages/http-client-python/package-lock.json index 1503ded99a..35743726c6 100644 --- a/packages/http-client-python/package-lock.json +++ b/packages/http-client-python/package-lock.json @@ -1,12 +1,12 @@ { "name": "@typespec/http-client-python", - "version": "0.6.7", + "version": "0.6.9", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@typespec/http-client-python", - "version": "0.6.7", + "version": "0.6.9", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/packages/http-client-python/package.json b/packages/http-client-python/package.json index 6175e5a221..c7904e948a 100644 --- a/packages/http-client-python/package.json +++ b/packages/http-client-python/package.json @@ -1,6 +1,6 @@ { "name": "@typespec/http-client-python", - "version": "0.6.7", + "version": "0.6.9", "author": "Microsoft Corporation", "description": "TypeSpec emitter for Python SDKs", "homepage": "https://typespec.io", diff --git a/packages/http-server-csharp/CHANGELOG.md b/packages/http-server-csharp/CHANGELOG.md index c1f9f940a7..83abd1aede 100644 --- a/packages/http-server-csharp/CHANGELOG.md +++ b/packages/http-server-csharp/CHANGELOG.md @@ -1,5 +1,17 @@ # Change Log - @typespec/http-server-csharp +## 0.58.0-alpha.8 + +### Bug Fixes + +- [#5626](https://github.com/microsoft/typespec/pull/5626) Fixes controller generation with incorrect return when NoContent is in the spec +- [#5733](https://github.com/microsoft/typespec/pull/5733) Add scaffolding option for csharp generator + +### Bump dependencies + +- [#5690](https://github.com/microsoft/typespec/pull/5690) Upgrade dependencies + + ## 0.58.0-alpha.7 ### Bug Fixes diff --git a/packages/http-server-csharp/cmd/hscs.js b/packages/http-server-csharp/cmd/hscs.js new file mode 100755 index 0000000000..fa5dba1b12 --- /dev/null +++ b/packages/http-server-csharp/cmd/hscs.js @@ -0,0 +1,2 @@ +#!/usr/bin/env node +import "../dist/src/cli/cli.js"; diff --git a/packages/http-server-csharp/package.json b/packages/http-server-csharp/package.json index 6dc6e88039..2db2de389b 100644 --- a/packages/http-server-csharp/package.json +++ b/packages/http-server-csharp/package.json @@ -1,6 +1,6 @@ { "name": "@typespec/http-server-csharp", - "version": "0.58.0-alpha.7", + "version": "0.58.0-alpha.8", "author": "Microsoft Corporation", "description": "TypeSpec service code generator for c-sharp", "homepage": "https://typespec.io", @@ -19,15 +19,18 @@ "c-sharp" ], "type": "module", - "main": "dist/src/index.js", + "bin": { + "hscs": "./cmd/hscs.js" + }, + "main": "dist/src/lib/index.js", "exports": { ".": { - "types": "./dist/src/index.d.ts", - "default": "./dist/src/index.js" + "types": "./dist/src/lib/index.d.ts", + "default": "./dist/src/lib/index.js" }, "./testing": { - "types": "./dist/src/testing/index.d.ts", - "default": "./dist/src/testing/index.js" + "types": "./dist/src/lib/testing/index.d.ts", + "default": "./dist/src/lib/testing/index.js" } }, "engines": { @@ -46,7 +49,7 @@ "regen-docs": "echo No doc generation for alpha version" }, "files": [ - "lib/*.tsp", + "lib/**/*.tsp", "dist/**", "!dist/test/**" ], @@ -57,21 +60,27 @@ "@typespec/versioning": "workspace:~" }, "dependencies": { - "change-case": "~5.4.4" + "change-case": "~5.4.4", + "cross-spawn": "^7.0.6", + "picocolors": "~1.1.1", + "yargs": "~17.7.2" }, "devDependencies": { - "@types/node": "~22.10.7", + "@types/node": "~22.10.10", + "@types/yargs": "~17.0.33", + "@types/cross-spawn": "~6.0.6", "@typespec/compiler": "workspace:~", "@typespec/http": "workspace:~", "@typespec/library-linter": "workspace:~", "@typespec/openapi": "workspace:~", "@typespec/rest": "workspace:~", "@typespec/tspd": "workspace:~", - "@vitest/coverage-v8": "^3.0.3", + "@typespec/versioning": "workspace:~", + "@vitest/coverage-v8": "^3.0.4", "@vitest/ui": "^3.0.3", "c8": "^10.1.3", "rimraf": "~6.0.1", "typescript": "~5.7.3", - "vitest": "^3.0.3" + "vitest": "^3.0.4" } } diff --git a/packages/http-server-csharp/src/cli/cli.ts b/packages/http-server-csharp/src/cli/cli.ts new file mode 100644 index 0000000000..2a6ee85036 --- /dev/null +++ b/packages/http-server-csharp/src/cli/cli.ts @@ -0,0 +1,143 @@ +/* eslint-disable no-console */ +import { resolvePath, typespecVersion } from "@typespec/compiler"; +import { spawn } from "cross-spawn"; +import pc from "picocolors"; +import yargs from "yargs"; +import { hideBin } from "yargs/helpers"; + +async function main() { + console.log(`TypeSpec Http Server Emitter for C-Sharp v${typespecVersion}\n`); + + await yargs(hideBin(process.argv)) + .scriptName("hscs") + .help() + .strict() + .parserConfiguration({ + "greedy-arrays": false, + "boolean-negation": false, + }) + .command( + "scaffold [--use-swaggerui] ", + "Generate a complete project with mock implementation at the given project-directory for the given spec. This required dotnet 9: https://dotnet.microsoft.com/download.", + (cmd) => { + return cmd + .option("use-swaggerui", { + description: + "Include generated OpenAPI and a SwaggerUI endpoint in the service project. THIS OPTION REQUIRES '@typespec/openapi3' as a dependency of your typespec project.", + type: "boolean", + default: false, + }) + .positional("project-directory", { + description: "Path to the directory where the project will be created.", + type: "string", + demandOption: true, + }) + .positional("path-to-spec", { + description: "The path to the spec to generate a project for", + type: "string", + demandOption: true, + }); + }, + async (args) => { + const projectDir = resolvePath(process.cwd(), args["project-directory"]); + const pathToSpec = resolvePath(process.cwd(), args["path-to-spec"]); + const useSwagger: boolean = args["use-swaggerui"]; + console.log(pc.bold("Generating new Project")); + let result = await runScriptAsync("dotnet", ["new", "web", "-o", projectDir, "--force"]); + if (result !== 0) { + console.log( + pc.bold( + "Dotnet version 9 cli is required for scaffolding. Download here: https://dotnet.microsoft.com/download ", + ), + ); + return; + } + if (useSwagger) { + console.log(pc.bold("Adding OpenApi generation support")); + console.log(pc.green(`> dotnet add ${projectDir} package SwashBuckle.AspNetCore`)); + result = await runScriptAsync("dotnet", [ + "add", + projectDir, + "package", + "SwashBuckle.AspNetCore", + ]); + } + console.log(pc.bold("Compiling spec with mock implementations")); + const generatedTargetDir = resolvePath(process.cwd(), projectDir, "generated"); + const generatedOpenApiDir = resolvePath(process.cwd(), projectDir, "openapi"); + const compileArgs: string[] = [ + "tsp", + "compile", + pathToSpec, + "--emit", + "@typespec/http-server-csharp", + "--option", + `@typespec/http-server-csharp.emitter-output-dir=${generatedTargetDir}`, + "--option", + "@typespec/http-server-csharp.emit-mocks=all", + ]; + + const swaggerArgs: string[] = [ + "--emit", + "@typespec/openapi3", + "--option", + `@typespec/openapi3.emitter-output-dir=${generatedOpenApiDir}`, + "--option", + "@typespec/http-server-csharp.use-swaggerui=true", + ]; + if (useSwagger) compileArgs.push(...swaggerArgs); + result = await runScriptAsync("npx", compileArgs); + if (result === 0) { + console.log(pc.bold(`Your project was successfully created at "${projectDir}"`)); + console.log( + `You can build and start the project using 'dotnet run --project ${projectDir}'`, + ); + } else { + console.log(pc.bold("There were one or more errors")); + if (useSwagger) { + console.log( + "You must have @typespec/openapi3 as a dependency in your typespec project for use of SwaggerUI. ", + ); + } + } + }, + ) + .version(typespecVersion) + .demandCommand(1, "You must use one of the supported commands.").argv; +} + +function internalError(error: unknown) { + // NOTE: An expected error, like one thrown for bad input, shouldn't reach + // here, but be handled somewhere else. If we reach here, it should be + // considered a bug and therefore we should not suppress the stack trace as + // that risks losing it in the case of a bug that does not repro easily. + console.log(error); +} + +function runScriptAsync(cmd: string, args: string[]): Promise { + let resolver: (value: number | PromiseLike) => void; + let rejecter: (value: unknown) => void; + const promise = new Promise((resolve, reject) => { + resolver = resolve; + rejecter = reject; + }); + console.log(pc.green(`> ${cmd} ${args.join(" ")}`)); + const proc = spawn(cmd, args); + proc.stdout?.on("data", (data) => console.log(pc.dim(data))); + proc.stderr?.on("data", (data) => { + console.error(data); + rejecter(data); + }); + proc.on("close", (_, __) => { + resolver(proc.exitCode || 0); + }); + + return promise; +} + +process.on("unhandledRejection", (error: unknown) => { + console.error("Unhandled promise rejection!"); + internalError(error); +}); + +main().catch(internalError); diff --git a/packages/http-server-csharp/src/attributes.ts b/packages/http-server-csharp/src/lib/attributes.ts similarity index 100% rename from packages/http-server-csharp/src/attributes.ts rename to packages/http-server-csharp/src/lib/attributes.ts diff --git a/packages/http-server-csharp/src/boilerplate.ts b/packages/http-server-csharp/src/lib/boilerplate.ts similarity index 85% rename from packages/http-server-csharp/src/boilerplate.ts rename to packages/http-server-csharp/src/lib/boilerplate.ts index 3d4aa45032..31c907ec64 100644 --- a/packages/http-server-csharp/src/boilerplate.ts +++ b/packages/http-server-csharp/src/lib/boilerplate.ts @@ -1,6 +1,12 @@ import { AssetEmitter } from "@typespec/compiler/emitter-framework"; import { LibrarySourceFile } from "./interfaces.js"; +export const GeneratedFileHeader = `// Generated by @typespec/http-server-csharp +// `; +export const GeneratedFileHeaderWithNullable: string = `// Generated by @typespec/http-server-csharp +// + #nullable enable`; + export function getSerializationSourceFiles( emitter: AssetEmitter>, ): LibrarySourceFile[] { @@ -51,15 +57,22 @@ export function getSerializationSourceFiles( emitter: emitter, getContents: getNumericArrayConstraintConverter, }), + new LibrarySourceFile({ + filename: "IJsonSerializationProvider.cs", + emitter: emitter, + getContents: getJsonProviderInterface, + }), + new LibrarySourceFile({ + filename: "JsonSerializationProvider.cs", + emitter: emitter, + getContents: getJsonProvider, + }), ); return sourceFiles; } function getNumericConstraintConverter(): string { - return `// Copyright (c) Microsoft Corporation. All rights reserved. - // Licensed under the MIT License. - // - #nullable enable + return `${GeneratedFileHeaderWithNullable} using System.Numerics; using System.Text.Json; @@ -160,10 +173,7 @@ function getNumericConstraintConverter(): string { } function getStringConstraintConverter(): string { - return `// Copyright (c) Microsoft Corporation. All rights reserved. - // Licensed under the MIT License. - // - #nullable enable + return `${GeneratedFileHeaderWithNullable} using System.Text.Json; using System.Text.Json.Serialization; @@ -285,10 +295,7 @@ function getStringConstraintConverter(): string { } function getArrayConstraintConverter(): string { - return `// Copyright (c) Microsoft Corporation. All rights reserved. - // Licensed under the MIT License. - // - #nullable enable + return `${GeneratedFileHeaderWithNullable} using System.Text.Json; using System.Text.Json.Serialization; @@ -401,10 +408,7 @@ function getArrayConstraintConverter(): string { } function getNumericArrayConstraintConverter(): string { - return `// Copyright (c) Microsoft Corporation. All rights reserved. - // Licensed under the MIT License. - // -#nullable enable + return `${GeneratedFileHeaderWithNullable} using System.Numerics; using System.Text.Json; @@ -439,10 +443,7 @@ public class NumericArrayConstraintAttribute : ArrayConstraintAttribute wh } function getStringArrayConstraintConverter(): string { - return `// Copyright (c) Microsoft Corporation. All rights reserved. - // Licensed under the MIT License. - // -#nullable enable + return `${GeneratedFileHeaderWithNullable} using System.Text.Json; using System.Text.Json.Serialization; @@ -474,10 +475,7 @@ public class StringArrayConstraintAttribute : ArrayConstraintAttribute } function getTimeSpanDurationConverter(): string { - return `// Copyright (c) Microsoft Corporation. All rights reserved. - // Licensed under the MIT License. - // -#nullable enable + return `${GeneratedFileHeaderWithNullable} using System.Text.Json; using System.Text.Json.Serialization; @@ -510,10 +508,7 @@ function getTimeSpanDurationConverter(): string { } function getBase64UrlConverter(): string { - return `// Copyright (c) Microsoft Corporation. All rights reserved. - // Licensed under the MIT License. - // -#nullable enable + return `${GeneratedFileHeaderWithNullable} using System.Text.Json; using System.Text.Json.Serialization; @@ -558,10 +553,7 @@ function getBase64UrlConverter(): string { } function getUnixEpochDateTimeConverter(): string { - return `// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. -// -#nullable enable + return `${GeneratedFileHeaderWithNullable} using System.Text.Json; using System.Text.Json.Serialization; @@ -592,10 +584,7 @@ function getUnixEpochDateTimeConverter(): string { } function getUnixEpochDateTimeOffsetConverter(): string { - return `// Copyright (c) Microsoft Corporation. All rights reserved. - // Licensed under the MIT License. - // -#nullable enable + return `${GeneratedFileHeaderWithNullable} using System.Text.Json; using System.Text.Json.Serialization; @@ -625,3 +614,84 @@ function getUnixEpochDateTimeOffsetConverter(): string { } `; } + +function getJsonProviderInterface(): string { + return `${GeneratedFileHeaderWithNullable} + +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace TypeSpec.Helpers +{ + /// + /// Interface for Json serialization, suitable for providing a service in ASP.Net dependency injection + /// + public interface IJsonSerializationProvider + { + /// + /// Serialize an object to a JSON string + /// + /// The type of the object + /// The object to serialize + /// A string representing the serialized object + string Serialize(T value); + + /// + /// Create an object from a json string + /// + /// The type of the object represented in the string + /// The strign to deserialize + /// The deserialized object, or null + T? Deserialize(string value); + } +} +`; +} + +function getJsonProvider(): string { + return `${GeneratedFileHeaderWithNullable} + +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace TypeSpec.Helpers +{ + /// + /// Standard implementation of IJsonSerializationProvider + /// + public class JsonSerializationProvider : IJsonSerializationProvider + { + /// + /// The options to use for serialization + /// + public virtual JsonSerializerOptions Options { get; } = new JsonSerializerOptions + { + PropertyNamingPolicy = JsonNamingPolicy.CamelCase, + DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull + }; + + /// + /// Create an object from a json string + /// + /// The type of the object represented in the string + /// The strign to deserialize + /// The deserialized object, or null + public virtual T? Deserialize(string value) + { + return JsonSerializer.Deserialize(value, Options); + } + + /// + /// Serialize an object to a JSON string + /// + /// The type of the object + /// The object to serialize + /// A string representing the serialized object + public virtual string Serialize(T value) + { + return JsonSerializer.Serialize(value, Options); + } + } +} +`; +} diff --git a/packages/http-server-csharp/src/index.ts b/packages/http-server-csharp/src/lib/index.ts similarity index 100% rename from packages/http-server-csharp/src/index.ts rename to packages/http-server-csharp/src/lib/index.ts diff --git a/packages/http-server-csharp/src/interfaces.ts b/packages/http-server-csharp/src/lib/interfaces.ts similarity index 97% rename from packages/http-server-csharp/src/interfaces.ts rename to packages/http-server-csharp/src/lib/interfaces.ts index fd51fe3de4..c9dc1d6a7c 100644 --- a/packages/http-server-csharp/src/interfaces.ts +++ b/packages/http-server-csharp/src/lib/interfaces.ts @@ -282,9 +282,11 @@ export class LibrarySourceFile { filename: string; getContents: () => string; emitter: AssetEmitter>; + path?: string; }) { + this.path = params.path !== undefined ? params.path : "lib/"; this.filename = params.filename; - this.source = params.emitter.createSourceFile(`lib/${this.filename}`); + this.source = params.emitter.createSourceFile(`${this.path}/${this.filename}`); this.emitted = { path: this.source.path, contents: params.getContents(), @@ -294,4 +296,5 @@ export class LibrarySourceFile { filename: string; source: SourceFile; emitted: EmittedSourceFile; + path: string; } diff --git a/packages/http-server-csharp/src/lib.ts b/packages/http-server-csharp/src/lib/lib.ts similarity index 71% rename from packages/http-server-csharp/src/lib.ts rename to packages/http-server-csharp/src/lib/lib.ts index 948ab5a39d..d8e2602732 100644 --- a/packages/http-server-csharp/src/lib.ts +++ b/packages/http-server-csharp/src/lib/lib.ts @@ -5,6 +5,12 @@ export interface CSharpServiceEmitterOptions { "skip-format"?: boolean; /** Choose which service artifacts to emit. Default is 'all'.*/ "output-type"?: "models" | "all"; + /** Emit mock implementations of business logic and setup code. Allows the service to respond to requests with mock responses.*/ + "emit-mocks"?: "none" | "all"; + /** Configure a Swagger UI endpoint in the development configuration. */ + "use-swaggerui"?: boolean; + /** Use openapi at the given path for generating SwaggerUI endpoints. By default, this will be 'openapi/openapi.yaml' if the 'use-swaggerui' option is enabled. */ + "openapi-path"?: string; } const EmitterOptionsSchema: JSONSchemaType = { @@ -25,6 +31,27 @@ const EmitterOptionsSchema: JSONSchemaType = { description: "Chooses which service artifacts to emit. choices include 'models' or 'all' artifacts.", }, + "emit-mocks": { + type: "string", + enum: ["all", "none"], + nullable: true, + default: "none", + description: + "Emits mock implementations of business logic, enabling the service to respond to requests before a real implementation is provided", + }, + "use-swaggerui": { + type: "boolean", + nullable: true, + default: false, + description: "Configure a Swagger UI endpoint in the development configuration", + }, + "openapi-path": { + type: "string", + nullable: true, + default: null, + description: + "Use openapi at the given path for generating SwaggerUI endpoints. By default, this will be 'openapi/openapi.yaml' if the 'use-swaggerui' option is enabled. ", + }, }, required: [], }; diff --git a/packages/http-server-csharp/src/lib/scaffolding.ts b/packages/http-server-csharp/src/lib/scaffolding.ts new file mode 100644 index 0000000000..23f070c4b9 --- /dev/null +++ b/packages/http-server-csharp/src/lib/scaffolding.ts @@ -0,0 +1,431 @@ +import { AssetEmitter, code } from "@typespec/compiler/emitter-framework"; +import { GeneratedFileHeaderWithNullable } from "./boilerplate.js"; +import { LibrarySourceFile } from "./interfaces.js"; + +export interface BusinessLogicImplementation { + namespace: string; + interfaceName: string; + usings: string[]; + className: string; + methods: BusinessLogicMethod[]; +} + +export interface BusinessLogicMethod { + methodName: string; + methodParams: string; + returnType: string; + instantiatedReturnType?: string; +} + +export type BusinessLogicRegistrations = Map; +export type BusinessLogicRegistration = [string, BusinessLogicImplementation]; + +export function getScaffoldingHelpers( + emitter: AssetEmitter>, + useSwagger: boolean, + openApiPath: string, +): LibrarySourceFile[] { + const sourceFiles: LibrarySourceFile[] = []; + sourceFiles.push( + new LibrarySourceFile({ + filename: "IInitializer.cs", + emitter: emitter, + getContents: getInitializerInterface, + }), + new LibrarySourceFile({ + filename: "Initializer.cs", + emitter: emitter, + getContents: getInitializerImplementation, + }), + new LibrarySourceFile({ + filename: "Program.cs", + emitter: emitter, + getContents: () => getProjectStartup(useSwagger, openApiPath), + path: "../", + }), + ); + return sourceFiles; +} + +export function getBusinessLogicImplementations( + emitter: AssetEmitter>, + registrations: BusinessLogicRegistrations, +): LibrarySourceFile[] { + const sourceFiles: LibrarySourceFile[] = []; + const mocks: BusinessLogicImplementation[] = []; + for (const [name, impl] of registrations) { + sourceFiles.push( + new LibrarySourceFile({ + filename: `${impl.className}.cs`, + emitter: emitter, + getContents: () => getBusinessLogicImplementation(name, impl), + path: "../mocks/", + }), + ); + mocks.push(impl); + } + if (mocks.length > 0) { + sourceFiles.push( + new LibrarySourceFile({ + filename: "MockRegistration.cs", + emitter: emitter, + getContents: () => getMockRegistration(mocks), + path: "../mocks/", + }), + ); + } + return sourceFiles; +} + +function getBusinessLogicImplementation(iface: string, mock: BusinessLogicImplementation): string { + const methods: string[] = []; + for (const method of mock.methods) { + const methodCode: string = + method.instantiatedReturnType !== undefined + ? `return Task.FromResult(_initializer.Initialize<${method.instantiatedReturnType}>());` + : "return Task.CompletedTask;"; + methods.push(` public ${method.returnType} ${method.methodName}( ${method.methodParams}) + { + ${methodCode} + }`); + } + return `${GeneratedFileHeaderWithNullable} + +using System; +using System.Net; +using System.Text.Json; +using System.Text.Json.Serialization; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc;${mock.methods.some((m) => m.methodParams.includes("MultipartReader")) ? `\nusing Microsoft.AspNetCore.WebUtilities;` : ""} +using ${mock.namespace}.Models; +using TypeSpec.Helpers; + +namespace ${mock.namespace} +{ + /// + /// This is a mock implementation of the business logic interface for + /// demonstration and early development. Feel free to overwrite this file. + /// Or replace it with another implementation, and register that implementation + /// in the dependency injection container + /// + /// The initializer class, registered with dependency injection + public class ${mock.className} : ${mock.interfaceName} + { + public ${mock.className}(IInitializer initializer) + { + _initializer = initializer; + } + + private IInitializer _initializer; + +${methods.join("\n\n")} + } +} + `; +} + +function getMockRegistration(mocks: BusinessLogicImplementation[]): string { + if (mocks.length < 1) return ""; + const cache: Map = new Map(); + return `${GeneratedFileHeaderWithNullable} + +using Microsoft.AspNetCore.Http.Features; +${mocks + .flatMap((m) => m.usings) + .filter((t) => { + const result: boolean = !cache.has(t); + cache.set(t, t); + return result; + }) + .flatMap((e) => `using ${e};`) + .join("\n")} +using ${mocks[0].namespace}; + +namespace TypeSpec.Helpers +{ + /// + /// Register Business Logic implementations. Replace with actual implementations when available. + /// + public static class MockRegistration + { + public static void Register(WebApplicationBuilder builder) + { + builder.Services.AddScoped(); + // Used for mock implementation only. Remove once business logic interfaces are implemented. + builder.Services.AddSingleton>(new Dictionary()); + builder.Services.AddScoped(); + // Mock business logic implementations +${mocks.flatMap((m) => ` builder.Services.AddScoped<${m.interfaceName}, ${m.className}>();`).join("\n")} + // Included for multipart/form-data support + builder.Services.Configure(options => + { + options.MemoryBufferThreshold = int.MaxValue; + options.MultipartBodyLengthLimit = int.MaxValue; + }); + } + } +}`; +} + +function getProjectStartup(useSwagger: boolean, openApiPath: string): string { + return `${GeneratedFileHeaderWithNullable} + +using TypeSpec.Helpers; + +var builder = WebApplication.CreateBuilder(args); + +// Add services to the container. +builder.Services.AddControllersWithViews(); +builder.Services.AddEndpointsApiExplorer(); +${useSwagger ? "builder.Services.AddSwaggerGen();" : ""} +MockRegistration.Register(builder); + +var app = builder.Build(); + +// Configure the HTTP request pipeline. +if (!app.Environment.IsDevelopment()) +{ + app.UseExceptionHandler("/Home/Error"); + // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. + app.UseHsts(); +} +${ + useSwagger + ? code`else +{ + app.UseSwagger(); + app.UseSwaggerUI( c=> { + c.DocumentTitle = "TypeSpec Generated OpenAPI Viewer"; + c.SwaggerEndpoint("/openapi.yaml", "TypeSpec Generated OpenAPI Docs"); + c.RoutePrefix = "swagger"; + }); +}\n` + : "" +} + +app.UseHttpsRedirection(); +app.UseStaticFiles(); +app.Use(async (context, next) => +{ + context.Request.EnableBuffering(); + await next(); +}); +${ + useSwagger + ? code` +app.MapGet("/openapi.yaml", async (HttpContext context) => +{ + var externalFilePath = "${openApiPath}"; // Full path to the file outside the project + if (!File.Exists(externalFilePath)) + { + context.Response.StatusCode = StatusCodes.Status404NotFound; + await context.Response.WriteAsync("OpenAPI spec not found."); + return; + } + context.Response.ContentType = "application/json"; + await context.Response.SendFileAsync(externalFilePath); +});\n` + : "" +} + +app.UseRouting(); + +app.UseAuthorization(); + + +app.MapControllerRoute( + name: "default", + pattern: "{controller=Home}/{action=Index}/{id?}"); + + +app.Run();`; +} + +function getInitializerInterface(): string { + return `${GeneratedFileHeaderWithNullable} + +namespace TypeSpec.Helpers +{ + /// + /// Interface for object initialization in mocks + /// + public interface IInitializer + { + /// + /// Initialize an object fo the given type + /// + /// The type to initialize + /// An instance of the given type. Or null if initialization was impossible. + object? Initialize(System.Type type); + + /// + /// Initialize an object of the given type + /// + /// The type to initialize + /// An instance of the given type + T Initialize() where T : class, new(); + } +} +`; +} + +function getInitializerImplementation(): string { + return `${GeneratedFileHeaderWithNullable} + +namespace TypeSpec.Helpers +{ + /// + /// Default initializer for mock implementations of business logic interfaces + /// + public class Initializer : IInitializer + { + /// + /// Instantiate the initializer. The cache *should* be instantiated using ASP.Net Core's dependency injection + /// + /// + public Initializer(IDictionary cache) + { + Cache = cache; + } + + internal virtual IDictionary Cache { get; } + + internal object? CacheAndReturn(Type type, object? instance) + { + Cache[type] = instance; + return instance; + } + + /// + /// Initialize an object fo the given type + /// + /// The type to initialize + /// An instance of the given type. Or null if initialization was impossible. + public object? Initialize (Type type) + { + if (Cache.ContainsKey(type)) + { + return Cache[type]; + } + if (type == typeof(string)) + { + return CacheAndReturn(type, string.Empty); + } + if (type == typeof(int)) + { + return CacheAndReturn(type, 0); + } + if (type == typeof(long)) + { + return CacheAndReturn(type, 0L); + } + if (type == typeof(float)) + { + return CacheAndReturn(type, 0.0f); + } + if (type == typeof(double)) + { + return CacheAndReturn(type, 0.0); + } + if (type == typeof(decimal)) + { + return CacheAndReturn(type, 0.0m); + } + if (type == typeof(bool)) + { + return CacheAndReturn(type, false); + } + if (type == typeof(byte)) + { + return CacheAndReturn(type, (byte)0); + } + if (type == typeof(char)) + { + return CacheAndReturn(type, (char)0); + } + if (type == typeof(short)) + { + return CacheAndReturn(type, (short)0); + } + if (type == typeof(uint)) + { + return CacheAndReturn(type, (uint)0); + } + if (type == typeof(ulong)) + { + return CacheAndReturn(type, (ulong)0); + } + if (type == typeof(ushort)) + { + return CacheAndReturn(type, (ushort)0); + } + if (type == typeof(sbyte)) + { + return CacheAndReturn(type, (sbyte)0); + } + if (type == typeof(DateTime)) + { + return CacheAndReturn(type, DateTime.UtcNow); + } + if (type == typeof(DateTimeOffset)) + { + return CacheAndReturn(type, DateTimeOffset.UtcNow); + } + if ( type == typeof(TimeSpan)) + { + return CacheAndReturn(type, TimeSpan.Zero); + } + if (type.IsArray) + { + var element = type.GetElementType(); + if (element == null) return null; + return CacheAndReturn(type, Array.CreateInstance(element, 0)); + } + if (type.IsClass) + { + return InitializeClass(type); + } + var genericType = Nullable.GetUnderlyingType(type); + if ( (genericType != null)) + { + return Initialize(genericType); + } + return new object(); + } + + /// + /// Initialize an object of the given type + /// + /// The type to initialize + /// An instance of the given type + public T Initialize() where T: class, new() + { + var result = new T(); + var initialized = InitializeClass(typeof(T), result); + return initialized as T ?? result; + } + + private object? InitializeClass(Type type, object? instance = null) + { + if (Cache.ContainsKey(type)) + { + instance = Cache[type]; + return instance; + } + + var result = instance == null ? Activator.CreateInstance(type) : instance; + foreach (var property in type.GetProperties()) + { + if (property.CanWrite) + { + var propertyType = property.PropertyType; + property.SetValue(result, Initialize(propertyType)); + } + } + + return CacheAndReturn(type, result); + } + } +} +`; +} diff --git a/packages/http-server-csharp/src/service.ts b/packages/http-server-csharp/src/lib/service.ts similarity index 93% rename from packages/http-server-csharp/src/service.ts rename to packages/http-server-csharp/src/lib/service.ts index 3af2580685..1356220cc8 100644 --- a/packages/http-server-csharp/src/service.ts +++ b/packages/http-server-csharp/src/lib/service.ts @@ -59,7 +59,11 @@ import { } from "@typespec/http"; import { getResourceOperation } from "@typespec/rest"; import { execFile } from "child_process"; -import { getSerializationSourceFiles } from "./boilerplate.js"; +import { + GeneratedFileHeader, + GeneratedFileHeaderWithNullable, + getSerializationSourceFiles, +} from "./boilerplate.js"; import { CSharpSourceType, CSharpType, @@ -70,6 +74,13 @@ import { ResponseInfo, } from "./interfaces.js"; import { CSharpServiceEmitterOptions, reportDiagnostic } from "./lib.js"; +import { + BusinessLogicImplementation, + BusinessLogicMethod, + BusinessLogicRegistrations, + getBusinessLogicImplementations, + getScaffoldingHelpers, +} from "./scaffolding.js"; import { getRecordType, isKnownReferenceType } from "./type-helpers.js"; import { HttpMetadata, @@ -97,12 +108,21 @@ export async function $onEmit(context: EmitContext) class CSharpCodeEmitter extends CodeTypeEmitter { #metadateMap: Map = new Map(); - #licenseHeader: string = `// Copyright (c) Microsoft Corporation. All rights reserved. - // Licensed under the MIT License.`; + #generatedFileHeaderWithNullable: string = GeneratedFileHeaderWithNullable; + #generatedFileHeader: string = GeneratedFileHeader; #sourceTypeKey: string = "sourceType"; #libraryFiles: LibrarySourceFile[] = getSerializationSourceFiles(this.emitter); #baseNamespace: string | undefined = undefined; #emitterOutputType = context.options["output-type"]; + #emitMocks: string | undefined = context.options["emit-mocks"]; + #useSwagger: boolean = context.options["use-swaggerui"] || false; + #openapiPath: string = context.options["openapi-path"] || "openapi/openapi.yaml"; + #mockRegistrations: BusinessLogicRegistrations = new Map(); + #mockHelpers: LibrarySourceFile[] = + this.#emitMocks === "all" + ? getScaffoldingHelpers(this.emitter, this.#useSwagger, this.#openapiPath) + : []; + #mockFiles: LibrarySourceFile[] = []; #metaInfo: MetadataInfo = createMetadataInfo(this.emitter.getProgram(), { canonicalVisibility: Visibility.Read, @@ -160,8 +180,7 @@ export async function $onEmit(context: EmitContext) this.#metadateMap.set(en, new CSharpType({ name: enumName, namespace: namespace })); return this.emitter.result.declaration( enumName, - code`${this.#licenseHeader} - // + code`${this.#generatedFileHeader} ${this.#emitUsings()} @@ -250,8 +269,7 @@ export async function $onEmit(context: EmitContext) this.#metadateMap.set(model, new CSharpType({ name: className, namespace: namespace })); const decl = this.emitter.result.declaration( className, - code`${this.#licenseHeader} - // + code`${this.#generatedFileHeader} ${this.#emitUsings()} @@ -555,8 +573,7 @@ export async function $onEmit(context: EmitContext) this.#metadateMap.set(iface, new CSharpType({ name: ifaceName, namespace: namespace })); const decl = this.emitter.result.declaration( ifaceName, - code`${this.#licenseHeader} - // + code`${this.#generatedFileHeaderWithNullable} ${this.#emitUsings()} @@ -601,6 +618,21 @@ export async function $onEmit(context: EmitContext) const builder: StringBuilder = new StringBuilder(); const metadata = new HttpMetadata(); const context = this.emitter.getContext(); + const name = `${ensureCSharpIdentifier( + this.emitter.getProgram(), + iface, + iface.name, + NameCasingType.Class, + )}`; + const ifaceNamespace = this.#getOrSetBaseNamespace(iface); + const namespace = `${ifaceNamespace}`; + const mock: BusinessLogicImplementation = { + className: name, + interfaceName: `I${name}`, + methods: [], + namespace: namespace, + usings: [`${ifaceNamespace}.Models`], + }; for (const [name, operation] of iface.operations) { const doc = getDoc(this.emitter.getProgram(), operation); const returnTypes: Type[] = []; @@ -621,20 +653,41 @@ export async function $onEmit(context: EmitContext) NameCasingType.Method, ); let opDecl: Declaration; + let opImpl: BusinessLogicMethod; if (this.#isMultipartRequest(httpOp)) { + opImpl = { + methodName: `${opName}Async`, + methodParams: `${this.#emitInterfaceOperationParameters(operation, "MultipartReader reader")}`, + returnType: `${returnType.name === "void" ? "Task" : `Task<${returnType.getTypeReference(context.scope)}>`}`, + instantiatedReturnType: + returnType.name === "void" + ? undefined + : `${returnType.getTypeReference(context.scope)}`, + }; opDecl = this.emitter.result.declaration( opName, - code`${doc ? `${formatComment(doc)}\n` : ""}${returnType.name === "void" ? "Task" : `Task<${returnType.getTypeReference(context.scope)}>`} ${opName}Async( ${this.#emitInterfaceOperationParameters(operation, "MultipartReader reader")});`, + code`${doc ? `${formatComment(doc)}\n` : ""}${opImpl.returnType} ${opImpl.methodName}( ${opImpl.methodParams});`, ); } else { + opImpl = { + methodName: `${opName}Async`, + methodParams: `${this.#emitInterfaceOperationParameters(operation)}`, + returnType: `${returnType.name === "void" ? "Task" : `Task<${returnType.getTypeReference(context.scope)}>`}`, + instantiatedReturnType: + returnType.name === "void" + ? undefined + : `${returnType.getTypeReference(context.scope)}`, + }; opDecl = this.emitter.result.declaration( opName, - code`${doc ? `${formatComment(doc)}\n` : ""}${returnType.name === "void" ? "Task" : `Task<${returnType.getTypeReference(context.scope)}>`} ${opName}Async( ${this.#emitInterfaceOperationParameters(operation)});`, + code`${doc ? `${formatComment(doc)}\n` : ""}${opImpl.returnType} ${opImpl.methodName}( ${opImpl.methodParams});`, ); } + mock.methods.push(opImpl); builder.push(code`${opDecl.value}\n`); this.emitter.emitInterfaceOperation(operation); } + this.#mockRegistrations.set(mock.interfaceName, mock); return builder.reduce(); } @@ -978,8 +1031,7 @@ export async function $onEmit(context: EmitContext) this.#metadateMap.set(union, new CSharpType({ name: unionName, namespace: namespace })); return this.emitter.result.declaration( unionName, - code`${this.#licenseHeader} - // + code`${this.#generatedFileHeader} ${this.#emitUsings()} @@ -1212,7 +1264,7 @@ export async function $onEmit(context: EmitContext) let context: ControllerContext | undefined = controllers.get(name); if (context !== undefined) return context; const sourceFile: SourceFile = this.emitter.createSourceFile( - `controllers/${name}ControllerBase.cs`, + `controllers/${name}Controller.cs`, ); const namespace = this.#getOrSetBaseNamespace(operation); const modelNamespace = `${namespace}.Models`; @@ -1275,6 +1327,16 @@ export async function $onEmit(context: EmitContext) for (const libFile of this.#libraryFiles) { if (sourceFile === libFile.source) return libFile.emitted; } + if (this.#emitMocks === "all") { + for (const helper of this.#mockHelpers) { + if (sourceFile === helper.source) return helper.emitted; + } + } + if (this.#mockFiles.length > 0) { + for (const mock of this.#mockFiles) { + if (sourceFile === mock.source) return mock.emitted; + } + } const emittedSourceFile: EmittedSourceFile = { path: sourceFile.path, @@ -1305,18 +1367,22 @@ export async function $onEmit(context: EmitContext) #emitControllerContents(file: SourceFile): string { const namespace = file.meta.namespace; const contents: StringBuilder = new StringBuilder(); - contents.push(`${this.#licenseHeader}\n`); - contents.push("// \n\n"); + contents.push(`${this.#generatedFileHeader}\n\n`); contents.push(code`${this.#emitUsings(file)}\n`); contents.push("\n"); contents.push(`namespace ${namespace}.Controllers\n`); contents.push("{\n"); contents.push("[ApiController]\n"); - contents.push(`public abstract partial class ${file.meta["resource"]}Base: ControllerBase\n`); + contents.push(`public partial class ${file.meta["resource"]}: ControllerBase\n`); + contents.push("{\n"); + contents.push("\n"); + contents.push(`public ${file.meta["resource"]}(I${file.meta.resourceName} operations)\n`); contents.push("{\n"); + contents.push(` ${file.meta.resourceName}Impl = operations;\n`); + contents.push("}"); contents.push("\n"); contents.push( - code`internal abstract I${file.meta.resourceName} ${file.meta.resourceName}Impl { get;}\n`, + code`internal virtual I${file.meta.resourceName} ${file.meta.resourceName}Impl { get;}\n`, ); for (const decl of file.globalScope.declarations) { contents.push(decl.value + "\n"); @@ -1451,6 +1517,18 @@ export async function $onEmit(context: EmitContext) sourceFiles.push(source.source); } + if (this.#emitMocks === "all") { + for (const helper of this.#mockHelpers) { + sourceFiles.push(helper.source); + } + + if (this.#mockRegistrations.size > 0) { + const mocks = getBusinessLogicImplementations(this.emitter, this.#mockRegistrations); + this.#mockFiles.push(...mocks); + sourceFiles.push(...mocks.flatMap((l) => l.source)); + } + } + const emittedSourceFiles: SourceFile[] = []; for (const source of sourceFiles) { switch (this.#emitterOutputType) { diff --git a/packages/http-server-csharp/src/testing/index.ts b/packages/http-server-csharp/src/lib/testing/index.ts similarity index 90% rename from packages/http-server-csharp/src/testing/index.ts rename to packages/http-server-csharp/src/lib/testing/index.ts index b0d7de1f79..39652d3605 100644 --- a/packages/http-server-csharp/src/testing/index.ts +++ b/packages/http-server-csharp/src/lib/testing/index.ts @@ -7,4 +7,5 @@ import { export const CSharpServiceEmitterTestLibrary: TypeSpecTestLibrary = createTestLibrary({ name: "@typespec/http-server-csharp", packageRoot: await findTestPackageRoot(import.meta.url), + jsFileFolder: "dist/src/lib", }); diff --git a/packages/http-server-csharp/src/type-helpers.ts b/packages/http-server-csharp/src/lib/type-helpers.ts similarity index 100% rename from packages/http-server-csharp/src/type-helpers.ts rename to packages/http-server-csharp/src/lib/type-helpers.ts diff --git a/packages/http-server-csharp/src/utils.ts b/packages/http-server-csharp/src/lib/utils.ts similarity index 100% rename from packages/http-server-csharp/src/utils.ts rename to packages/http-server-csharp/src/lib/utils.ts diff --git a/packages/http-server-csharp/test/generation.test.ts b/packages/http-server-csharp/test/generation.test.ts index fcdcdfa72a..2d2992dbeb 100644 --- a/packages/http-server-csharp/test/generation.test.ts +++ b/packages/http-server-csharp/test/generation.test.ts @@ -2,7 +2,7 @@ import { Program, Type, navigateProgram } from "@typespec/compiler"; import { BasicTestRunner } from "@typespec/compiler/testing"; import assert, { deepStrictEqual } from "assert"; import { beforeEach, it } from "vitest"; -import { getPropertySource, getSourceModel } from "../src/utils.js"; +import { getPropertySource, getSourceModel } from "../src/lib/utils.js"; import { createCSharpServiceEmitterTestRunner, getStandardService } from "./test-host.js"; function getGeneratedFile(runner: BasicTestRunner, fileName: string): [string, string] { @@ -695,8 +695,8 @@ it("Generates types and controllers in a service subnamespace", async () => { [ ["IMyServiceOperations.cs", ["interface IMyServiceOperations"]], [ - "MyServiceOperationsControllerBase.cs", - ["public abstract partial class MyServiceOperationsControllerBase: ControllerBase"], + "MyServiceOperationsController.cs", + ["public partial class MyServiceOperationsController: ControllerBase"], ], ["ToyCollectionWithNextLink.cs", ["public partial class ToyCollectionWithNextLink"]], ], @@ -732,9 +732,9 @@ it("Handles user-defined model templates", async () => { ["interface IMyServiceOperations", "Task FooAsync( );"], ], [ - "MyServiceOperationsControllerBase.cs", + "MyServiceOperationsController.cs", [ - "public abstract partial class MyServiceOperationsControllerBase: ControllerBase", + "public partial class MyServiceOperationsController: ControllerBase", "[ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(ResponsePageToy))]", "public virtual async Task Foo()", ], @@ -771,8 +771,8 @@ it("Handles void type in operations", async () => { [ ["IMyServiceOperations.cs", ["interface IMyServiceOperations"]], [ - "MyServiceOperationsControllerBase.cs", - ["public abstract partial class MyServiceOperationsControllerBase: ControllerBase"], + "MyServiceOperationsController.cs", + ["public partial class MyServiceOperationsController: ControllerBase"], ], ["Toy.cs", ["public partial class Toy"]], ], @@ -809,9 +809,9 @@ it("Handles empty body 2xx as void", async () => { ["interface IMyServiceOperations", "Task FooAsync( long id, long petId, string name)"], ], [ - "MyServiceOperationsControllerBase.cs", + "MyServiceOperationsController.cs", [ - "public abstract partial class MyServiceOperationsControllerBase: ControllerBase", + "public partial class MyServiceOperationsController: ControllerBase", "public virtual async Task Foo(Toy body)", ], ], @@ -890,7 +890,7 @@ it("generates appropriate types for literals in operation parameters", async () ], ], [ - "ContosoOperationsControllerBase.cs", + "ContosoOperationsController.cs", [ `public virtual async Task Foo([FromHeader(Name="int-prop")] int intProp = 8, [FromHeader(Name="float-prop")] double floatProp = 3.14, [FromHeader(Name="string-prop")] string stringProp = "A string of characters", [FromHeader(Name="string-temp-prop")] string stringTempProp = "A string of characters and then some", [FromHeader(Name="true-prop")] bool trueProp = true, [FromHeader(Name="false-prop")] bool falseProp = false)`, ], @@ -944,7 +944,7 @@ it("generates appropriate types for literal tuples in operation parameters", asy ], ], [ - "ContosoOperationsControllerBase.cs", + "ContosoOperationsController.cs", [ `public virtual async Task Foo([FromHeader(Name="int-prop")] int[] intProp, [FromHeader(Name="float-prop")] double[] floatProp, [FromHeader(Name="string-prop")] string stringProp = "string of characters", [FromHeader(Name="string-array-prop")] string[] stringArrayProp, [FromHeader(Name="string-temp-prop")] string[] stringTempProp, [FromHeader(Name="true-prop")] bool[] trueProp, [FromHeader(Name="false-prop")] bool[] falseProp)`, ], @@ -982,7 +982,7 @@ it("generates valid code for overridden parameters", async () => { "Foo.cs", ["public partial class Foo : FooBase", "public new int[] IntProp { get; } = [8, 10]"], ], - ["ContosoOperationsControllerBase.cs", [`public virtual async Task Foo()`]], + ["ContosoOperationsController.cs", [`public virtual async Task Foo()`]], ["IContosoOperations.cs", [`Task FooAsync( );`]], ], ); @@ -1025,7 +1025,7 @@ it("generates valid code for anonymous models", async () => { "public Model0 YetAnother { get; set; }", ], ], - ["ContosoOperationsControllerBase.cs", [`public virtual async Task Foo()`]], + ["ContosoOperationsController.cs", [`public virtual async Task Foo()`]], ["IContosoOperations.cs", [`Task FooAsync( );`]], ], ); @@ -1071,7 +1071,7 @@ it("handles nullable types correctly", async () => { "public Model0 YetAnother { get; set; }", ], ], - ["ContosoOperationsControllerBase.cs", [`public virtual async Task Foo()`]], + ["ContosoOperationsController.cs", [`public virtual async Task Foo()`]], ["IContosoOperations.cs", [`Task FooAsync( );`]], ], ); @@ -1094,7 +1094,7 @@ it("handles implicit request body models correctly", async () => { ], ], [ - "ContosoOperationsControllerBase.cs", + "ContosoOperationsController.cs", [ `public virtual async Task Foo(Model0 body)`, ".FooAsync(body?.IntProp, body?.ArrayProp)", @@ -1151,7 +1151,7 @@ it("handles multipartBody requests and shared routes", async () => { ], ], [ - "ContosoOperationsControllerBase.cs", + "ContosoOperationsController.cs", [ "using Microsoft.AspNetCore.WebUtilities;", "using Microsoft.AspNetCore.Http.Extensions;", @@ -1242,6 +1242,68 @@ model FileAttachmentMultipartRequest { @multipartBody body: FileAttachmentMultipartRequest, ): WithStandardErrors; `, - [["ContosoOperationsControllerBase.cs", ["return NoContent()"]]], + [["ContosoOperationsController.cs", ["return NoContent()"]]], + ); +}); + +it("Produces correct scaffolding", async () => { + await compileAndValidateMultiple( + await createCSharpServiceEmitterTestRunner({ "emit-mocks": "all" }), + ` + @error + model NotFoundErrorResponse { + @statusCode statusCode: 404; + code: "not-found"; + } +model ApiError { + /** A machine readable error code */ + code: string; + + /** A human readable message */ + message: string; +} + /** + * Something is wrong with you. + */ +model Standard4XXResponse extends ApiError { + @minValue(400) + @maxValue(499) + @statusCode + statusCode: int32; +} + +/** + * Something is wrong with me. + */ +model Standard5XXResponse extends ApiError { + @minValue(500) + @maxValue(599) + @statusCode + statusCode: int32; +} + +model FileAttachmentMultipartRequest { + contents: HttpPart; +} + + alias WithStandardErrors = T | Standard4XXResponse | Standard5XXResponse; + + @post + op createFileAttachment( + @header contentType: "multipart/form-data", + @path itemId: int32, + @multipartBody body: FileAttachmentMultipartRequest, + ): WithStandardErrors; + `, + [ + ["IInitializer.cs", ["public interface IInitializer"]], + ["Initializer.cs", ["public class Initializer : IInitializer"]], + ["ContosoOperations.cs", ["public class ContosoOperations : IContosoOperations"]], + [ + "MockRegistration.cs", + ["public static class MockRegistration", "()"], + ], + ["Program.cs", ["MockRegistration"]], + ], ); }); diff --git a/packages/http-server-csharp/test/test-host.ts b/packages/http-server-csharp/test/test-host.ts index 92ccc01168..9fee46b7ca 100644 --- a/packages/http-server-csharp/test/test-host.ts +++ b/packages/http-server-csharp/test/test-host.ts @@ -2,8 +2,8 @@ import { createTestHost, createTestWrapper } from "@typespec/compiler/testing"; import { HttpTestLibrary } from "@typespec/http/testing"; import { RestTestLibrary } from "@typespec/rest/testing"; import { VersioningTestLibrary } from "@typespec/versioning/testing"; -import { CSharpServiceEmitterOptions } from "../src/lib.js"; -import { CSharpServiceEmitterTestLibrary } from "../src/testing/index.js"; +import { CSharpServiceEmitterOptions } from "../src/lib/lib.js"; +import { CSharpServiceEmitterTestLibrary } from "../src/lib/testing/index.js"; export async function createCSharpServiceEmitterTestHost() { const result = await createTestHost({ diff --git a/packages/http-server-csharp/vitest.config.ts b/packages/http-server-csharp/vitest.config.ts index 95fd3052e4..64de8e0706 100644 --- a/packages/http-server-csharp/vitest.config.ts +++ b/packages/http-server-csharp/vitest.config.ts @@ -5,8 +5,8 @@ export default mergeConfig( defaultTypeSpecVitestConfig, defineConfig({ test: { - testTimeout: 10000, - watchExclude: ["dist/**"], + include: ["test/**/*.test.ts"], + exclude: ["src/cli/*.ts"], }, }), ); diff --git a/packages/http-server-javascript/package.json b/packages/http-server-javascript/package.json index a214cbeb73..ff689bcbc5 100644 --- a/packages/http-server-javascript/package.json +++ b/packages/http-server-javascript/package.json @@ -48,13 +48,13 @@ "prettier": "~3.4.2" }, "devDependencies": { - "@types/node": "~22.10.7", + "@types/node": "~22.10.10", "@typespec/compiler": "workspace:~", "@typespec/http": "workspace:~", - "@vitest/coverage-v8": "^3.0.3", + "@vitest/coverage-v8": "^3.0.4", "@vitest/ui": "^3.0.3", "tsx": "^4.19.2", "typescript": "~5.7.3", - "vitest": "^3.0.3" + "vitest": "^3.0.4" } } diff --git a/packages/http-specs/package.json b/packages/http-specs/package.json index 7169e4e0f6..1d520c0737 100644 --- a/packages/http-specs/package.json +++ b/packages/http-specs/package.json @@ -40,7 +40,7 @@ }, "devDependencies": { "@types/multer": "^1.4.10", - "@types/node": "~22.10.7", + "@types/node": "~22.10.10", "@typespec/openapi": "workspace:~", "@typespec/openapi3": "workspace:~", "concurrently": "^9.1.2", diff --git a/packages/http/package.json b/packages/http/package.json index b7674aab21..a295b7992c 100644 --- a/packages/http/package.json +++ b/packages/http/package.json @@ -38,6 +38,10 @@ "./experimental": { "types": "./dist/src/experimental/index.d.ts", "default": "./dist/src/experimental/index.js" + }, + "./experimental/typekit": { + "types": "./dist/src/experimental/typekit/index.d.ts", + "default": "./dist/src/experimental/typekit/index.js" } }, "engines": { @@ -72,16 +76,16 @@ } }, "devDependencies": { - "@types/node": "~22.10.7", + "@types/node": "~22.10.10", "@typespec/compiler": "workspace:~", "@typespec/library-linter": "workspace:~", "@typespec/streams": "workspace:~", "@typespec/tspd": "workspace:~", - "@vitest/coverage-v8": "^3.0.3", + "@vitest/coverage-v8": "^3.0.4", "@vitest/ui": "^3.0.3", "c8": "^10.1.3", "rimraf": "~6.0.1", "typescript": "~5.7.3", - "vitest": "^3.0.3" + "vitest": "^3.0.4" } } diff --git a/packages/http/src/experimental/typekit/index.ts b/packages/http/src/experimental/typekit/index.ts new file mode 100644 index 0000000000..e69ceea9f2 --- /dev/null +++ b/packages/http/src/experimental/typekit/index.ts @@ -0,0 +1 @@ +export * from "./kits/index.js"; diff --git a/packages/http/src/experimental/typekit/kits/http-operation.ts b/packages/http/src/experimental/typekit/kits/http-operation.ts new file mode 100644 index 0000000000..23e153ed71 --- /dev/null +++ b/packages/http/src/experimental/typekit/kits/http-operation.ts @@ -0,0 +1,133 @@ +import { ignoreDiagnostics, Operation, StringLiteral, Type, VoidType } from "@typespec/compiler"; +import { defineKit, Typekit } from "@typespec/compiler/experimental/typekit"; +import { getHttpOperation } from "../../../operations.js"; +import { + HttpOperation, + HttpOperationResponseContent, + HttpStatusCodesEntry, +} from "../../../types.js"; + +/** + * Utilities for working with HTTP operations. + * @experimental + */ +export interface HttpOperationKit { + /** + * Get the corresponding HTTP operation for the given TypeSpec operation. The same + * TypeSpec operation will always return the exact same HttpOperation object. + * + * @param op The TypeSpec operation to get the HTTP operation metadata for. + */ + get(op: Operation): HttpOperation; + /** + * Get the responses for the given operation. This function will return an array of responses grouped by status code and content type. + * @param op operation to extract the HttpResponse from + */ + getResponses(op: Operation): FlatHttpResponse[]; + /** + * Get the Http Return type for the given operation. This function will resolve the returnType based on the Http Operation. + * @param op operation to get the return type for + */ + getReturnType(op: Operation, options?: { includeErrors?: boolean }): Type; +} + +/** + * Structure of a flat HTTP response, which is grouped by status code and content type. + */ +export interface FlatHttpResponse { + /** + * Response status code. + */ + statusCode: HttpStatusCodesEntry; + /** + * Content type. Might be undefined if the response does not have a body. + */ + contentType?: string; + /** + * Response content. + */ + responseContent: HttpOperationResponseContent; +} + +interface TypekitExtension { + /** + * Utilities for working with HTTP operations. + * @experimental + */ + httpOperation: HttpOperationKit; +} + +declare module "@typespec/compiler/experimental/typekit" { + interface Typekit extends TypekitExtension {} +} + +defineKit({ + httpOperation: { + get(op) { + return ignoreDiagnostics(getHttpOperation(this.program, op)); + }, + getReturnType(operation, options) { + let responses = this.httpOperation.getResponses(operation); + + if (!options?.includeErrors) { + responses = responses.filter((r) => !this.httpResponse.isErrorResponse(r.responseContent)); + } + + const voidType = { kind: "Intrinsic", name: "void" } as VoidType; + let httpReturnType: Type = voidType; + + if (!responses.length) { + return voidType; + } + + if (responses.length > 1) { + const res = [...new Set(responses.map((r) => r.responseContent.body?.type))]; + httpReturnType = this.union.create({ + variants: res.map((t) => { + return this.unionVariant.create({ + type: getEffectiveType(this, t), + }); + }), + }); + } else { + httpReturnType = getEffectiveType(this, responses[0].responseContent.body?.type); + } + + return httpReturnType; + }, + getResponses(operation) { + const responsesMap: FlatHttpResponse[] = []; + const httpOperation = this.httpOperation.get(operation); + for (const response of httpOperation.responses) { + for (const responseContent of response.responses) { + const contentTypeProperty = responseContent.properties.find( + (property) => property.kind === "contentType", + ); + + let contentType: string | undefined; + + if (contentTypeProperty) { + contentType = (contentTypeProperty.property.type as StringLiteral).value; + } else if (responseContent.body) { + contentType = "application/json"; + } + + responsesMap.push({ statusCode: response.statusCodes, contentType, responseContent }); + } + } + + return responsesMap; + }, + }, +}); + +function getEffectiveType(typekit: Typekit, type?: Type): Type { + if (type === undefined) { + return { kind: "Intrinsic", name: "void" } as VoidType; + } + if (typekit.model.is(type)) { + return typekit.model.getEffectiveModel(type); + } + + return type; +} diff --git a/packages/http/src/experimental/typekit/kits/http-request.ts b/packages/http/src/experimental/typekit/kits/http-request.ts new file mode 100644 index 0000000000..df398586da --- /dev/null +++ b/packages/http/src/experimental/typekit/kits/http-request.ts @@ -0,0 +1,110 @@ +import { Model, ModelProperty } from "@typespec/compiler"; +import { defineKit } from "@typespec/compiler/experimental/typekit"; +import { HttpOperation } from "../../../types.js"; + +export type HttpRequestParameterKind = "query" | "header" | "path" | "contentType" | "body"; + +interface HttpRequestKit { + body: { + /** + * Checks the body is a property explicitly tagged with @body or @bodyRoot + * @param httpOperation the http operation to check + */ + isExplicit(httpOperation: HttpOperation): boolean; + }; + /** + * Gets a Model representing the body parameters of an http operation. + * @param httpOperation the http operation to get the body parameters from + */ + getBodyParameters(httpOperation: HttpOperation): Model | undefined; + /** + * Gets a Model representing the parameters of an http operation. + * @param httpOperation The Http operation to get the parameters from. + * @param kind A string to filters specific parameter kinds, or an array to combine multiple kinds. + */ + getParameters( + httpOperation: HttpOperation, + kind: HttpRequestParameterKind[] | HttpRequestParameterKind, + ): Model | undefined; +} + +interface TypekitExtension { + httpRequest: HttpRequestKit; +} + +declare module "@typespec/compiler/experimental/typekit" { + interface Typekit extends TypekitExtension {} +} + +defineKit({ + httpRequest: { + body: { + isExplicit(httpOperation: HttpOperation) { + return ( + httpOperation.parameters.properties.find( + (p) => p.kind === "body" || p.kind === "bodyRoot", + ) !== undefined + ); + }, + }, + getBodyParameters(httpOperation: HttpOperation): Model | undefined { + const body = httpOperation.parameters.body; + + if (!body) { + return undefined; + } + + const bodyProperty = body.property; + + if (!bodyProperty) { + if (body.type.kind === "Model") { + return body.type; + } + throw new Error("Body property not found"); + } + + const bodyPropertyName = bodyProperty.name ? bodyProperty.name : "body"; + + return this.model.create({ + properties: { [bodyPropertyName]: bodyProperty }, + }); + }, + getParameters( + httpOperation: HttpOperation, + kind: HttpRequestParameterKind | HttpRequestParameterKind[], + ): Model | undefined { + const kinds = new Set(Array.isArray(kind) ? kind : [kind]); + const parameterProperties: ModelProperty[] = []; + + for (const kind of kinds) { + if (kind === "body") { + const bodyParams = Array.from( + this.httpRequest.getBodyParameters(httpOperation)?.properties.values() ?? [], + ); + if (bodyParams) { + parameterProperties.push(...bodyParams); + } + } else { + const params = httpOperation.parameters.properties + .filter((p) => p.kind === kind) + .map((p) => p.property); + parameterProperties.push(...params); + } + } + + if (parameterProperties.length === 0) { + return undefined; + } + + const properties = parameterProperties.reduce( + (acc, prop) => { + acc[prop.name] = prop; + return acc; + }, + {} as Record, + ); + + return this.model.create({ properties }); + }, + }, +}); diff --git a/packages/http/src/experimental/typekit/kits/http-response.ts b/packages/http/src/experimental/typekit/kits/http-response.ts new file mode 100644 index 0000000000..db91ae9b29 --- /dev/null +++ b/packages/http/src/experimental/typekit/kits/http-response.ts @@ -0,0 +1,69 @@ +import { isErrorModel } from "@typespec/compiler"; +import { defineKit } from "@typespec/compiler/experimental/typekit"; +import { + HttpOperationResponseContent, + HttpStatusCodeRange, + HttpStatusCodesEntry, +} from "../../../types.js"; + +/** + * Utilities for working with HTTP responses. + * @experimental + */ +export interface HttpResponseKit { + /** + * Check if the response is an error response. + */ + isErrorResponse(response: HttpOperationResponseContent): boolean; + /** + * utilities to perform checks on status codes + */ + statusCode: { + /** + * Check if the status code is a single status code + * @param statusCode status code to check + */ + isSingle(statusCode: HttpStatusCodesEntry): statusCode is number; + /** + * Check if the status code is a range of status codes + * @param statusCode status code to check + */ + isRange(statusCode: HttpStatusCodesEntry): statusCode is HttpStatusCodeRange; + /** + * Check if the status code is a default status code + * @param statusCode status code to check + */ + isDefault(statusCode: HttpStatusCodesEntry): statusCode is "*"; + }; +} + +interface TypekitExtension { + /** + * Utilities for working with HTTP responses. + * @experimental + */ + httpResponse: HttpResponseKit; +} + +declare module "@typespec/compiler/experimental/typekit" { + interface Typekit extends TypekitExtension {} +} + +defineKit({ + httpResponse: { + isErrorResponse(response) { + return response.body ? isErrorModel(this.program, response.body.type) : false; + }, + statusCode: { + isSingle(statusCode) { + return typeof statusCode === "number"; + }, + isRange(statusCode) { + return typeof statusCode === "object" && "start" in statusCode && "end" in statusCode; + }, + isDefault(statusCode) { + return statusCode === "*"; + }, + }, + }, +}); diff --git a/packages/http/src/experimental/typekit/kits/index.ts b/packages/http/src/experimental/typekit/kits/index.ts new file mode 100644 index 0000000000..8f5054200d --- /dev/null +++ b/packages/http/src/experimental/typekit/kits/index.ts @@ -0,0 +1,4 @@ +export * from "./http-operation.js"; +export * from "./http-request.js"; +export * from "./http-response.js"; +export * from "./model-property.js"; diff --git a/packages/http/src/experimental/typekit/kits/model-property.ts b/packages/http/src/experimental/typekit/kits/model-property.ts new file mode 100644 index 0000000000..d6f706f4b6 --- /dev/null +++ b/packages/http/src/experimental/typekit/kits/model-property.ts @@ -0,0 +1,110 @@ +import { ModelProperty } from "@typespec/compiler"; +import { defineKit } from "@typespec/compiler/experimental/typekit"; +import { + getHeaderFieldOptions, + getPathParamOptions, + getQueryParamOptions, + isHeader, + isMultipartBodyProperty, + isPathParam, + isQueryParam, +} from "../../../decorators.js"; +import { HeaderFieldOptions, PathParameterOptions, QueryParameterOptions } from "../../../types.js"; + +/** + * Utilities for working with model properties in the context of Http. + * @experimental + */ +export interface HttpModelProperty { + /** + * Get the Http parameter options for a model property. + * @param prop a TypeSpec ModelProperty + */ + getHttpParamOptions( + prop: ModelProperty, + ): HeaderFieldOptions | PathParameterOptions | QueryParameterOptions | undefined; + /** + * Get the Http header options for a model property. + * @param prop a TypeSpec ModelProperty + */ + getHttpHeaderOptions(prop: ModelProperty): HeaderFieldOptions | undefined; + /** + * Get the Http path options for a model property. + * @param prop a TypeSpec ModelProperty + */ + getHttpPathOptions(prop: ModelProperty): PathParameterOptions | undefined; + /** + * Get the Http query options for a model property. + * @param prop a TypeSpec ModelProperty + */ + getHttpQueryOptions(prop: ModelProperty): QueryParameterOptions | undefined; + /** + * Check if a model property is an Http header. + * @param prop a TypeSpec ModelProperty + */ + isHttpHeader(prop: ModelProperty): boolean; + /** + * Check if a model property is an Http path parameter. + * @param prop a TypeSpec ModelProperty + */ + isHttpPathParam(prop: ModelProperty): boolean; + /** + * Check if a model property is an Http query parameter. + * @param prop a TypeSpec ModelProperty + */ + isHttpQueryParam(prop: ModelProperty): boolean; + /** + * Check if a model property is an Http multipart body. + * @param prop a TypeSpec ModelProperty + */ + isHttpMultipartBody(prop: ModelProperty): boolean; +} + +interface TypekitExtension { + modelProperty: HttpModelProperty; +} + +declare module "@typespec/compiler/experimental/typekit" { + interface ModelPropertyKit extends HttpModelProperty {} +} + +defineKit({ + modelProperty: { + getHttpParamOptions(prop: ModelProperty) { + if (isHeader(this.program, prop)) { + return getHeaderFieldOptions(this.program, prop); + } + + if (isPathParam(this.program, prop)) { + return getPathParamOptions(this.program, prop); + } + + if (isQueryParam(this.program, prop)) { + return getQueryParamOptions(this.program, prop); + } + + return undefined; + }, + getHttpHeaderOptions(prop: ModelProperty) { + return getHeaderFieldOptions(this.program, prop); + }, + getHttpPathOptions(prop) { + return getPathParamOptions(this.program, prop); + }, + getHttpQueryOptions(prop: ModelProperty) { + return getQueryParamOptions(this.program, prop); + }, + isHttpHeader(prop: ModelProperty) { + return isHeader(this.program, prop); + }, + isHttpPathParam(prop: ModelProperty) { + return isPathParam(this.program, prop); + }, + isHttpQueryParam(prop: ModelProperty) { + return isQueryParam(this.program, prop); + }, + isHttpMultipartBody(prop: ModelProperty) { + return isMultipartBodyProperty(this.program, prop); + }, + }, +}); diff --git a/packages/http/test/experimental/typekit/http-operation.test.ts b/packages/http/test/experimental/typekit/http-operation.test.ts new file mode 100644 index 0000000000..6b59534820 --- /dev/null +++ b/packages/http/test/experimental/typekit/http-operation.test.ts @@ -0,0 +1,96 @@ +import { Model, Operation } from "@typespec/compiler"; +import { $ } from "@typespec/compiler/experimental/typekit"; +import { BasicTestRunner } from "@typespec/compiler/testing"; +import { beforeEach, describe, expect, it } from "vitest"; +import { createHttpTestRunner } from "./../../test-host.js"; + +// Activate Http TypeKit augmentation +import "../../../src/experimental/typekit/index.js"; + +let runner: BasicTestRunner; + +beforeEach(async () => { + runner = await createHttpTestRunner(); +}); + +describe("httpOperation:getResponses", () => { + it("should get responses", async () => { + const { getFoo } = (await runner.compile(` + @test model Foo { + @visibility("create") + id: int32; + age: int32; + name: string; + } + + @error + @test model Error { + message: string; + code: int32 + } + + @route("/foo") + @get + @test op getFoo(): Foo | Error; + `)) as { getFoo: Operation; Foo: Model; Error: Model }; + + const responses = $.httpOperation.getResponses(getFoo); + expect(responses).toHaveLength(2); + expect(responses[0].statusCode).toBe(200); + expect(responses[0].contentType).toBe("application/json"); + expect(responses[1].statusCode).toBe("*"); + expect(responses[1].contentType).toBe("application/json"); + }); + + it("should get responses with multiple status codes", async () => { + const { getFoo } = (await runner.compile(` + @test model Foo { + @visibility("create") + id: int32; + age: int32; + name: string; + } + + @route("/foo") + @get + @test op getFoo(): Foo | void; + `)) as { getFoo: Operation; Foo: Model; Error: Model }; + + const responses = $.httpOperation.getResponses(getFoo); + expect(responses).toHaveLength(2); + expect(responses[0].statusCode).toBe(200); + expect(responses[0].contentType).toBe("application/json"); + expect(responses[1].statusCode).toBe(204); + expect(responses[1].contentType).toBe(undefined); + }); + + it("should get responses with multiple status codes and contentTypes", async () => { + const { getFoo } = (await runner.compile(` + @test model Foo { + @visibility("create") + id: int32; + age: int32; + name: string; + } + + @error + @test model Error { + message: string; + code: int32 + } + + @route("/foo") + @get + @test op getFoo(): Foo | {...Foo, @header contentType: "text/plain"} | Error; + `)) as { getFoo: Operation; Foo: Model; Error: Model }; + + const responses = $.httpOperation.getResponses(getFoo); + expect(responses).toHaveLength(3); + expect(responses[0].statusCode).toBe(200); + expect(responses[0].contentType).toBe("application/json"); + expect(responses[1].statusCode).toBe(200); + expect(responses[1].contentType).toBe("text/plain"); + expect(responses[2].statusCode).toBe("*"); + expect(responses[2].contentType).toBe("application/json"); + }); +}); diff --git a/packages/http/test/experimental/typekit/http-request.test.ts b/packages/http/test/experimental/typekit/http-request.test.ts new file mode 100644 index 0000000000..29f088b247 --- /dev/null +++ b/packages/http/test/experimental/typekit/http-request.test.ts @@ -0,0 +1,303 @@ +import { Model, Operation } from "@typespec/compiler"; +import { $ } from "@typespec/compiler/experimental/typekit"; +import { BasicTestRunner } from "@typespec/compiler/testing"; +import { beforeEach, describe, expect, it } from "vitest"; +import { createHttpTestRunner } from "./../../test-host.js"; + +// Activate Http TypeKit augmentation +import "../../../src/experimental/typekit/index.js"; + +let runner: BasicTestRunner; + +beforeEach(async () => { + runner = await createHttpTestRunner(); +}); + +describe("HttpRequest Body Parameters", () => { + it("should get the body parameters model when spread", async () => { + const { createFoo } = (await runner.compile(` + @test model Foo { + id: int32; + age: int32; + name: string; + } + + @route("/foo") + @post + @test op createFoo(...Foo): void; + `)) as { createFoo: Operation; Foo: Model }; + + const httpOperation = $.httpOperation.get(createFoo); + const body = $.httpRequest.getBodyParameters(httpOperation)!; + expect(body).toBeDefined(); + expect($.model.is(body)).toBe(true); + expect((body as Model).properties.size).toBe(3); + }); + + it("should get the body model params when body is defined explicitly as a property", async () => { + const { createFoo } = (await runner.compile(` + @route("/foo") + @post + @test op createFoo(@body foo: int32): void; + `)) as { createFoo: Operation; Foo: Model }; + + const httpOperation = $.httpOperation.get(createFoo); + const body = $.httpRequest.getBodyParameters(httpOperation)!; + expect(body).toBeDefined(); + expect($.model.is(body)).toBe(true); + expect(body.properties.size).toBe(1); + expect(body.properties.get("foo")!.name).toBe("foo"); + }); + + it("should get the body when spread and nested", async () => { + const { createFoo } = (await runner.compile(` + @test model Foo { + @path id: int32; + age: int32; + name: string; + options: { + @path token: string; + subProp: string; + } + } + + @route("/foo") + @post + @test op createFoo(...Foo): void; + `)) as { createFoo: Operation; Foo: Model }; + + const httpOperation = $.httpOperation.get(createFoo); + const body = $.httpRequest.getBodyParameters(httpOperation)!; + expect(body).toBeDefined(); + expect((body as Model).properties.size).toBe(3); + const properties = Array.from(body.properties.values()) + .map((p) => p.name) + .join(","); + expect(properties).toBe("age,name,options"); + + const optionsParam = (body as Model).properties.get("options")!.type as Model; + const optionsProps = Array.from(optionsParam.properties.values()) + .map((p) => p.name) + .join(","); + + // TODO: Why do we get the path property token here? + expect(optionsProps).toEqual("token,subProp"); + }); + + it("should get the body when named body model", async () => { + const { createFoo } = (await runner.compile(` + @test model Foo { + id: int32; + age: int32; + name: string; + } + + @route("/foo") + @post + @test op createFoo(@body foo: Foo): void; + `)) as { createFoo: Operation; Foo: Model }; + + const httpOperation = $.httpOperation.get(createFoo); + const body = $.httpRequest.getBodyParameters(httpOperation)!; + expect(body).toBeDefined(); + expect($.model.is(body)).toBe(true); + // Should have a single property called foo + expect(body.properties.size).toBe(1); + expect((body.properties.get("foo")?.type as Model).name).toBe("Foo"); + }); + + it("should get the named body body when combined", async () => { + const { createFoo } = (await runner.compile(` + @test model Foo { + @path id: int32; + age: int32; + name: string; + } + + @route("/foo") + @post + @test op createFoo(foo: Foo): void; + `)) as { createFoo: Operation; Foo: Model }; + + const httpOperation = $.httpOperation.get(createFoo); + const body = $.httpRequest.getBodyParameters(httpOperation)!; + expect(body).toBeDefined(); + expect($.model.is(body)).toBe(true); + expect((body as Model).properties.size).toBe(1); + expect(((body as Model).properties.get("foo")?.type as any).name).toBe("Foo"); + }); +}); + +describe("HttpRequest Get Parameters", () => { + it("should only have body parameters", async () => { + const { createFoo } = (await runner.compile(` + @test model Foo { + id: int32; + age: int32; + name: string; + } + + @route("/foo") + @post + @test op createFoo(...Foo): void; + `)) as { createFoo: Operation; Foo: Model }; + + const httpOperation = $.httpOperation.get(createFoo); + const body = $.httpRequest.getBodyParameters(httpOperation)!; + const headers = $.httpRequest.getParameters(httpOperation, "header"); + const path = $.httpRequest.getParameters(httpOperation, "path"); + const query = $.httpRequest.getParameters(httpOperation, "query"); + expect(body).toBeDefined(); + expect(headers).toBeUndefined(); + expect(path).toBeUndefined(); + expect(query).toBeUndefined(); + }); + + it("should be able to get parameter options", async () => { + const { createFoo } = (await runner.compile(` + @test model Foo { + @path(#{allowReserved: true}) id: string; + @header({format: "csv"}) requestId: string[]; + @query(#{explode: true}) data: string[]; + } + + @route("/foo") + @post + @test op createFoo(...Foo): void; + `)) as { createFoo: Operation; Foo: Model }; + + const httpOperation = $.httpOperation.get(createFoo); + const headers = $.httpRequest.getParameters(httpOperation, "header"); + const path = $.httpRequest.getParameters(httpOperation, "path"); + const query = $.httpRequest.getParameters(httpOperation, "query"); + + const requestIdProperty = headers!.properties.get("requestId"); + const idProperty = path!.properties.get("id"); + const dataProperty = query!.properties.get("data"); + + expect($.modelProperty.getHttpHeaderOptions(requestIdProperty!)).toStrictEqual({ + format: "csv", + name: "request-id", + type: "header", + }); + + expect($.modelProperty.getHttpPathOptions(idProperty!)).toStrictEqual({ + allowReserved: true, + explode: false, + name: "id", + style: "simple", + type: "path", + }); + + expect($.modelProperty.getHttpQueryOptions(dataProperty!)).toStrictEqual({ + explode: true, + format: "multi", + name: "data", + type: "query", + }); + }); + + it("should only have header parameters", async () => { + const { createFoo } = (await runner.compile(` + @test model Foo { + @path id: int32; + age: int32; + name: string; + } + + @route("/foo") + @post + @test op createFoo(...Foo): void; + `)) as { createFoo: Operation; Foo: Model }; + + const httpOperation = $.httpOperation.get(createFoo); + const body = $.httpRequest.getBodyParameters(httpOperation)! as Model; + const headers = $.httpRequest.getParameters(httpOperation, "header"); + const path = $.httpRequest.getParameters(httpOperation, "path")!; + const query = $.httpRequest.getParameters(httpOperation, "query"); + expect(body).toBeDefined(); + expect(body.properties.size).toBe(2); + expect(path).toBeDefined(); + expect(path.properties.size).toBe(1); + expect(path.properties.get("id")?.name).toBe("id"); + expect(headers).toBeUndefined(); + expect(query).toBeUndefined(); + }); + + it("should only have path parameters", async () => { + const { createFoo } = (await runner.compile(` + @test model Foo { + @header id: int32; + @header age: int32; + name: string; + } + + @route("/foo") + @post + @test op createFoo(...Foo): void; + `)) as { createFoo: Operation; Foo: Model }; + + const httpOperation = $.httpOperation.get(createFoo); + const body = $.httpRequest.getBodyParameters(httpOperation)! as Model; + const headers = $.httpRequest.getParameters(httpOperation, "header")!; + const path = $.httpRequest.getParameters(httpOperation, "path"); + const query = $.httpRequest.getParameters(httpOperation, "query"); + expect(body).toBeDefined(); + expect(body.properties.size).toBe(1); + expect(headers).toBeDefined(); + expect(headers.properties.size).toBe(2); + expect(headers.properties.get("id")?.name).toBe("id"); + expect(headers.properties.get("age")?.name).toBe("age"); + expect(path).toBeUndefined(); + expect(query).toBeUndefined(); + }); + + it("should only have query parameters", async () => { + const { createFoo } = (await runner.compile(` + @test model Foo { + @query id: int32; + @query age: int32; + name: string; + } + + @route("/foo") + @post + @test op createFoo(...Foo): void; + `)) as { createFoo: Operation; Foo: Model }; + + const httpOperation = $.httpOperation.get(createFoo); + const body = $.httpRequest.getBodyParameters(httpOperation)! as Model; + const headers = $.httpRequest.getParameters(httpOperation, "header"); + const path = $.httpRequest.getParameters(httpOperation, "path"); + const query = $.httpRequest.getParameters(httpOperation, "query")!; + expect(body).toBeDefined(); + expect(body.properties.size).toBe(1); + expect(query).toBeDefined(); + expect(query.properties.size).toBe(2); + expect(query.properties.get("id")?.name).toBe("id"); + expect(query.properties.get("age")?.name).toBe("age"); + expect(path).toBeUndefined(); + expect(headers).toBeUndefined(); + }); + + it("should have query and header parameters", async () => { + const { createFoo } = (await runner.compile(` + @test model Foo { + @query id: int32; + @header age: int32; + name: string; + } + + @route("/foo") + @post + @test op createFoo(...Foo): void; + `)) as { createFoo: Operation; Foo: Model }; + + const httpOperation = $.httpOperation.get(createFoo); + const headerAndQuery = $.httpRequest.getParameters(httpOperation, ["header", "query"]); + expect(headerAndQuery).toBeDefined(); + expect(headerAndQuery!.properties.size).toBe(2); + expect(headerAndQuery!.properties.get("id")?.name).toBe("id"); + expect(headerAndQuery!.properties.get("age")?.name).toBe("age"); + }); +}); diff --git a/packages/http/test/experimental/typekit/http-response.test.ts b/packages/http/test/experimental/typekit/http-response.test.ts new file mode 100644 index 0000000000..19590da612 --- /dev/null +++ b/packages/http/test/experimental/typekit/http-response.test.ts @@ -0,0 +1,90 @@ +import { Model, Operation } from "@typespec/compiler"; +import { $ } from "@typespec/compiler/experimental/typekit"; +import { BasicTestRunner } from "@typespec/compiler/testing"; +import { beforeEach, expect, it } from "vitest"; +import { createHttpTestRunner } from "./../../test-host.js"; + +// Activate Http TypeKit augmentation +import "../../../src/experimental/typekit/index.js"; + +let runner: BasicTestRunner; + +beforeEach(async () => { + runner = await createHttpTestRunner(); +}); + +it("should return true for an error response", async () => { + const { getFoo } = (await runner.compile(` + @test model Foo { + id: int32; + age: int32; + name: string; + } + + @error + @test model Error { + message: string; + code: int32 + } + + @route("/foo") + @get + @test op getFoo(): Foo | Error; + `)) as { getFoo: Operation; Foo: Model; Error: Model }; + + const responses = $.httpOperation.getResponses(getFoo); + expect(responses).toHaveLength(2); + expect($.httpResponse.isErrorResponse(responses[0].responseContent)).toBe(false); + expect($.httpResponse.isErrorResponse(responses[1].responseContent)).toBe(true); +}); + +it("should identify a single and default status code", async () => { + const { getFoo } = (await runner.compile(` + @test model Foo { + id: int32; + age: int32; + name: string; + } + + @error + @test model Error { + message: string; + code: int32 + } + + @route("/foo") + @get + @test op getFoo(): Foo | Error; + `)) as { getFoo: Operation; Foo: Model; Error: Model }; + + const response = $.httpOperation.getResponses(getFoo)[0]; + const error = $.httpOperation.getResponses(getFoo)[1]; + expect($.httpResponse.statusCode.isSingle(response.statusCode)).toBe(true); + expect($.httpResponse.statusCode.isDefault(error.statusCode)).toBe(true); +}); + +it("should identify a range status code", async () => { + const { getFoo } = (await runner.compile(` + @test model Foo { + id: int32; + age: int32; + name: string; + @minValue(455) @maxValue(495) @statusCode @statusCode _: int32 + } + + @error + @test model Error { + message: string; + code: int32 + } + + @route("/foo") + @get + @test op getFoo(): Foo | Error; + `)) as { getFoo: Operation; Foo: Model; Error: Model }; + + const response = $.httpOperation.getResponses(getFoo)[0]; + const error = $.httpOperation.getResponses(getFoo)[1]; + expect($.httpResponse.statusCode.isRange(response.statusCode)).toBe(true); + expect($.httpResponse.statusCode.isDefault(error.statusCode)).toBe(true); +}); diff --git a/packages/internal-build-utils/package.json b/packages/internal-build-utils/package.json index 5e6b39d63c..ef37e26051 100644 --- a/packages/internal-build-utils/package.json +++ b/packages/internal-build-utils/package.json @@ -47,15 +47,15 @@ "yargs": "~17.7.2" }, "devDependencies": { - "@types/node": "~22.10.7", + "@types/node": "~22.10.10", "@types/semver": "^7.5.8", "@types/yargs": "~17.0.33", - "@vitest/coverage-v8": "^3.0.3", + "@vitest/coverage-v8": "^3.0.4", "@vitest/ui": "^3.0.3", "c8": "^10.1.3", "chokidar": "~4.0.3", "rimraf": "~6.0.1", "typescript": "~5.7.3", - "vitest": "^3.0.3" + "vitest": "^3.0.4" } } diff --git a/packages/json-schema/package.json b/packages/json-schema/package.json index 777fd8c6a7..39f30b5c87 100644 --- a/packages/json-schema/package.json +++ b/packages/json-schema/package.json @@ -57,19 +57,19 @@ "@typespec/compiler": "workspace:~" }, "devDependencies": { - "@types/node": "~22.10.7", + "@types/node": "~22.10.10", "@typespec/compiler": "workspace:~", "@typespec/internal-build-utils": "workspace:~", "@typespec/library-linter": "workspace:~", "@typespec/tspd": "workspace:~", - "@vitest/coverage-v8": "^3.0.3", + "@vitest/coverage-v8": "^3.0.4", "@vitest/ui": "^3.0.3", "ajv": "~8.17.1", "ajv-formats": "~3.0.1", "c8": "^10.1.3", "rimraf": "~6.0.1", "typescript": "~5.7.3", - "vitest": "^3.0.3" + "vitest": "^3.0.4" }, "dependencies": { "yaml": "~2.7.0" diff --git a/packages/json-schema/src/decorators.ts b/packages/json-schema/src/decorators.ts index df2c93bf65..72c97d654e 100644 --- a/packages/json-schema/src/decorators.ts +++ b/packages/json-schema/src/decorators.ts @@ -12,7 +12,7 @@ import { typespecTypeToJson, type Union, } from "@typespec/compiler"; -import { unsafe_useStateMap, unsafe_useStateSet } from "@typespec/compiler/experimental"; +import { useStateMap, useStateSet } from "@typespec/compiler/utils"; import type { ValidatesRawJsonDecorator } from "../generated-defs/TypeSpec.JsonSchema.Private.js"; import type { ContainsDecorator, @@ -43,7 +43,7 @@ export const [ /** Check if the given type is annotated with `@jsonSchema` */ getJsonSchema, markJsonSchema, -] = unsafe_useStateSet(JsonSchemaStateKeys.JsonSchema); +] = useStateSet(JsonSchemaStateKeys.JsonSchema); /** {@inheritdoc JsonSchemaDecorator} */ export const $jsonSchema: JsonSchemaDecorator = ( context: DecoratorContext, @@ -135,7 +135,7 @@ export const [ /** Check if given type is annotated with `@oneOf` decorator */ isOneOf, markOneOf, -] = unsafe_useStateSet(JsonSchemaStateKeys["JsonSchema.oneOf"]); +] = useStateSet(JsonSchemaStateKeys["JsonSchema.oneOf"]); /** {@inheritdoc OneOfDecorator} */ export const $oneOf: OneOfDecorator = (context: DecoratorContext, target: Type) => { @@ -170,7 +170,7 @@ export const [ /** Check if the given array is annotated with `@uniqueItems` decorator */ getUniqueItems, setUniqueItems, -] = unsafe_useStateMap(JsonSchemaStateKeys["JsonSchema.uniqueItems"]); +] = useStateMap(JsonSchemaStateKeys["JsonSchema.uniqueItems"]); /** {@inheritdoc UniqueItemsDecorator} */ export const $uniqueItems: UniqueItemsDecorator = (context: DecoratorContext, target: Type) => setUniqueItems(context.program, target, true); @@ -226,7 +226,7 @@ export const [ /** Get prefix items set with `@prefixItems` decorator */ getPrefixItems, setPrefixItems, -] = unsafe_useStateMap(JsonSchemaStateKeys["JsonSchema.prefixItems"]); +] = useStateMap(JsonSchemaStateKeys["JsonSchema.prefixItems"]); /** {@inheritdoc PrefixItemsDecorator} */ export const $prefixItems: PrefixItemsDecorator = ( @@ -247,10 +247,9 @@ export interface ExtensionRecord { value: Type | unknown; } -const [getExtensionsInternal, _, getExtensionsStateMap] = unsafe_useStateMap< - Type, - ExtensionRecord[] ->(JsonSchemaStateKeys["JsonSchema.extension"]); +const [getExtensionsInternal, _, getExtensionsStateMap] = useStateMap( + JsonSchemaStateKeys["JsonSchema.extension"], +); /** {@inheritdoc ExtensionDecorator} */ export const $extension: ExtensionDecorator = ( context: DecoratorContext, diff --git a/packages/json-schema/src/utils.ts b/packages/json-schema/src/utils.ts index 463957f4c6..192651ad91 100644 --- a/packages/json-schema/src/utils.ts +++ b/packages/json-schema/src/utils.ts @@ -1,11 +1,11 @@ import type { DecoratorFunction, Type } from "@typespec/compiler"; -import { unsafe_useStateMap } from "@typespec/compiler/experimental"; +import { useStateMap } from "@typespec/compiler/utils"; export function createDataDecorator< T extends DecoratorFunction, Target extends Type = Parameters[1], >(key: symbol, validate?: (...args: Parameters) => boolean) { - const [getData, setData] = unsafe_useStateMap[2]>(key); + const [getData, setData] = useStateMap[2]>(key); const decorator = (...args: Parameters) => { if (validate && !validate(...args)) { return; diff --git a/packages/library-linter/package.json b/packages/library-linter/package.json index 789fc84a9e..3d3e9ad675 100644 --- a/packages/library-linter/package.json +++ b/packages/library-linter/package.json @@ -52,13 +52,13 @@ "@typespec/compiler": "workspace:~" }, "devDependencies": { - "@types/node": "~22.10.7", + "@types/node": "~22.10.10", "@typespec/compiler": "workspace:~", - "@vitest/coverage-v8": "^3.0.3", + "@vitest/coverage-v8": "^3.0.4", "@vitest/ui": "^3.0.3", "c8": "^10.1.3", "rimraf": "~6.0.1", "typescript": "~5.7.3", - "vitest": "^3.0.3" + "vitest": "^3.0.4" } } diff --git a/packages/monarch/package.json b/packages/monarch/package.json index 85519fa749..b9d20b42d3 100644 --- a/packages/monarch/package.json +++ b/packages/monarch/package.json @@ -42,14 +42,14 @@ "!dist/test/**" ], "devDependencies": { - "@types/node": "~22.10.7", - "@vitest/coverage-v8": "^3.0.3", + "@types/node": "~22.10.10", + "@vitest/coverage-v8": "^3.0.4", "@vitest/ui": "^3.0.3", "c8": "^10.1.3", "happy-dom": "^16.7.1", "rimraf": "~6.0.1", "typescript": "~5.7.3", - "vitest": "^3.0.3" + "vitest": "^3.0.4" }, "dependencies": { "monaco-editor-core": "^0.52.2" diff --git a/packages/openapi/package.json b/packages/openapi/package.json index 65247b2acc..f714a43d15 100644 --- a/packages/openapi/package.json +++ b/packages/openapi/package.json @@ -58,17 +58,17 @@ "@typespec/http": "workspace:~" }, "devDependencies": { - "@types/node": "~22.10.7", + "@types/node": "~22.10.10", "@typespec/compiler": "workspace:~", "@typespec/http": "workspace:~", "@typespec/library-linter": "workspace:~", "@typespec/rest": "workspace:~", "@typespec/tspd": "workspace:~", - "@vitest/coverage-v8": "^3.0.3", + "@vitest/coverage-v8": "^3.0.4", "@vitest/ui": "^3.0.3", "c8": "^10.1.3", "rimraf": "~6.0.1", "typescript": "~5.7.3", - "vitest": "^3.0.3" + "vitest": "^3.0.4" } } diff --git a/packages/openapi/src/decorators.ts b/packages/openapi/src/decorators.ts index f7adbf1caf..f979c9500a 100644 --- a/packages/openapi/src/decorators.ts +++ b/packages/openapi/src/decorators.ts @@ -12,7 +12,7 @@ import { typespecTypeToJson, TypeSpecValue, } from "@typespec/compiler"; -import { unsafe_useStateMap } from "@typespec/compiler/experimental"; +import { useStateMap } from "@typespec/compiler/utils"; import { setStatusCode } from "@typespec/http"; import { DefaultResponseDecorator, @@ -243,10 +243,9 @@ function omitUndefined>(data: T): T { } /** Get TagsMetadata set with `@tagMetadata` decorator */ -const [getTagsMetadata, setTagsMetadata] = unsafe_useStateMap< - Type, - { [name: string]: TagMetadata } ->(OpenAPIKeys.tagsMetadata); +const [getTagsMetadata, setTagsMetadata] = useStateMap( + OpenAPIKeys.tagsMetadata, +); /** * Decorator to add metadata to a tag associated with a namespace. diff --git a/packages/openapi3/package.json b/packages/openapi3/package.json index ee09400fdf..03e67f9b4b 100644 --- a/packages/openapi3/package.json +++ b/packages/openapi3/package.json @@ -78,7 +78,7 @@ } }, "devDependencies": { - "@types/node": "~22.10.7", + "@types/node": "~22.10.10", "@types/yargs": "~17.0.33", "@typespec/compiler": "workspace:~", "@typespec/http": "workspace:~", @@ -89,12 +89,12 @@ "@typespec/tspd": "workspace:~", "@typespec/versioning": "workspace:~", "@typespec/xml": "workspace:~", - "@vitest/coverage-v8": "^3.0.3", + "@vitest/coverage-v8": "^3.0.4", "@vitest/ui": "^3.0.3", "c8": "^10.1.3", "cross-env": "~7.0.3", "rimraf": "~6.0.1", "typescript": "~5.7.3", - "vitest": "^3.0.3" + "vitest": "^3.0.4" } } diff --git a/packages/playground-website/package.json b/packages/playground-website/package.json index 3ef1307cfe..3898ebea8a 100644 --- a/packages/playground-website/package.json +++ b/packages/playground-website/package.json @@ -77,12 +77,12 @@ "@babel/core": "^7.26.0", "@playwright/test": "^1.49.1", "@types/debounce": "~1.2.4", - "@types/node": "~22.10.7", + "@types/node": "~22.10.10", "@types/react": "~18.3.11", "@types/react-dom": "~18.3.0", "@types/swagger-ui": "~3.52.4", "@vitejs/plugin-react": "~4.3.4", - "@vitest/coverage-v8": "^3.0.3", + "@vitest/coverage-v8": "^3.0.4", "@vitest/ui": "^3.0.3", "c8": "^10.1.3", "cross-env": "~7.0.3", @@ -91,6 +91,6 @@ "typescript": "~5.7.3", "vite": "^6.0.11", "vite-plugin-dts": "4.5.0", - "vitest": "^3.0.3" + "vitest": "^3.0.4" } } diff --git a/packages/playground/package.json b/packages/playground/package.json index 735dc5290b..986cb0fbde 100644 --- a/packages/playground/package.json +++ b/packages/playground/package.json @@ -104,7 +104,7 @@ "@storybook/test": "^8.5.0", "@storybook/types": "^8.5.0", "@types/debounce": "~1.2.4", - "@types/node": "~22.10.7", + "@types/node": "~22.10.10", "@types/react": "~18.3.11", "@types/react-dom": "~18.3.0", "@types/swagger-ui-dist": "~3.30.5", diff --git a/packages/prettier-plugin-typespec/package.json b/packages/prettier-plugin-typespec/package.json index f8fffbac56..3fe71f909e 100644 --- a/packages/prettier-plugin-typespec/package.json +++ b/packages/prettier-plugin-typespec/package.json @@ -22,7 +22,7 @@ "@typespec/compiler": "workspace:~", "@typespec/internal-build-utils": "workspace:~", "rollup": "~4.31.0", - "vitest": "^3.0.3" + "vitest": "^3.0.4" }, "files": [ "dist/**/*", diff --git a/packages/protobuf/package.json b/packages/protobuf/package.json index 20062c73ae..5b2cd25fa9 100644 --- a/packages/protobuf/package.json +++ b/packages/protobuf/package.json @@ -45,15 +45,15 @@ }, "devDependencies": { "@types/micromatch": "^4.0.9", - "@types/node": "~22.10.7", + "@types/node": "~22.10.10", "@typespec/compiler": "workspace:~", "@typespec/tspd": "workspace:~", - "@vitest/coverage-v8": "^3.0.3", + "@vitest/coverage-v8": "^3.0.4", "@vitest/ui": "^3.0.3", "c8": "^10.1.3", "micromatch": "^4.0.8", "rimraf": "~6.0.1", "typescript": "~5.7.3", - "vitest": "^3.0.3" + "vitest": "^3.0.4" } } diff --git a/packages/react-components/package.json b/packages/react-components/package.json index e8cb0679ed..8c45dac505 100644 --- a/packages/react-components/package.json +++ b/packages/react-components/package.json @@ -54,11 +54,11 @@ "@testing-library/dom": "^10.4.0", "@testing-library/jest-dom": "^6.6.3", "@testing-library/react": "^16.2.0", - "@types/node": "~22.10.7", + "@types/node": "~22.10.10", "@types/react": "~18.3.11", "@types/react-dom": "~18.3.0", "@vitejs/plugin-react": "~4.3.4", - "@vitest/coverage-v8": "^3.0.3", + "@vitest/coverage-v8": "^3.0.4", "@vitest/ui": "^3.0.3", "c8": "^10.1.3", "rimraf": "~6.0.1", @@ -66,6 +66,6 @@ "vite": "^6.0.11", "vite-plugin-checker": "^0.8.0", "vite-plugin-dts": "4.5.0", - "vitest": "^3.0.3" + "vitest": "^3.0.4" } } diff --git a/packages/rest/package.json b/packages/rest/package.json index c019dfca3d..719dd2b285 100644 --- a/packages/rest/package.json +++ b/packages/rest/package.json @@ -57,16 +57,16 @@ "@typespec/http": "workspace:~" }, "devDependencies": { - "@types/node": "~22.10.7", + "@types/node": "~22.10.10", "@typespec/compiler": "workspace:~", "@typespec/http": "workspace:~", "@typespec/library-linter": "workspace:~", "@typespec/tspd": "workspace:~", - "@vitest/coverage-v8": "^3.0.3", + "@vitest/coverage-v8": "^3.0.4", "@vitest/ui": "^3.0.3", "c8": "^10.1.3", "rimraf": "~6.0.1", "typescript": "~5.7.3", - "vitest": "^3.0.3" + "vitest": "^3.0.4" } } diff --git a/packages/samples/package.json b/packages/samples/package.json index 3be215fa72..87c276a9f4 100644 --- a/packages/samples/package.json +++ b/packages/samples/package.json @@ -49,6 +49,7 @@ "@typespec/html-program-viewer": "workspace:~", "@typespec/http": "workspace:~", "@typespec/http-server-javascript": "workspace:~", + "@typespec/http-server-csharp": "workspace:~", "@typespec/json-schema": "workspace:~", "@typespec/openapi": "workspace:~", "@typespec/openapi3": "workspace:~", @@ -59,14 +60,14 @@ "@typespec/versioning": "workspace:~" }, "devDependencies": { - "@types/node": "~22.10.7", + "@types/node": "~22.10.10", "@typespec/internal-build-utils": "workspace:~", - "@vitest/coverage-v8": "^3.0.3", + "@vitest/coverage-v8": "^3.0.4", "@vitest/ui": "^3.0.3", "autorest": "~3.7.1", "cross-env": "~7.0.3", "rimraf": "~6.0.1", "typescript": "~5.7.3", - "vitest": "^3.0.3" + "vitest": "^3.0.4" } } diff --git a/packages/samples/specs/todoApp/main.tsp b/packages/samples/specs/todoApp/main.tsp new file mode 100644 index 0000000000..eb8321e8d4 --- /dev/null +++ b/packages/samples/specs/todoApp/main.tsp @@ -0,0 +1,296 @@ +import "@typespec/http"; +import "@typespec/rest"; +import "@typespec/openapi3"; +import "@typespec/openapi"; +import "@typespec/json-schema"; +using Http; +using JsonSchema; + +@service({ + title: "Todo App", +}) +@useAuth(BearerAuth | ApiKeyAuth) +@jsonSchema +namespace Todo; + +@jsonSchema +model User { + /** An autogenerated unique id for the user */ + @key + @visibility("read") + id: safeint; + + /** The user's username */ + @minLength(2) + @maxLength(50) + username: string; + + /** The user's email address */ + // @format("email") - crashes emitters for now + email: string; + + /** + * The user's password, provided when creating a user + * but is otherwise not visible (and hashed by the backend) + */ + @visibility("create") + password: string; + + /** Whether the user is validated. Never visible to the API. */ + @visibility("none") validated: boolean; +} + +@jsonSchema +model TodoItem { + /** The item's unique id */ + @visibility("read") @key id: safeint; + + /** The item's title */ + @maxLength(255) + title: string; + + /** User that created the todo */ + @visibility("read") createdBy: User.id; + + /** User that the todo is assigned to */ + assignedTo?: User.id; + + /** A longer description of the todo item in markdown format */ + description?: string; + + /** The status of the todo item */ + status: "NotStarted" | "InProgress" | "Completed"; + + /** When the todo item was created. */ + @visibility("read") createdAt: utcDateTime; + + /** When the todo item was last updated */ + @visibility("read") updatedAt: utcDateTime; + + /** When the todo item was marked as completed */ + @visibility("read") completedAt?: utcDateTime; + + // Want the read form to be normalized to TodoLabelRecord[], but can't + // https://github.com/microsoft/typespec/issues/2926 + labels?: TodoLabels; + + // hack to get a different schema for create + // (fastify glue doesn't support readonly) + @visibility("create") _dummy?: string; +} + +model ToDoItemMultipartRequest { + item: HttpPart; + attachments?: HttpPart[]; +} + +model FileAttachmentMultipartRequest { + contents: HttpPart; +} + +@jsonSchema +union TodoLabels { + string, + string[], + TodoLabelRecord, + TodoLabelRecord[], +} + +@jsonSchema +model TodoLabelRecord { + name: string; + + @pattern("^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$") + color?: string; +} + +@jsonSchema +model TodoAttachment { + /** The file name of the attachment */ + @maxLength(255) + filename: string; + + /** The media type of the attachment */ + mediaType: string; + + /** The contents of the file */ + contents: bytes; +} + +@jsonSchema +@error +model ApiError { + /** A machine readable error code */ + code: string; + + /** A human readable message */ + // https://github.com/microsoft/OpenAPI/blob/main/extensions/x-ms-primary-error-message.md + @OpenAPI.extension("x-ms-primary-error-message", true) + message: string; +} + +/** + * Something is wrong with you. + */ +model Standard4XXResponse extends ApiError { + @minValue(400) + @maxValue(499) + @statusCode + statusCode: int32; +} + +/** + * Something is wrong with me. + */ +model Standard5XXResponse extends ApiError { + @minValue(500) + @maxValue(599) + @statusCode + statusCode: int32; +} + +alias WithStandardErrors = T | Standard4XXResponse | Standard5XXResponse; + +@useAuth(NoAuth) +namespace Users { + // would prefer to extend + // https://github.com/microsoft/typespec/issues/2922 + + model UserCreatedResponse { + ...User; + ...OkResponse; + + /** The token to use to construct the validate email address url */ + token: string; + } + + /** The user already exists */ + model UserExistsResponse extends ApiError { + ...ConflictResponse; + code: "user-exists"; + } + + /** The user is invalid (e.g. forgot to enter email address) */ + model InvalidUserResponse extends ApiError { + @statusCode statusCode: 422; + code: "invalid-user"; + } + + @route("/users") + @post + op create( + @body user: User, + ): WithStandardErrors; +} + +@route("items") +namespace TodoItems { + model PaginationControls { + /** The limit to the number of items */ + @query limit?: int32 = 50; + + /** The offset to start paginating at */ + @query offset?: int32 = 0; + } + + model TodoPage { + /** The items in the page */ + @pageItems items: TodoItem[]; + + /** The number of items returned in this page */ + pageSize: int32; + + /** The total number of items */ + totalSize: int32; + + ...PaginationControls; + + /** A link to the previous page, if it exists */ + @prevLink + prevLink?: url; + + /** A link to the next page, if it exists */ + @nextLink + nextLink?: url; + } + + // deeply annoying that I have to copy/paste this... + model TodoItemPatch { + /** The item's title */ + title?: TodoItem.title; + + /** User that the todo is assigned to */ + assignedTo?: TodoItem.assignedTo | null; + + /** A longer description of the todo item in markdown format */ + description?: TodoItem.description | null; + + /** The status of the todo item */ + status?: "NotStarted" | "InProgress" | "Completed"; + } + + model InvalidTodoItem extends ApiError { + @statusCode statusCode: 422; + } + + @error + model NotFoundErrorResponse { + @statusCode statusCode: 404; + code: "not-found"; + } + + //@friendlyName("{name}List", T) + model Page { + @pageItems items: T[]; + } + + @list op list(...PaginationControls): WithStandardErrors; + + @sharedRoute + @post + op createJson( + @header contentType: "application/json", + item: TodoItem, + attachments?: TodoAttachment[], + ): WithStandardErrors; + + @sharedRoute + @post + op createForm( + @header contentType: "multipart/form-data", + @multipartBody body: ToDoItemMultipartRequest, + ): WithStandardErrors; + + @get op get(@path id: TodoItem.id): TodoItem | NotFoundErrorResponse; + @patch op update( + @header contentType: "application/merge-patch+json", + @path id: TodoItem.id, + @body patch: TodoItemPatch, + ): TodoItem; + @delete op delete( + @path id: TodoItem.id, + ): WithStandardErrors; + + @route("{itemId}/attachments") + namespace Attachments { + @list op list( + @path itemId: TodoItem.id, + ): WithStandardErrors | NotFoundErrorResponse>; + + @sharedRoute + @post + op createJsonAttachment( + @header contentType: "application/json", + @path itemId: TodoItem.id, + @body contents: TodoAttachment, + ): WithStandardErrors; + + @sharedRoute + @post + op createFileAttachment( + @header contentType: "multipart/form-data", + @path itemId: TodoItem.id, + @multipartBody body: FileAttachmentMultipartRequest, + ): WithStandardErrors; + } +} diff --git a/packages/samples/test/output/todoApp/@typespec/openapi3/openapi.yaml b/packages/samples/test/output/todoApp/@typespec/openapi3/openapi.yaml new file mode 100644 index 0000000000..b21861450d --- /dev/null +++ b/packages/samples/test/output/todoApp/@typespec/openapi3/openapi.yaml @@ -0,0 +1,632 @@ +openapi: 3.0.0 +info: + title: Todo App + version: 0.0.0 +tags: [] +paths: + /items: + get: + operationId: TodoItems_list + parameters: + - $ref: '#/components/parameters/TodoItems.PaginationControls.limit' + - $ref: '#/components/parameters/TodoItems.PaginationControls.offset' + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + $ref: '#/components/schemas/TodoItems.TodoPage' + 4XX: + description: Something is wrong with you. + content: + application/json: + schema: + $ref: '#/components/schemas/Standard4XXResponse' + 5XX: + description: Something is wrong with me. + content: + application/json: + schema: + $ref: '#/components/schemas/Standard5XXResponse' + post: + operationId: TodoItems_createJson_TodoItems_createForm + parameters: [] + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + $ref: '#/components/schemas/TodoItem' + '422': + description: Client error + content: + application/json: + schema: + $ref: '#/components/schemas/TodoItems.InvalidTodoItem' + 4XX: + description: Something is wrong with you. + content: + application/json: + schema: + $ref: '#/components/schemas/Standard4XXResponse' + 5XX: + description: Something is wrong with me. + content: + application/json: + schema: + $ref: '#/components/schemas/Standard5XXResponse' + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + item: + $ref: '#/components/schemas/TodoItemCreate' + attachments: + type: array + items: + $ref: '#/components/schemas/TodoAttachment' + required: + - item + multipart/form-data: + schema: + $ref: '#/components/schemas/ToDoItemMultipartRequest' + encoding: + item: + contentType: application/json + attachments: + contentType: '*/*' + /items/{id}: + get: + operationId: TodoItems_get + parameters: + - name: id + in: path + required: true + schema: + type: integer + format: int64 + readOnly: true + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + $ref: '#/components/schemas/TodoItem' + '404': + description: The server cannot find the requested resource. + content: + application/json: + schema: + $ref: '#/components/schemas/TodoItems.NotFoundErrorResponse' + patch: + operationId: TodoItems_update + parameters: + - name: id + in: path + required: true + schema: + type: integer + format: int64 + readOnly: true + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + $ref: '#/components/schemas/TodoItem' + requestBody: + required: true + content: + application/merge-patch+json: + schema: + $ref: '#/components/schemas/TodoItems.TodoItemPatch' + delete: + operationId: TodoItems_delete + parameters: + - name: id + in: path + required: true + schema: + type: integer + format: int64 + readOnly: true + responses: + '204': + description: There is no content to send for this request, but the headers may be useful. + '404': + description: The server cannot find the requested resource. + content: + application/json: + schema: + $ref: '#/components/schemas/TodoItems.NotFoundErrorResponse' + 4XX: + description: Something is wrong with you. + content: + application/json: + schema: + $ref: '#/components/schemas/Standard4XXResponse' + 5XX: + description: Something is wrong with me. + content: + application/json: + schema: + $ref: '#/components/schemas/Standard5XXResponse' + /items/{itemId}/attachments: + get: + operationId: Attachments_list + parameters: + - name: itemId + in: path + required: true + schema: + type: integer + format: int64 + readOnly: true + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + type: object + required: + - items + properties: + items: + type: array + items: + $ref: '#/components/schemas/TodoAttachment' + '404': + description: The server cannot find the requested resource. + content: + application/json: + schema: + $ref: '#/components/schemas/TodoItems.NotFoundErrorResponse' + 4XX: + description: Something is wrong with you. + content: + application/json: + schema: + $ref: '#/components/schemas/Standard4XXResponse' + 5XX: + description: Something is wrong with me. + content: + application/json: + schema: + $ref: '#/components/schemas/Standard5XXResponse' + post: + operationId: Attachments_createJsonAttachment_Attachments_createFileAttachment + parameters: + - name: itemId + in: path + required: true + schema: + type: integer + format: int64 + readOnly: true + responses: + '204': + description: There is no content to send for this request, but the headers may be useful. + '404': + description: The server cannot find the requested resource. + content: + application/json: + schema: + $ref: '#/components/schemas/TodoItems.NotFoundErrorResponse' + 4XX: + description: Something is wrong with you. + content: + application/json: + schema: + $ref: '#/components/schemas/Standard4XXResponse' + 5XX: + description: Something is wrong with me. + content: + application/json: + schema: + $ref: '#/components/schemas/Standard5XXResponse' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/TodoAttachment' + multipart/form-data: + schema: + $ref: '#/components/schemas/FileAttachmentMultipartRequest' + encoding: + contents: + contentType: '*/*' + /users: + post: + operationId: Users_create + parameters: [] + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + $ref: '#/components/schemas/Users.UserCreatedResponse' + '409': + description: The user already exists + content: + application/json: + schema: + $ref: '#/components/schemas/Users.UserExistsResponse' + '422': + description: The user is invalid (e.g. forgot to enter email address) + content: + application/json: + schema: + $ref: '#/components/schemas/Users.InvalidUserResponse' + 4XX: + description: Something is wrong with you. + content: + application/json: + schema: + $ref: '#/components/schemas/Standard4XXResponse' + 5XX: + description: Something is wrong with me. + content: + application/json: + schema: + $ref: '#/components/schemas/Standard5XXResponse' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/User' + security: + - {} +security: + - BearerAuth: [] + - ApiKeyAuth: [] +components: + parameters: + TodoItems.PaginationControls.limit: + name: limit + in: query + required: false + description: The limit to the number of items + schema: + type: integer + format: int32 + default: 50 + explode: false + TodoItems.PaginationControls.offset: + name: offset + in: query + required: false + description: The offset to start paginating at + schema: + type: integer + format: int32 + default: 0 + explode: false + schemas: + ApiError: + type: object + required: + - code + - message + properties: + code: + type: string + description: A machine readable error code + message: + type: string + description: A human readable message + x-ms-primary-error-message: true + FileAttachmentMultipartRequest: + type: object + properties: + contents: + type: string + format: binary + required: + - contents + Standard4XXResponse: + type: object + allOf: + - $ref: '#/components/schemas/ApiError' + description: Something is wrong with you. + Standard5XXResponse: + type: object + allOf: + - $ref: '#/components/schemas/ApiError' + description: Something is wrong with me. + ToDoItemMultipartRequest: + type: object + properties: + item: + $ref: '#/components/schemas/TodoItemCreate' + attachments: + type: array + items: + type: string + format: binary + required: + - item + TodoAttachment: + type: object + required: + - filename + - mediaType + - contents + properties: + filename: + type: string + maxLength: 255 + description: The file name of the attachment + mediaType: + type: string + description: The media type of the attachment + contents: + type: string + format: byte + description: The contents of the file + TodoItem: + type: object + required: + - id + - title + - createdBy + - status + - createdAt + - updatedAt + properties: + id: + type: integer + format: int64 + description: The item's unique id + readOnly: true + title: + type: string + maxLength: 255 + description: The item's title + createdBy: + type: integer + format: int64 + description: User that created the todo + readOnly: true + assignedTo: + type: integer + format: int64 + description: User that the todo is assigned to + readOnly: true + description: + type: string + description: A longer description of the todo item in markdown format + status: + type: string + enum: + - NotStarted + - InProgress + - Completed + description: The status of the todo item + createdAt: + type: string + format: date-time + description: When the todo item was created. + readOnly: true + updatedAt: + type: string + format: date-time + description: When the todo item was last updated + readOnly: true + completedAt: + type: string + format: date-time + description: When the todo item was marked as completed + readOnly: true + labels: + $ref: '#/components/schemas/TodoLabels' + TodoItemCreate: + type: object + required: + - title + - status + properties: + title: + type: string + maxLength: 255 + description: The item's title + assignedTo: + type: integer + format: int64 + description: User that the todo is assigned to + readOnly: true + description: + type: string + description: A longer description of the todo item in markdown format + status: + type: string + enum: + - NotStarted + - InProgress + - Completed + description: The status of the todo item + labels: + $ref: '#/components/schemas/TodoLabels' + _dummy: + type: string + TodoItems.InvalidTodoItem: + type: object + allOf: + - $ref: '#/components/schemas/ApiError' + TodoItems.NotFoundErrorResponse: + type: object + required: + - code + properties: + code: + type: string + enum: + - not-found + TodoItems.TodoItemPatch: + type: object + properties: + title: + type: string + maxLength: 255 + description: The item's title + assignedTo: + type: integer + format: int64 + description: User that the todo is assigned to + readOnly: true + nullable: true + description: + type: string + description: A longer description of the todo item in markdown format + nullable: true + status: + type: string + enum: + - NotStarted + - InProgress + - Completed + description: The status of the todo item + TodoItems.TodoPage: + type: object + required: + - items + - pageSize + - totalSize + properties: + items: + type: array + items: + $ref: '#/components/schemas/TodoItem' + description: The items in the page + pageSize: + type: integer + format: int32 + description: The number of items returned in this page + totalSize: + type: integer + format: int32 + description: The total number of items + limit: + type: integer + format: int32 + description: The limit to the number of items + default: 50 + offset: + type: integer + format: int32 + description: The offset to start paginating at + default: 0 + prevLink: + type: string + format: uri + description: A link to the previous page, if it exists + nextLink: + type: string + format: uri + description: A link to the next page, if it exists + TodoLabelRecord: + type: object + required: + - name + properties: + name: + type: string + color: + type: string + pattern: ^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$ + TodoLabels: + anyOf: + - type: string + - type: array + items: + type: string + - $ref: '#/components/schemas/TodoLabelRecord' + - type: array + items: + $ref: '#/components/schemas/TodoLabelRecord' + User: + type: object + required: + - username + - email + - password + properties: + username: + type: string + minLength: 2 + maxLength: 50 + description: The user's username + email: + type: string + description: The user's email address + password: + type: string + description: |- + The user's password, provided when creating a user + but is otherwise not visible (and hashed by the backend) + Users.InvalidUserResponse: + type: object + required: + - code + properties: + code: + type: string + enum: + - invalid-user + allOf: + - $ref: '#/components/schemas/ApiError' + description: The user is invalid (e.g. forgot to enter email address) + Users.UserCreatedResponse: + type: object + required: + - id + - username + - email + - token + properties: + id: + type: integer + format: int64 + description: An autogenerated unique id for the user + readOnly: true + username: + type: string + minLength: 2 + maxLength: 50 + description: The user's username + email: + type: string + description: The user's email address + token: + type: string + description: The token to use to construct the validate email address url + Users.UserExistsResponse: + type: object + required: + - code + properties: + code: + type: string + enum: + - user-exists + allOf: + - $ref: '#/components/schemas/ApiError' + description: The user already exists + securitySchemes: + BearerAuth: + type: http + scheme: bearer + ApiKeyAuth: + type: apiKey + in: cookie + name: session-id diff --git a/packages/spec-api/package.json b/packages/spec-api/package.json index 43eec692ef..de307971ef 100644 --- a/packages/spec-api/package.json +++ b/packages/spec-api/package.json @@ -42,13 +42,13 @@ "@types/express": "^5.0.0", "@types/morgan": "^1.9.4", "@types/multer": "^1.4.10", - "@types/node": "~22.10.7", + "@types/node": "~22.10.10", "@types/xml2js": "^0.4.11", "@types/yargs": "~17.0.33", - "@vitest/coverage-v8": "^3.0.3", + "@vitest/coverage-v8": "^3.0.4", "@vitest/ui": "^3.0.3", "rimraf": "~6.0.1", "typescript": "~5.7.3", - "vitest": "^3.0.3" + "vitest": "^3.0.4" } } diff --git a/packages/spec-coverage-sdk/package.json b/packages/spec-coverage-sdk/package.json index a961cb09d8..c545ab94aa 100644 --- a/packages/spec-coverage-sdk/package.json +++ b/packages/spec-coverage-sdk/package.json @@ -26,7 +26,7 @@ "dependencies": { "@azure/identity": "~4.6.0", "@azure/storage-blob": "~12.26.0", - "@types/node": "~22.10.7" + "@types/node": "~22.10.10" }, "devDependencies": { "rimraf": "~6.0.1", diff --git a/packages/spec-coverage-sdk/src/client.ts b/packages/spec-coverage-sdk/src/client.ts index 841bdc538e..4ea0c372d4 100644 --- a/packages/spec-coverage-sdk/src/client.ts +++ b/packages/spec-coverage-sdk/src/client.ts @@ -125,6 +125,7 @@ export class SpecCoverageOperations { const body = await blob.blobBody; const content = await body?.text(); const report = content ? JSON.parse(content) : undefined; + return { generatorMetadata: { version: blob.metadata?.generatorversion, diff --git a/packages/spec-coverage-sdk/src/types.ts b/packages/spec-coverage-sdk/src/types.ts index db80653900..781f460a1f 100644 --- a/packages/spec-coverage-sdk/src/types.ts +++ b/packages/spec-coverage-sdk/src/types.ts @@ -51,7 +51,7 @@ export interface CoverageReport { createdAt: string; } -export interface ResolvedCoverageReport extends CoverageReport { +export interface ResolvedCoverageReport extends Record { generatorMetadata: GeneratorMetadata; } diff --git a/packages/spec-dashboard/CHANGELOG.md b/packages/spec-dashboard/CHANGELOG.md deleted file mode 100644 index b56d4eca42..0000000000 --- a/packages/spec-dashboard/CHANGELOG.md +++ /dev/null @@ -1,5 +0,0 @@ -# @typespec/spec-dashboard - -## 0.1.0-alpha.0 - -- Initial Release of Spector Dashboard diff --git a/packages/spec-dashboard/index.html b/packages/spec-dashboard/index.html deleted file mode 100644 index fabfdf7990..0000000000 --- a/packages/spec-dashboard/index.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - Spector Dashboard - - -
- - - diff --git a/packages/spec-dashboard/package.json b/packages/spec-dashboard/package.json index 76d153777e..e3449f1805 100644 --- a/packages/spec-dashboard/package.json +++ b/packages/spec-dashboard/package.json @@ -6,12 +6,21 @@ "main": "dist/index.js", "type": "module", "scripts": { - "start": "vite", - "dev": "vite", - "build": "tsc && vite build", - "preview": "vite preview", - "clean": "rimraf dist/ temp/", - "test": "echo \"Error: no test specified\" && exit 1" + "clean": "rimraf ./dist ./temp", + "build": "vite build", + "watch": "vite build --watch", + "test": "vitest run", + "test:ui": "vitest --ui", + "test:ci": "vitest run --coverage --reporter=junit --reporter=default", + "lint": "eslint . --max-warnings=0", + "lint:fix": "eslint . --fix" + }, + "exports": { + ".": { + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + }, + "./style.css": "./dist/style.css" }, "engines": { "node": ">=16.0.0" @@ -42,6 +51,8 @@ "rimraf": "~6.0.1", "rollup-plugin-visualizer": "~5.14.0", "typescript": "~5.7.3", - "vite": "^6.0.11" + "vite": "^6.0.11", + "vite-plugin-checker": "^0.8.0", + "vite-plugin-dts": "4.5.0" } } diff --git a/packages/spec-dashboard/src/apis.ts b/packages/spec-dashboard/src/apis.ts index 1be51dfc2d..4e023acc44 100644 --- a/packages/spec-dashboard/src/apis.ts +++ b/packages/spec-dashboard/src/apis.ts @@ -1,119 +1,133 @@ import { + CoverageReport, + GeneratorMetadata, ResolvedCoverageReport, ScenarioManifest, SpecCoverageClient, } from "@typespec/spec-coverage-sdk"; -const storageAccountName = "typespec"; +export interface CoverageFromAzureStorageOptions { + readonly storageAccountName: string; + readonly containerName: string; + // TODO: why was this not back in the same place as the other options? + readonly manifestContainerName: string; + readonly emitterNames: string[]; + readonly modes?: string[]; +} -export type GeneratorNames = - | "@typespec/http-client-python" - | "@typespec/http-client-csharp" - | "@azure-tools/typespec-ts-rlc" - | "@azure-tools/typespec-ts-modular" - | "@typespec/http-client-java" - | "test"; -const query = new URLSearchParams(window.location.search); -const generatorNames: GeneratorNames[] = [ - "@typespec/http-client-python", - "@typespec/http-client-csharp", - "@azure-tools/typespec-ts-rlc", - "@azure-tools/typespec-ts-modular", - "@typespec/http-client-java", - ...(query.has("showtest") ? (["test"] as const) : []), -]; +export interface GeneratorCoverageSuiteReport extends CoverageReport { + generatorMetadata: GeneratorMetadata; +} export interface CoverageSummary { manifest: ScenarioManifest; - generatorReports: Record; + generatorReports: Record; } let client: SpecCoverageClient | undefined; -export function getCoverageClient() { +export function getCoverageClient(options: CoverageFromAzureStorageOptions) { if (client === undefined) { - client = new SpecCoverageClient(storageAccountName); + client = new SpecCoverageClient(options.storageAccountName); } return client; } let manifestClient: SpecCoverageClient | undefined; -export function getManifestClient() { +export function getManifestClient(options: CoverageFromAzureStorageOptions) { if (manifestClient === undefined) { - manifestClient = new SpecCoverageClient(storageAccountName, { - containerName: "manifests-typespec", + manifestClient = new SpecCoverageClient(options.storageAccountName, { + containerName: options.manifestContainerName, }); } return manifestClient; } -export async function getCoverageSummaries(): Promise { - const coverageClient = getCoverageClient(); - const manifestClient = getManifestClient(); +export async function getCoverageSummaries( + options: CoverageFromAzureStorageOptions, +): Promise { + const coverageClient = getCoverageClient(options); + const manifestClient = getManifestClient(options); const [manifests, generatorReports] = await Promise.all([ manifestClient.manifest.get(), - loadReports(coverageClient, generatorNames), + loadReports(coverageClient, options), ]); - const manifestStandard = manifests.filter( - (manifest: ScenarioManifest) => manifest.setName !== "@azure-tools/azure-http-specs", - )[0]; - for (const key in generatorReports["standard"]) { - if (!(generatorReports["standard"] as any)[key]) { - continue; - } - (generatorReports["standard"] as any)[key] = { - ...(generatorReports["standard"] as any)[key][0], - generatorMetadata: (generatorReports["standard"] as any)[key]["generatorMetadata"], + const reports = Object.values(generatorReports); + + return manifests.map((manifest, i) => { + return { + manifest, + generatorReports: processReports(reports[0], manifest), }; - } + }); +} - return [ - { - manifest: manifestStandard, - generatorReports: generatorReports["standard"], - }, - ]; +function processReports( + reports: Record, + manifest: ScenarioManifest, +) { + const generatorReports: Record = {}; + for (const [emitterName, report] of Object.entries(reports)) { + if (report) { + generatorReports[emitterName] = getSuiteReportForManifest(report, manifest); + } + } + return generatorReports; } -enum GeneratorMode { - standard = "standard", +function getSuiteReportForManifest( + report: ResolvedCoverageReport, + manifest: ScenarioManifest, +): GeneratorCoverageSuiteReport { + let data; + for (const [key, value] of Object.entries(report)) { + if (key === "generatorMetadata") { + continue; + } + if (value.scenariosMetadata.packageName === manifest.setName) { + data = value; + } + } + return data + ? { + generatorMetadata: report.generatorMetadata, + ...data, + } + : undefined; } async function loadReports( coverageClient: SpecCoverageClient, - generatorNames: GeneratorNames[], -): Promise<{ [mode: string]: Record }> { + options: CoverageFromAzureStorageOptions, +): Promise<{ [mode: string]: Record }> { const results = await Promise.all( - Object.keys(GeneratorMode).map( - async ( - mode, - ): Promise<[string, Record]> => { + (options.modes ?? ["standard"]).map( + async (mode): Promise<[string, Record]> => { const items = await Promise.all( - generatorNames.map( - async ( - generatorName, - ): Promise<[GeneratorNames, ResolvedCoverageReport | undefined]> => { + options.emitterNames.map( + async (emitterName): Promise<[string, ResolvedCoverageReport | undefined]> => { try { const report = await coverageClient.coverage.getLatestCoverageFor( - generatorName, + emitterName, mode, ); - return [generatorName, report]; + return [emitterName, report]; } catch (error) { // eslint-disable-next-line no-console console.error("Error resolving report", error); - return [generatorName, undefined]; + return [emitterName, undefined]; } }, ), ); + return [mode, Object.fromEntries(items) as any]; }, ), ); return results.reduce<{ - [mode: string]: Record; + [mode: string]: Record; }>((results, [mode, reports]) => { results[mode] = reports; return results; diff --git a/packages/spec-dashboard/src/app.tsx b/packages/spec-dashboard/src/app.tsx deleted file mode 100644 index 884991b94a..0000000000 --- a/packages/spec-dashboard/src/app.tsx +++ /dev/null @@ -1,30 +0,0 @@ -import { FluentProvider, webLightTheme } from "@fluentui/react-components"; -import { FunctionComponent, useState } from "react"; -import { CoverageSummary, getCoverageSummaries } from "./apis.js"; -import { Dashboard } from "./components/dashboard.js"; -import { useEffectAsync } from "./utils.js"; - -export const App: FunctionComponent = () => { - const [coverageSummaries, setCoverageSummaries] = useState( - undefined, - ); - - useEffectAsync(async () => { - const coverageSummaries = await getCoverageSummaries(); - - if (coverageSummaries) { - setCoverageSummaries(() => coverageSummaries); - } - }, []); - return ( - -
- {coverageSummaries ? ( - - ) : ( - "Loading" - )} -
-
- ); -}; diff --git a/packages/spec-dashboard/src/components/dashboard-az-storage.tsx b/packages/spec-dashboard/src/components/dashboard-az-storage.tsx new file mode 100644 index 0000000000..877e467742 --- /dev/null +++ b/packages/spec-dashboard/src/components/dashboard-az-storage.tsx @@ -0,0 +1,31 @@ +import { useState } from "react"; +import { CoverageFromAzureStorageOptions, CoverageSummary, getCoverageSummaries } from "../apis.js"; +import { useEffectAsync } from "../utils.js"; +import { Dashboard } from "./dashboard.js"; + +export interface DashboardFromAzureStorageProps { + options: CoverageFromAzureStorageOptions; +} + +export const DashboardFromAzureStorage = (props: DashboardFromAzureStorageProps) => { + const [coverageSummaries, setCoverageSummaries] = useState( + undefined, + ); + + useEffectAsync(async () => { + const coverageSummaries = await getCoverageSummaries(props.options); + + if (coverageSummaries) { + setCoverageSummaries(() => coverageSummaries); + } + }, []); + return ( +
+ {coverageSummaries ? ( + + ) : ( + "Loading" + )} +
+ ); +}; diff --git a/packages/spec-dashboard/src/components/dashboard-table.tsx b/packages/spec-dashboard/src/components/dashboard-table.tsx index c80bca1c1b..67f4e5950a 100644 --- a/packages/spec-dashboard/src/components/dashboard-table.tsx +++ b/packages/spec-dashboard/src/components/dashboard-table.tsx @@ -1,13 +1,9 @@ import { css } from "@emotion/react"; import { Popover, PopoverSurface, PopoverTrigger } from "@fluentui/react-components"; import { CodeBlock16Filled, Print16Filled } from "@fluentui/react-icons"; -import { - ResolvedCoverageReport, - ScenarioData, - ScenarioManifest, -} from "@typespec/spec-coverage-sdk"; +import { ScenarioData, ScenarioManifest } from "@typespec/spec-coverage-sdk"; import { FunctionComponent, useCallback, useMemo, useState } from "react"; -import { CoverageSummary, GeneratorNames } from "../apis.js"; +import { CoverageSummary, GeneratorCoverageSuiteReport } from "../apis.js"; import { Colors } from "../constants.js"; import { GeneratorInformation } from "./generator-information.js"; import { ScenarioGroupRatioStatusBox } from "./scenario-group-status.js"; @@ -57,7 +53,7 @@ function buildTreeRows( } export const DashboardTable: FunctionComponent = ({ coverageSummary }) => { - const languages: GeneratorNames[] = Object.keys(coverageSummary.generatorReports) as any; + const languages: string[] = Object.keys(coverageSummary.generatorReports) as any; const tree = useMemo(() => createTree(coverageSummary.manifest), [coverageSummary.manifest]); const [expandedRows, setExpandedRows] = useState>({}); @@ -91,7 +87,7 @@ export const DashboardTable: FunctionComponent = ({ coverag export interface DashboardRowProps { row: TreeTableRow; - languages: GeneratorNames[]; + languages: string[]; coverageSummary: CoverageSummary; } @@ -125,7 +121,7 @@ const DashboardRow: FunctionComponent = ({ interface ScenarioGroupStatusBoxProps { coverageSummary: CoverageSummary; - lang: GeneratorNames; + lang: string; group: string; } const ScenarioGroupStatusBox: FunctionComponent = ({ @@ -140,7 +136,7 @@ const ScenarioGroupStatusBox: FunctionComponent = ( function getCompletedRatio( scenarios: ScenarioData[], - report: ResolvedCoverageReport, + report: GeneratorCoverageSuiteReport, scope: string = "", ) { const filtered = scenarios.filter((x) => x.name.startsWith(scope)); @@ -160,7 +156,7 @@ interface DashboardHeaderRowProps { } const DashboardHeaderRow: FunctionComponent = ({ coverageSummary }) => { - const data: [string, number, ResolvedCoverageReport | undefined][] = Object.entries( + const data: [string, number, GeneratorCoverageSuiteReport | undefined][] = Object.entries( coverageSummary.generatorReports, ).map(([language, report]) => { if (report === undefined) { @@ -202,7 +198,7 @@ const ScenarioStatusCellStyles = css({ export interface GeneratorHeaderCellProps { status: number; - report: ResolvedCoverageReport | undefined; + report: GeneratorCoverageSuiteReport | undefined; language: string; } diff --git a/packages/spec-dashboard/src/components/generator-information.tsx b/packages/spec-dashboard/src/components/generator-information.tsx index 014f51485b..b7a7c4fd88 100644 --- a/packages/spec-dashboard/src/components/generator-information.tsx +++ b/packages/spec-dashboard/src/components/generator-information.tsx @@ -1,11 +1,11 @@ -import { ResolvedCoverageReport } from "@typespec/spec-coverage-sdk"; import { FunctionComponent } from "react"; +import type { GeneratorCoverageSuiteReport } from "../apis.js"; import { InfoEntry, InfoReport } from "./info-table.js"; import { ScenarioGroupRatioStatusBox } from "./scenario-group-status.js"; export type GeneratorInformationProps = { status: number; - report: ResolvedCoverageReport; + report: GeneratorCoverageSuiteReport; }; export const GeneratorInformation: FunctionComponent = ({ @@ -52,7 +52,7 @@ export const GeneratorInformation: FunctionComponent ); }; -function getCompletedRatioAtTimeOfReport(report: ResolvedCoverageReport) { +function getCompletedRatioAtTimeOfReport(report: GeneratorCoverageSuiteReport) { let coveredCount = 0; const statues = Object.values(report.results); for (const status of statues) { diff --git a/packages/spec-dashboard/src/index.ts b/packages/spec-dashboard/src/index.ts new file mode 100644 index 0000000000..79f0d8e314 --- /dev/null +++ b/packages/spec-dashboard/src/index.ts @@ -0,0 +1,3 @@ +export type { CoverageFromAzureStorageOptions } from "./apis.js"; +export { DashboardFromAzureStorage } from "./components/dashboard-az-storage.js"; +export { Dashboard } from "./components/dashboard.js"; diff --git a/packages/spec-dashboard/src/main.tsx b/packages/spec-dashboard/src/main.tsx deleted file mode 100644 index f8495b1c05..0000000000 --- a/packages/spec-dashboard/src/main.tsx +++ /dev/null @@ -1,6 +0,0 @@ -import { createRoot } from "react-dom/client"; -import { App } from "./app.jsx"; -import "./style.css"; - -const root = createRoot(document.getElementById("root")!); -root.render(); diff --git a/packages/spec-dashboard/src/style.css b/packages/spec-dashboard/src/style.css deleted file mode 100644 index 664a65c2ee..0000000000 --- a/packages/spec-dashboard/src/style.css +++ /dev/null @@ -1,6 +0,0 @@ -body { - font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif; - font-size: 16px; - box-sizing: border-box; - margin: 0; -} diff --git a/packages/spec-dashboard/tsconfig.build.json b/packages/spec-dashboard/tsconfig.build.json deleted file mode 100644 index 475c020d4f..0000000000 --- a/packages/spec-dashboard/tsconfig.build.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "rootDir": "./src" - }, - "references": [{ "path": "../spector/tsconfig.build.json" }], - "exclude": ["**/*.test.*", "test/**/*"] -} diff --git a/packages/spec-dashboard/tsconfig.json b/packages/spec-dashboard/tsconfig.json index a07efa4d38..08cb48ddb8 100644 --- a/packages/spec-dashboard/tsconfig.json +++ b/packages/spec-dashboard/tsconfig.json @@ -1,14 +1,14 @@ { "extends": "../../tsconfig.base.json", "compilerOptions": { + "incremental": false, + "composite": false, "skipLibCheck": true, - "outDir": "dist", - "tsBuildInfoFile": "temp/.tsbuildinfo", + "noEmit": true, "jsx": "react-jsx", "jsxImportSource": "@emotion/react", - "lib": ["DOM"], - "types": ["@emotion/react"] + "lib": ["DOM", "ES2022"], + "types": ["vite/client", "@emotion/react"] }, - "references": [{ "path": "../spec-coverage-sdk/tsconfig.build.json" }], - "include": ["src/**/*.ts", "src/**/*.tsx", "test/**/*.ts", "src/main.tsx", "vite.config.ts"] + "include": ["src"] } diff --git a/packages/spec-dashboard/vite.config.ts b/packages/spec-dashboard/vite.config.ts index aa0dfbe509..ee55d277fd 100644 --- a/packages/spec-dashboard/vite.config.ts +++ b/packages/spec-dashboard/vite.config.ts @@ -1,29 +1,47 @@ import react from "@vitejs/plugin-react"; -import { visualizer } from "rollup-plugin-visualizer"; +import { readFileSync } from "fs"; +import { dirname, resolve } from "path"; +import { fileURLToPath } from "url"; import { defineConfig } from "vite"; +import checker from "vite-plugin-checker"; +import dts from "vite-plugin-dts"; + +const __dirname = dirname(fileURLToPath(import.meta.url)); + +const packageJson = JSON.parse(readFileSync(resolve(__dirname, "package.json")).toString()); +const dependencies = Object.keys(packageJson.dependencies); +const externals = [...dependencies]; -// https://vitejs.dev/config/ export default defineConfig({ - base: "./", build: { target: "esnext", + minify: false, chunkSizeWarningLimit: 3000, - }, - esbuild: { - target: "esnext", + lib: { + entry: { + index: "src/index.ts", + }, + cssFileName: "style", + formats: ["es"], + }, + + rollupOptions: { + external: externals, + }, }, plugins: [ - (react as any)({ - jsxImportSource: "@emotion/react", - babel: { - plugins: ["@emotion/babel-plugin"], - }, + react({}), + dts({ + logLevel: "silent", // checker reports the errors }), - visualizer({ - template: "treemap", // or sunburst - // open: true, - gzipSize: true, - filename: "temp/bundle-size.html", + checker({ + // e.g. use TypeScript check + typescript: true, }), ], + server: { + fs: { + strict: false, + }, + }, }); diff --git a/packages/spec/package.json b/packages/spec/package.json index 16e08ff470..85e555f012 100644 --- a/packages/spec/package.json +++ b/packages/spec/package.json @@ -20,7 +20,7 @@ "watch": "node scripts/watch-spec.js" }, "devDependencies": { - "@types/node": "~22.10.7", + "@types/node": "~22.10.10", "@typespec/internal-build-utils": "workspace:~", "ecmarkup": "~20.0.0" } diff --git a/packages/spector/package.json b/packages/spector/package.json index 0a30029461..53679377b1 100644 --- a/packages/spector/package.json +++ b/packages/spector/package.json @@ -68,7 +68,7 @@ "@types/express": "^5.0.0", "@types/morgan": "^1.9.4", "@types/multer": "^1.4.10", - "@types/node": "~22.10.7", + "@types/node": "~22.10.10", "@types/node-fetch": "^2.6.12", "@types/xml2js": "^0.4.11", "@types/yargs": "~17.0.33", diff --git a/packages/sse/package.json b/packages/sse/package.json index 99317bec01..c0e703c647 100644 --- a/packages/sse/package.json +++ b/packages/sse/package.json @@ -55,18 +55,18 @@ "@typespec/streams": "workspace:~" }, "devDependencies": { - "@types/node": "~22.10.7", + "@types/node": "~22.10.10", "@typespec/compiler": "workspace:~", "@typespec/events": "workspace:~", "@typespec/http": "workspace:~", "@typespec/library-linter": "workspace:~", "@typespec/streams": "workspace:~", "@typespec/tspd": "workspace:~", - "@vitest/coverage-v8": "^3.0.3", + "@vitest/coverage-v8": "^3.0.4", "@vitest/ui": "^3.0.3", "c8": "^10.1.3", "rimraf": "~6.0.1", "typescript": "~5.7.3", - "vitest": "^3.0.3" + "vitest": "^3.0.4" } } diff --git a/packages/sse/src/decorators.ts b/packages/sse/src/decorators.ts index 566e1df5b6..e42acfeb79 100644 --- a/packages/sse/src/decorators.ts +++ b/packages/sse/src/decorators.ts @@ -1,11 +1,9 @@ import type { UnionVariant } from "@typespec/compiler"; -import { unsafe_useStateSet } from "@typespec/compiler/experimental"; +import { useStateSet } from "@typespec/compiler/utils"; import type { TerminalEventDecorator } from "../generated-defs/TypeSpec.SSE.js"; import { SSEStateKeys } from "./lib.js"; -const [isTerminalEvent, setTerminalEvent] = unsafe_useStateSet( - SSEStateKeys.terminalEvent, -); +const [isTerminalEvent, setTerminalEvent] = useStateSet(SSEStateKeys.terminalEvent); export const $terminalEventDecorator: TerminalEventDecorator = (context, target) => { setTerminalEvent(context.program, target); diff --git a/packages/streams/package.json b/packages/streams/package.json index 27ba4fb59d..35cf3b3ded 100644 --- a/packages/streams/package.json +++ b/packages/streams/package.json @@ -56,15 +56,15 @@ "@typespec/compiler": "workspace:~" }, "devDependencies": { - "@types/node": "~22.10.7", + "@types/node": "~22.10.10", "@typespec/compiler": "workspace:~", "@typespec/library-linter": "workspace:~", "@typespec/tspd": "workspace:~", - "@vitest/coverage-v8": "^3.0.3", + "@vitest/coverage-v8": "^3.0.4", "@vitest/ui": "^3.0.3", "c8": "^10.1.3", "rimraf": "~6.0.1", "typescript": "~5.7.3", - "vitest": "^3.0.3" + "vitest": "^3.0.4" } } diff --git a/packages/streams/src/decorators.ts b/packages/streams/src/decorators.ts index bf5608ece6..203493a913 100644 --- a/packages/streams/src/decorators.ts +++ b/packages/streams/src/decorators.ts @@ -1,9 +1,9 @@ import type { Model, Program, Type } from "@typespec/compiler"; -import { unsafe_useStateMap } from "@typespec/compiler/experimental"; +import { useStateMap } from "@typespec/compiler/utils"; import type { StreamOfDecorator } from "../generated-defs/TypeSpec.Streams.js"; import { StreamStateKeys } from "./lib.js"; -const [getStreamOf, setStreamOf] = unsafe_useStateMap(StreamStateKeys.streamOf); +const [getStreamOf, setStreamOf] = useStateMap(StreamStateKeys.streamOf); export const $streamOfDecorator: StreamOfDecorator = (context, target, type) => { setStreamOf(context.program, target, type); diff --git a/packages/tmlanguage-generator/package.json b/packages/tmlanguage-generator/package.json index ff99024047..a399323291 100644 --- a/packages/tmlanguage-generator/package.json +++ b/packages/tmlanguage-generator/package.json @@ -37,7 +37,7 @@ "plist": "~3.1.0" }, "devDependencies": { - "@types/node": "~22.10.7", + "@types/node": "~22.10.10", "@types/plist": "~3.0.5", "rimraf": "~6.0.1", "typescript": "~5.7.3" diff --git a/packages/tspd/package.json b/packages/tspd/package.json index 469f5921d1..c0cf8531b9 100644 --- a/packages/tspd/package.json +++ b/packages/tspd/package.json @@ -63,11 +63,11 @@ "yargs": "~17.7.2" }, "devDependencies": { - "@types/node": "~22.10.7", + "@types/node": "~22.10.10", "@types/yargs": "~17.0.33", "@typespec/compiler": "workspace:~", "@typespec/prettier-plugin-typespec": "workspace:~", - "@vitest/coverage-v8": "^3.0.3", + "@vitest/coverage-v8": "^3.0.4", "@vitest/ui": "^3.0.3", "c8": "^10.1.3", "rimraf": "~6.0.1", @@ -75,6 +75,6 @@ "typedoc": "^0.27.6", "typedoc-plugin-markdown": "^4.4.1", "typescript": "~5.7.3", - "vitest": "^3.0.3" + "vitest": "^3.0.4" } } diff --git a/packages/typespec-vscode/package.json b/packages/typespec-vscode/package.json index 0e6cadfe90..5ce296efcd 100644 --- a/packages/typespec-vscode/package.json +++ b/packages/typespec-vscode/package.json @@ -247,14 +247,14 @@ "@rollup/plugin-node-resolve": "~16.0.0", "@rollup/plugin-typescript": "~12.1.0", "@types/mocha": "^10.0.9", - "@types/node": "~22.10.7", + "@types/node": "~22.10.10", "@types/vscode": "~1.96.0", "@types/semver": "^7.5.8", "@typespec/compiler": "workspace:~", "@typespec/internal-build-utils": "workspace:~", - "@vitest/coverage-v8": "^3.0.3", + "@vitest/coverage-v8": "^3.0.4", "@vitest/ui": "^3.0.3", - "@vscode/test-web": "^0.0.62", + "@vscode/test-web": "^0.0.65", "@vscode/vsce": "~3.2.1", "c8": "^10.1.3", "mocha": "^11.1.0", @@ -262,7 +262,7 @@ "rollup": "~4.31.0", "semver": "^7.6.3", "typescript": "~5.7.3", - "vitest": "^3.0.3", + "vitest": "^3.0.4", "vscode-languageclient": "~9.0.1", "yaml": "~2.7.0" } diff --git a/packages/typespec-vscode/src/vscode-cmd/emit-code/emit-code.ts b/packages/typespec-vscode/src/vscode-cmd/emit-code/emit-code.ts index aca97d0462..802706b8d2 100644 --- a/packages/typespec-vscode/src/vscode-cmd/emit-code/emit-code.ts +++ b/packages/typespec-vscode/src/vscode-cmd/emit-code/emit-code.ts @@ -329,6 +329,9 @@ async function doEmit(mainTspFile: string, emitter: Emitter) { } outputDir = outputDir.replace("{project-root}", baseDir); + outputDir = outputDir + .replace("{output-dir}", `${baseDir}/tsp-output`) + .replace("{emitter-name}", emitter.package); const options: Record = {}; logger.info( `Start to generate ${emitter.language} ${emitter.kind} code under directory ${outputDir}`, diff --git a/packages/versioning/package.json b/packages/versioning/package.json index 1ba2a8d60a..fd1ab2a52d 100644 --- a/packages/versioning/package.json +++ b/packages/versioning/package.json @@ -55,15 +55,15 @@ "@typespec/compiler": "workspace:~" }, "devDependencies": { - "@types/node": "~22.10.7", + "@types/node": "~22.10.10", "@typespec/compiler": "workspace:~", "@typespec/library-linter": "workspace:~", "@typespec/tspd": "workspace:~", - "@vitest/coverage-v8": "^3.0.3", + "@vitest/coverage-v8": "^3.0.4", "@vitest/ui": "^3.0.3", "c8": "^10.1.3", "rimraf": "~6.0.1", "typescript": "~5.7.3", - "vitest": "^3.0.3" + "vitest": "^3.0.4" } } diff --git a/packages/xml/package.json b/packages/xml/package.json index 6122311f22..ac00a673ce 100644 --- a/packages/xml/package.json +++ b/packages/xml/package.json @@ -53,15 +53,15 @@ "@typespec/compiler": "workspace:~" }, "devDependencies": { - "@types/node": "~22.10.7", + "@types/node": "~22.10.10", "@typespec/compiler": "workspace:~", "@typespec/library-linter": "workspace:~", "@typespec/tspd": "workspace:~", - "@vitest/coverage-v8": "^3.0.3", + "@vitest/coverage-v8": "^3.0.4", "@vitest/ui": "^3.0.3", "c8": "^10.1.3", "rimraf": "~6.0.1", "typescript": "~5.7.3", - "vitest": "^3.0.3" + "vitest": "^3.0.4" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7c6cd98826..dddbb84815 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -22,7 +22,7 @@ importers: version: 9.18.0 '@microsoft/api-extractor': specifier: ^7.49.1 - version: 7.49.1(@types/node@22.10.7) + version: 7.49.1(@types/node@22.10.10) '@octokit/core': specifier: ^6.1.3 version: 6.1.3 @@ -34,16 +34,16 @@ importers: version: 13.3.0(@octokit/core@6.1.3) '@pnpm/find-workspace-packages': specifier: ^6.0.9 - version: 6.0.9(@pnpm/logger@1000.0.0) + version: 6.0.9(@pnpm/logger@5.2.0) '@types/micromatch': specifier: ^4.0.9 version: 4.0.9 '@types/node': - specifier: ~22.10.7 - version: 22.10.7 + specifier: ~22.10.10 + version: 22.10.10 '@vitest/coverage-v8': - specifier: ^3.0.3 - version: 3.0.3(vitest@3.0.3(@types/node@22.10.7)(@vitest/ui@3.0.3)(happy-dom@16.7.2)(jiti@2.4.2)(jsdom@26.0.0)(tsx@4.19.2)(yaml@2.7.0)) + specifier: ^3.0.4 + version: 3.0.4(vitest@3.0.4(@types/debug@4.1.12)(@types/node@22.10.10)(@vitest/ui@3.0.4)(happy-dom@16.7.2)(jiti@1.21.6)(jsdom@19.0.0)(tsx@4.19.2)(yaml@2.7.0)) c8: specifier: ^10.1.3 version: 10.1.3 @@ -52,22 +52,22 @@ importers: version: 8.17.2 eslint: specifier: ^9.18.0 - version: 9.18.0(jiti@2.4.2) + version: 9.18.0(jiti@1.21.6) eslint-plugin-deprecation: specifier: ^3.0.0 - version: 3.0.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3) + version: 3.0.0(eslint@9.18.0(jiti@1.21.6))(typescript@5.7.3) eslint-plugin-import: specifier: ^2.31.0 - version: 2.31.0(@typescript-eslint/parser@8.21.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.18.0(jiti@2.4.2)) + version: 2.31.0(@typescript-eslint/parser@8.21.0(eslint@9.18.0(jiti@1.21.6))(typescript@5.7.3))(eslint@9.18.0(jiti@1.21.6)) eslint-plugin-react-hooks: specifier: 5.1.0 - version: 5.1.0(eslint@9.18.0(jiti@2.4.2)) + version: 5.1.0(eslint@9.18.0(jiti@1.21.6)) eslint-plugin-unicorn: specifier: ^56.0.1 - version: 56.0.1(eslint@9.18.0(jiti@2.4.2)) + version: 56.0.1(eslint@9.18.0(jiti@1.21.6)) eslint-plugin-vitest: specifier: ^0.5.4 - version: 0.5.4(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3)(vitest@3.0.3(@types/node@22.10.7)(@vitest/ui@3.0.3)(happy-dom@16.7.2)(jiti@2.4.2)(jsdom@26.0.0)(tsx@4.19.2)(yaml@2.7.0)) + version: 0.5.4(eslint@9.18.0(jiti@1.21.6))(typescript@5.7.3)(vitest@3.0.4(@types/debug@4.1.12)(@types/node@22.10.10)(@vitest/ui@3.0.4)(happy-dom@16.7.2)(jiti@1.21.6)(jsdom@19.0.0)(tsx@4.19.2)(yaml@2.7.0)) micromatch: specifier: ^4.0.8 version: 4.0.8 @@ -75,8 +75,8 @@ importers: specifier: ~1.1.1 version: 1.1.1 playwright: - specifier: ^1.49.1 - version: 1.49.1 + specifier: ^1.50.0 + version: 1.50.0 prettier: specifier: ~3.4.2 version: 3.4.2 @@ -100,10 +100,10 @@ importers: version: 5.7.3 typescript-eslint: specifier: ^8.21.0 - version: 8.21.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3) + version: 8.21.0(eslint@9.18.0(jiti@1.21.6))(typescript@5.7.3) vitest: - specifier: ^3.0.3 - version: 3.0.3(@types/node@22.10.7)(@vitest/ui@3.0.3)(happy-dom@16.7.2)(jiti@2.4.2)(jsdom@26.0.0)(tsx@4.19.2)(yaml@2.7.0) + specifier: ^3.0.4 + version: 3.0.4(@types/debug@4.1.12)(@types/node@22.10.10)(@vitest/ui@3.0.4)(happy-dom@16.7.2)(jiti@1.21.6)(jsdom@19.0.0)(tsx@4.19.2)(yaml@2.7.0) yaml: specifier: ~2.7.0 version: 2.7.0 @@ -117,7 +117,7 @@ importers: version: 0.9.4(prettier-plugin-astro@0.14.1)(prettier@3.4.2)(typescript@5.7.3) '@astrojs/starlight': specifier: ^0.31.1 - version: 0.31.1(astro@5.1.8(@azure/identity@4.6.0)(@azure/storage-blob@12.26.0)(@types/node@22.10.7)(jiti@2.4.2)(rollup@4.31.0)(tsx@4.19.2)(typescript@5.7.3)(yaml@2.7.0)) + version: 0.31.1(astro@5.1.8(@azure/identity@4.6.0)(@azure/storage-blob@12.26.0)(@types/node@22.10.10)(jiti@1.21.6)(rollup@4.31.0)(tsx@4.19.2)(typescript@5.7.3)(yaml@2.7.0)) '@expressive-code/core': specifier: ^0.40.1 version: 0.40.1 @@ -126,7 +126,7 @@ importers: version: link:../playground astro-expressive-code: specifier: ^0.40.1 - version: 0.40.1(astro@5.1.8(@azure/identity@4.6.0)(@azure/storage-blob@12.26.0)(@types/node@22.10.7)(jiti@2.4.2)(rollup@4.31.0)(tsx@4.19.2)(typescript@5.7.3)(yaml@2.7.0)) + version: 0.40.1(astro@5.1.8(@azure/identity@4.6.0)(@azure/storage-blob@12.26.0)(@types/node@22.10.10)(jiti@1.21.6)(rollup@4.31.0)(tsx@4.19.2)(typescript@5.7.3)(yaml@2.7.0)) react: specifier: ~18.3.1 version: 18.3.1 @@ -136,25 +136,25 @@ importers: devDependencies: '@types/react': specifier: ~18.3.11 - version: 18.3.18 + version: 18.3.12 astro: specifier: ^5.1.8 - version: 5.1.8(@azure/identity@4.6.0)(@azure/storage-blob@12.26.0)(@types/node@22.10.7)(jiti@2.4.2)(rollup@4.31.0)(tsx@4.19.2)(typescript@5.7.3)(yaml@2.7.0) + version: 5.1.8(@azure/identity@4.6.0)(@azure/storage-blob@12.26.0)(@types/node@22.10.10)(jiti@1.21.6)(rollup@4.31.0)(tsx@4.19.2)(typescript@5.7.3)(yaml@2.7.0) packages/best-practices: devDependencies: '@types/node': - specifier: ~22.10.7 - version: 22.10.7 + specifier: ~22.10.10 + version: 22.10.10 '@typespec/compiler': specifier: workspace:~ version: link:../compiler '@vitest/coverage-v8': - specifier: ^3.0.3 - version: 3.0.3(vitest@3.0.3(@types/node@22.10.7)(@vitest/ui@3.0.3)(happy-dom@16.7.2)(jiti@2.4.2)(jsdom@26.0.0)(tsx@4.19.2)(yaml@2.7.0)) + specifier: ^3.0.4 + version: 3.0.4(vitest@3.0.4(@types/debug@4.1.12)(@types/node@22.10.10)(@vitest/ui@3.0.4)(happy-dom@16.7.2)(jiti@1.21.6)(jsdom@19.0.0)(tsx@4.19.2)(yaml@2.7.0)) '@vitest/ui': specifier: ^3.0.3 - version: 3.0.3(vitest@3.0.3) + version: 3.0.4(vitest@3.0.4) c8: specifier: ^10.1.3 version: 10.1.3 @@ -165,8 +165,8 @@ importers: specifier: ~5.7.3 version: 5.7.3 vitest: - specifier: ^3.0.3 - version: 3.0.3(@types/node@22.10.7)(@vitest/ui@3.0.3)(happy-dom@16.7.2)(jiti@2.4.2)(jsdom@26.0.0)(tsx@4.19.2)(yaml@2.7.0) + specifier: ^3.0.4 + version: 3.0.4(@types/debug@4.1.12)(@types/node@22.10.10)(@vitest/ui@3.0.4)(happy-dom@16.7.2)(jiti@1.21.6)(jsdom@19.0.0)(tsx@4.19.2)(yaml@2.7.0) packages/bundle-uploader: dependencies: @@ -178,7 +178,7 @@ importers: version: 12.26.0 '@pnpm/find-workspace-packages': specifier: ^6.0.9 - version: 6.0.9(@pnpm/logger@1000.0.0) + version: 6.0.9(@pnpm/logger@5.2.0) '@typespec/bundler': specifier: workspace:~ version: link:../bundler @@ -193,17 +193,17 @@ importers: version: 7.6.3 devDependencies: '@types/node': - specifier: ~22.10.7 - version: 22.10.7 + specifier: ~22.10.10 + version: 22.10.10 '@types/semver': specifier: ^7.5.8 version: 7.5.8 '@vitest/coverage-v8': - specifier: ^3.0.3 - version: 3.0.3(vitest@3.0.3(@types/node@22.10.7)(@vitest/ui@3.0.3)(happy-dom@16.7.2)(jiti@2.4.2)(jsdom@26.0.0)(tsx@4.19.2)(yaml@2.7.0)) + specifier: ^3.0.4 + version: 3.0.4(vitest@3.0.4(@types/debug@4.1.12)(@types/node@22.10.10)(@vitest/ui@3.0.4)(happy-dom@16.7.2)(jiti@1.21.6)(jsdom@19.0.0)(tsx@4.19.2)(yaml@2.7.0)) '@vitest/ui': specifier: ^3.0.3 - version: 3.0.3(vitest@3.0.3) + version: 3.0.4(vitest@3.0.4) c8: specifier: ^10.1.3 version: 10.1.3 @@ -214,8 +214,8 @@ importers: specifier: ~5.7.3 version: 5.7.3 vitest: - specifier: ^3.0.3 - version: 3.0.3(@types/node@22.10.7)(@vitest/ui@3.0.3)(happy-dom@16.7.2)(jiti@2.4.2)(jsdom@26.0.0)(tsx@4.19.2)(yaml@2.7.0) + specifier: ^3.0.4 + version: 3.0.4(@types/debug@4.1.12)(@types/node@22.10.10)(@vitest/ui@3.0.4)(happy-dom@16.7.2)(jiti@1.21.6)(jsdom@19.0.0)(tsx@4.19.2)(yaml@2.7.0) packages/bundler: dependencies: @@ -251,17 +251,17 @@ importers: version: 17.7.2 devDependencies: '@types/node': - specifier: ~22.10.7 - version: 22.10.7 + specifier: ~22.10.10 + version: 22.10.10 '@types/yargs': specifier: ~17.0.33 version: 17.0.33 '@vitest/coverage-v8': - specifier: ^3.0.3 - version: 3.0.3(vitest@3.0.3(@types/node@22.10.7)(@vitest/ui@3.0.3)(happy-dom@16.7.2)(jiti@2.4.2)(jsdom@26.0.0)(tsx@4.19.2)(yaml@2.7.0)) + specifier: ^3.0.4 + version: 3.0.4(vitest@3.0.4(@types/debug@4.1.12)(@types/node@22.10.10)(@vitest/ui@3.0.4)(happy-dom@16.7.2)(jiti@1.21.6)(jsdom@19.0.0)(tsx@4.19.2)(yaml@2.7.0)) '@vitest/ui': specifier: ^3.0.3 - version: 3.0.3(vitest@3.0.3) + version: 3.0.4(vitest@3.0.4) c8: specifier: ^10.1.3 version: 10.1.3 @@ -273,10 +273,10 @@ importers: version: 5.7.3 vite: specifier: ^6.0.11 - version: 6.0.11(@types/node@22.10.7)(jiti@2.4.2)(tsx@4.19.2)(yaml@2.7.0) + version: 6.0.11(@types/node@22.10.10)(jiti@1.21.6)(tsx@4.19.2)(yaml@2.7.0) vitest: - specifier: ^3.0.3 - version: 3.0.3(@types/node@22.10.7)(@vitest/ui@3.0.3)(happy-dom@16.7.2)(jiti@2.4.2)(jsdom@26.0.0)(tsx@4.19.2)(yaml@2.7.0) + specifier: ^3.0.4 + version: 3.0.4(@types/debug@4.1.12)(@types/node@22.10.10)(@vitest/ui@3.0.4)(happy-dom@16.7.2)(jiti@1.21.6)(jsdom@19.0.0)(tsx@4.19.2)(yaml@2.7.0) packages/compiler: dependencies: @@ -330,8 +330,8 @@ importers: specifier: ~4.2.5 version: 4.2.5 '@types/node': - specifier: ~22.10.7 - version: 22.10.7 + specifier: ~22.10.10 + version: 22.10.10 '@types/prompts': specifier: ~2.4.9 version: 2.4.9 @@ -345,11 +345,11 @@ importers: specifier: workspace:~ version: link:../internal-build-utils '@vitest/coverage-v8': - specifier: ^3.0.3 - version: 3.0.3(vitest@3.0.3(@types/node@22.10.7)(@vitest/ui@3.0.3)(happy-dom@16.7.2)(jiti@2.4.2)(jsdom@26.0.0)(tsx@4.19.2)(yaml@2.7.0)) + specifier: ^3.0.4 + version: 3.0.4(vitest@3.0.4(@types/debug@4.1.12)(@types/node@22.10.10)(@vitest/ui@3.0.4)(happy-dom@16.7.2)(jiti@1.21.6)(jsdom@19.0.0)(tsx@4.19.2)(yaml@2.7.0)) '@vitest/ui': specifier: ^3.0.3 - version: 3.0.3(vitest@3.0.3) + version: 3.0.4(vitest@3.0.4) c8: specifier: ^10.1.3 version: 10.1.3 @@ -369,8 +369,8 @@ importers: specifier: ~5.7.3 version: 5.7.3 vitest: - specifier: ^3.0.3 - version: 3.0.3(@types/node@22.10.7)(@vitest/ui@3.0.3)(happy-dom@16.7.2)(jiti@2.4.2)(jsdom@26.0.0)(tsx@4.19.2)(yaml@2.7.0) + specifier: ^3.0.4 + version: 3.0.4(@types/debug@4.1.12)(@types/node@22.10.10)(@vitest/ui@3.0.4)(happy-dom@16.7.2)(jiti@1.21.6)(jsdom@19.0.0)(tsx@4.19.2)(yaml@2.7.0) vscode-oniguruma: specifier: ~2.0.1 version: 2.0.1 @@ -382,32 +382,32 @@ importers: dependencies: '@typescript-eslint/utils': specifier: ^8.21.0 - version: 8.21.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3) + version: 8.21.0(eslint@9.18.0(jiti@1.21.6))(typescript@5.7.3) devDependencies: '@types/node': - specifier: ~22.10.7 - version: 22.10.7 + specifier: ~22.10.10 + version: 22.10.10 '@typescript-eslint/parser': specifier: ^8.21.0 - version: 8.21.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3) + version: 8.21.0(eslint@9.18.0(jiti@1.21.6))(typescript@5.7.3) '@typescript-eslint/rule-tester': specifier: ^8.21.0 - version: 8.21.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3) + version: 8.21.0(eslint@9.18.0(jiti@1.21.6))(typescript@5.7.3) '@typescript-eslint/types': specifier: ^8.21.0 version: 8.21.0 '@vitest/coverage-v8': - specifier: ^3.0.3 - version: 3.0.3(vitest@3.0.3(@types/node@22.10.7)(@vitest/ui@3.0.3)(happy-dom@16.7.2)(jiti@2.4.2)(jsdom@26.0.0)(tsx@4.19.2)(yaml@2.7.0)) + specifier: ^3.0.4 + version: 3.0.4(vitest@3.0.4(@types/debug@4.1.12)(@types/node@22.10.10)(@vitest/ui@3.0.4)(happy-dom@16.7.2)(jiti@1.21.6)(jsdom@19.0.0)(tsx@4.19.2)(yaml@2.7.0)) '@vitest/ui': specifier: ^3.0.3 - version: 3.0.3(vitest@3.0.3) + version: 3.0.4(vitest@3.0.4) c8: specifier: ^10.1.3 version: 10.1.3 eslint: specifier: ^9.18.0 - version: 9.18.0(jiti@2.4.2) + version: 9.18.0(jiti@1.21.6) rimraf: specifier: ~6.0.1 version: 6.0.1 @@ -415,14 +415,14 @@ importers: specifier: ~5.7.3 version: 5.7.3 vitest: - specifier: ^3.0.3 - version: 3.0.3(@types/node@22.10.7)(@vitest/ui@3.0.3)(happy-dom@16.7.2)(jiti@2.4.2)(jsdom@26.0.0)(tsx@4.19.2)(yaml@2.7.0) + specifier: ^3.0.4 + version: 3.0.4(@types/debug@4.1.12)(@types/node@22.10.10)(@vitest/ui@3.0.4)(happy-dom@16.7.2)(jiti@1.21.6)(jsdom@19.0.0)(tsx@4.19.2)(yaml@2.7.0) packages/events: devDependencies: '@types/node': - specifier: ~22.10.7 - version: 22.10.7 + specifier: ~22.10.10 + version: 22.10.10 '@typespec/compiler': specifier: workspace:~ version: link:../compiler @@ -433,11 +433,11 @@ importers: specifier: workspace:~ version: link:../tspd '@vitest/coverage-v8': - specifier: ^3.0.3 - version: 3.0.3(vitest@3.0.3(@types/node@22.10.7)(@vitest/ui@3.0.3)(happy-dom@16.7.2)(jiti@2.4.2)(jsdom@26.0.0)(tsx@4.19.2)(yaml@2.7.0)) + specifier: ^3.0.4 + version: 3.0.4(vitest@3.0.4(@types/debug@4.1.12)(@types/node@22.10.10)(@vitest/ui@3.0.4)(happy-dom@16.7.2)(jiti@1.21.6)(jsdom@19.0.0)(tsx@4.19.2)(yaml@2.7.0)) '@vitest/ui': specifier: ^3.0.3 - version: 3.0.3(vitest@3.0.3) + version: 3.0.4(vitest@3.0.4) c8: specifier: ^10.1.3 version: 10.1.3 @@ -448,20 +448,20 @@ importers: specifier: ~5.7.3 version: 5.7.3 vitest: - specifier: ^3.0.3 - version: 3.0.3(@types/node@22.10.7)(@vitest/ui@3.0.3)(happy-dom@16.7.2)(jiti@2.4.2)(jsdom@26.0.0)(tsx@4.19.2)(yaml@2.7.0) + specifier: ^3.0.4 + version: 3.0.4(@types/debug@4.1.12)(@types/node@22.10.10)(@vitest/ui@3.0.4)(happy-dom@16.7.2)(jiti@1.21.6)(jsdom@19.0.0)(tsx@4.19.2)(yaml@2.7.0) packages/html-program-viewer: dependencies: '@fluentui/react-components': specifier: ~9.57.0 - version: 9.57.0(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) + version: 9.57.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) '@fluentui/react-icons': specifier: ^2.0.271 version: 2.0.271(react@18.3.1) '@fluentui/react-list-preview': specifier: ^0.4.4 - version: 0.4.4(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) + version: 0.4.4(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) react: specifier: ~18.3.1 version: 18.3.1 @@ -483,16 +483,16 @@ importers: version: 6.6.3 '@testing-library/react': specifier: ^16.2.0 - version: 16.2.0(@testing-library/dom@10.4.0)(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 16.2.0(@testing-library/dom@10.4.0)(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@types/node': - specifier: ~22.10.7 - version: 22.10.7 + specifier: ~22.10.10 + version: 22.10.10 '@types/react': specifier: ~18.3.11 - version: 18.3.18 + version: 18.3.12 '@types/react-dom': specifier: ~18.3.0 - version: 18.3.5(@types/react@18.3.18) + version: 18.3.1 '@typespec/compiler': specifier: workspace:~ version: link:../compiler @@ -501,13 +501,13 @@ importers: version: link:../react-components '@vitejs/plugin-react': specifier: ~4.3.4 - version: 4.3.4(vite@6.0.11(@types/node@22.10.7)(jiti@2.4.2)(tsx@4.19.2)(yaml@2.7.0)) + version: 4.3.4(vite@6.0.11(@types/node@22.10.10)(jiti@1.21.6)(tsx@4.19.2)(yaml@2.7.0)) '@vitest/coverage-v8': - specifier: ^3.0.3 - version: 3.0.3(vitest@3.0.3(@types/node@22.10.7)(@vitest/ui@3.0.3)(happy-dom@16.7.2)(jiti@2.4.2)(jsdom@26.0.0)(tsx@4.19.2)(yaml@2.7.0)) + specifier: ^3.0.4 + version: 3.0.4(vitest@3.0.4(@types/debug@4.1.12)(@types/node@22.10.10)(@vitest/ui@3.0.4)(happy-dom@16.7.2)(jiti@1.21.6)(jsdom@19.0.0)(tsx@4.19.2)(yaml@2.7.0)) '@vitest/ui': specifier: ^3.0.3 - version: 3.0.3(vitest@3.0.3) + version: 3.0.4(vitest@3.0.4) c8: specifier: ^10.1.3 version: 10.1.3 @@ -519,22 +519,22 @@ importers: version: 5.7.3 vite: specifier: ^6.0.11 - version: 6.0.11(@types/node@22.10.7)(jiti@2.4.2)(tsx@4.19.2)(yaml@2.7.0) + version: 6.0.11(@types/node@22.10.10)(jiti@1.21.6)(tsx@4.19.2)(yaml@2.7.0) vite-plugin-checker: specifier: ^0.8.0 - version: 0.8.0(eslint@9.18.0(jiti@2.4.2))(optionator@0.9.4)(typescript@5.7.3)(vite@6.0.11(@types/node@22.10.7)(jiti@2.4.2)(tsx@4.19.2)(yaml@2.7.0)) + version: 0.8.0(eslint@9.18.0(jiti@1.21.6))(optionator@0.9.4)(typescript@5.7.3)(vite@6.0.11(@types/node@22.10.10)(jiti@1.21.6)(tsx@4.19.2)(yaml@2.7.0)) vite-plugin-dts: specifier: 4.5.0 - version: 4.5.0(@types/node@22.10.7)(rollup@4.31.0)(typescript@5.7.3)(vite@6.0.11(@types/node@22.10.7)(jiti@2.4.2)(tsx@4.19.2)(yaml@2.7.0)) + version: 4.5.0(@types/node@22.10.10)(rollup@4.31.0)(typescript@5.7.3)(vite@6.0.11(@types/node@22.10.10)(jiti@1.21.6)(tsx@4.19.2)(yaml@2.7.0)) vitest: - specifier: ^3.0.3 - version: 3.0.3(@types/node@22.10.7)(@vitest/ui@3.0.3)(happy-dom@16.7.2)(jiti@2.4.2)(jsdom@26.0.0)(tsx@4.19.2)(yaml@2.7.0) + specifier: ^3.0.4 + version: 3.0.4(@types/debug@4.1.12)(@types/node@22.10.10)(@vitest/ui@3.0.4)(happy-dom@16.7.2)(jiti@1.21.6)(jsdom@19.0.0)(tsx@4.19.2)(yaml@2.7.0) packages/http: devDependencies: '@types/node': - specifier: ~22.10.7 - version: 22.10.7 + specifier: ~22.10.10 + version: 22.10.10 '@typespec/compiler': specifier: workspace:~ version: link:../compiler @@ -548,11 +548,11 @@ importers: specifier: workspace:~ version: link:../tspd '@vitest/coverage-v8': - specifier: ^3.0.3 - version: 3.0.3(vitest@3.0.3(@types/node@22.10.7)(@vitest/ui@3.0.3)(happy-dom@16.7.2)(jiti@2.4.2)(jsdom@26.0.0)(tsx@4.19.2)(yaml@2.7.0)) + specifier: ^3.0.4 + version: 3.0.4(vitest@3.0.4(@types/debug@4.1.12)(@types/node@22.10.10)(@vitest/ui@3.0.4)(happy-dom@16.7.2)(jiti@1.21.6)(jsdom@19.0.0)(tsx@4.19.2)(yaml@2.7.0)) '@vitest/ui': specifier: ^3.0.3 - version: 3.0.3(vitest@3.0.3) + version: 3.0.4(vitest@3.0.4) c8: specifier: ^10.1.3 version: 10.1.3 @@ -563,21 +563,33 @@ importers: specifier: ~5.7.3 version: 5.7.3 vitest: - specifier: ^3.0.3 - version: 3.0.3(@types/node@22.10.7)(@vitest/ui@3.0.3)(happy-dom@16.7.2)(jiti@2.4.2)(jsdom@26.0.0)(tsx@4.19.2)(yaml@2.7.0) + specifier: ^3.0.4 + version: 3.0.4(@types/debug@4.1.12)(@types/node@22.10.10)(@vitest/ui@3.0.4)(happy-dom@16.7.2)(jiti@1.21.6)(jsdom@19.0.0)(tsx@4.19.2)(yaml@2.7.0) packages/http-server-csharp: dependencies: - '@typespec/versioning': - specifier: workspace:~ - version: link:../versioning change-case: specifier: ~5.4.4 version: 5.4.4 + cross-spawn: + specifier: ^7.0.6 + version: 7.0.6 + picocolors: + specifier: ~1.1.1 + version: 1.1.1 + yargs: + specifier: ~17.7.2 + version: 17.7.2 devDependencies: + '@types/cross-spawn': + specifier: ~6.0.6 + version: 6.0.6 '@types/node': - specifier: ~22.10.7 - version: 22.10.7 + specifier: ~22.10.10 + version: 22.10.10 + '@types/yargs': + specifier: ~17.0.33 + version: 17.0.33 '@typespec/compiler': specifier: workspace:~ version: link:../compiler @@ -596,12 +608,15 @@ importers: '@typespec/tspd': specifier: workspace:~ version: link:../tspd + '@typespec/versioning': + specifier: workspace:~ + version: link:../versioning '@vitest/coverage-v8': - specifier: ^3.0.3 - version: 3.0.3(vitest@3.0.3(@types/node@22.10.7)(@vitest/ui@3.0.3)(happy-dom@16.7.2)(jiti@2.4.2)(jsdom@26.0.0)(tsx@4.19.2)(yaml@2.7.0)) + specifier: ^3.0.4 + version: 3.0.4(vitest@3.0.4(@types/debug@4.1.12)(@types/node@22.10.10)(@vitest/ui@3.0.4)(happy-dom@16.7.2)(jiti@1.21.6)(jsdom@19.0.0)(tsx@4.19.2)(yaml@2.7.0)) '@vitest/ui': specifier: ^3.0.3 - version: 3.0.3(vitest@3.0.3) + version: 3.0.4(vitest@3.0.4) c8: specifier: ^10.1.3 version: 10.1.3 @@ -612,8 +627,8 @@ importers: specifier: ~5.7.3 version: 5.7.3 vitest: - specifier: ^3.0.3 - version: 3.0.3(@types/node@22.10.7)(@vitest/ui@3.0.3)(happy-dom@16.7.2)(jiti@2.4.2)(jsdom@26.0.0)(tsx@4.19.2)(yaml@2.7.0) + specifier: ^3.0.4 + version: 3.0.4(@types/debug@4.1.12)(@types/node@22.10.10)(@vitest/ui@3.0.4)(happy-dom@16.7.2)(jiti@1.21.6)(jsdom@19.0.0)(tsx@4.19.2)(yaml@2.7.0) packages/http-server-javascript: dependencies: @@ -622,8 +637,8 @@ importers: version: 3.4.2 devDependencies: '@types/node': - specifier: ~22.10.7 - version: 22.10.7 + specifier: ~22.10.10 + version: 22.10.10 '@typespec/compiler': specifier: workspace:~ version: link:../compiler @@ -631,11 +646,11 @@ importers: specifier: workspace:~ version: link:../http '@vitest/coverage-v8': - specifier: ^3.0.3 - version: 3.0.3(vitest@3.0.3(@types/node@22.10.7)(@vitest/ui@3.0.3)(happy-dom@16.7.2)(jiti@2.4.2)(jsdom@26.0.0)(tsx@4.19.2)(yaml@2.7.0)) + specifier: ^3.0.4 + version: 3.0.4(vitest@3.0.4(@types/debug@4.1.12)(@types/node@22.10.10)(@vitest/ui@3.0.4)(happy-dom@16.7.2)(jiti@1.21.6)(jsdom@19.0.0)(tsx@4.19.2)(yaml@2.7.0)) '@vitest/ui': specifier: ^3.0.3 - version: 3.0.3(vitest@3.0.3) + version: 3.0.4(vitest@3.0.4) tsx: specifier: ^4.19.2 version: 4.19.2 @@ -643,8 +658,8 @@ importers: specifier: ~5.7.3 version: 5.7.3 vitest: - specifier: ^3.0.3 - version: 3.0.3(@types/node@22.10.7)(@vitest/ui@3.0.3)(happy-dom@16.7.2)(jiti@2.4.2)(jsdom@26.0.0)(tsx@4.19.2)(yaml@2.7.0) + specifier: ^3.0.4 + version: 3.0.4(@types/debug@4.1.12)(@types/node@22.10.10)(@vitest/ui@3.0.4)(happy-dom@16.7.2)(jiti@1.21.6)(jsdom@19.0.0)(tsx@4.19.2)(yaml@2.7.0) packages/http-specs: dependencies: @@ -674,8 +689,8 @@ importers: specifier: ^1.4.10 version: 1.4.12 '@types/node': - specifier: ~22.10.7 - version: 22.10.7 + specifier: ~22.10.10 + version: 22.10.10 '@typespec/openapi': specifier: workspace:~ version: link:../openapi @@ -696,7 +711,7 @@ importers: dependencies: '@pnpm/find-workspace-packages': specifier: ^6.0.9 - version: 6.0.9(@pnpm/logger@1000.0.0) + version: 6.0.9(@pnpm/logger@5.2.0) cspell: specifier: ^8.17.2 version: 8.17.2 @@ -711,8 +726,8 @@ importers: version: 17.7.2 devDependencies: '@types/node': - specifier: ~22.10.7 - version: 22.10.7 + specifier: ~22.10.10 + version: 22.10.10 '@types/semver': specifier: ^7.5.8 version: 7.5.8 @@ -720,11 +735,11 @@ importers: specifier: ~17.0.33 version: 17.0.33 '@vitest/coverage-v8': - specifier: ^3.0.3 - version: 3.0.3(vitest@3.0.3(@types/node@22.10.7)(@vitest/ui@3.0.3)(happy-dom@16.7.2)(jiti@2.4.2)(jsdom@26.0.0)(tsx@4.19.2)(yaml@2.7.0)) + specifier: ^3.0.4 + version: 3.0.4(vitest@3.0.4(@types/debug@4.1.12)(@types/node@22.10.10)(@vitest/ui@3.0.4)(happy-dom@16.7.2)(jiti@1.21.6)(jsdom@19.0.0)(tsx@4.19.2)(yaml@2.7.0)) '@vitest/ui': specifier: ^3.0.3 - version: 3.0.3(vitest@3.0.3) + version: 3.0.4(vitest@3.0.4) c8: specifier: ^10.1.3 version: 10.1.3 @@ -738,8 +753,8 @@ importers: specifier: ~5.7.3 version: 5.7.3 vitest: - specifier: ^3.0.3 - version: 3.0.3(@types/node@22.10.7)(@vitest/ui@3.0.3)(happy-dom@16.7.2)(jiti@2.4.2)(jsdom@26.0.0)(tsx@4.19.2)(yaml@2.7.0) + specifier: ^3.0.4 + version: 3.0.4(@types/debug@4.1.12)(@types/node@22.10.10)(@vitest/ui@3.0.4)(happy-dom@16.7.2)(jiti@1.21.6)(jsdom@19.0.0)(tsx@4.19.2)(yaml@2.7.0) packages/json-schema: dependencies: @@ -748,8 +763,8 @@ importers: version: 2.7.0 devDependencies: '@types/node': - specifier: ~22.10.7 - version: 22.10.7 + specifier: ~22.10.10 + version: 22.10.10 '@typespec/compiler': specifier: workspace:~ version: link:../compiler @@ -763,11 +778,11 @@ importers: specifier: workspace:~ version: link:../tspd '@vitest/coverage-v8': - specifier: ^3.0.3 - version: 3.0.3(vitest@3.0.3(@types/node@22.10.7)(@vitest/ui@3.0.3)(happy-dom@16.7.2)(jiti@2.4.2)(jsdom@26.0.0)(tsx@4.19.2)(yaml@2.7.0)) + specifier: ^3.0.4 + version: 3.0.4(vitest@3.0.4(@types/debug@4.1.12)(@types/node@22.10.10)(@vitest/ui@3.0.4)(happy-dom@16.7.2)(jiti@1.21.6)(jsdom@19.0.0)(tsx@4.19.2)(yaml@2.7.0)) '@vitest/ui': specifier: ^3.0.3 - version: 3.0.3(vitest@3.0.3) + version: 3.0.4(vitest@3.0.4) ajv: specifier: ~8.17.1 version: 8.17.1 @@ -784,23 +799,23 @@ importers: specifier: ~5.7.3 version: 5.7.3 vitest: - specifier: ^3.0.3 - version: 3.0.3(@types/node@22.10.7)(@vitest/ui@3.0.3)(happy-dom@16.7.2)(jiti@2.4.2)(jsdom@26.0.0)(tsx@4.19.2)(yaml@2.7.0) + specifier: ^3.0.4 + version: 3.0.4(@types/debug@4.1.12)(@types/node@22.10.10)(@vitest/ui@3.0.4)(happy-dom@16.7.2)(jiti@1.21.6)(jsdom@19.0.0)(tsx@4.19.2)(yaml@2.7.0) packages/library-linter: devDependencies: '@types/node': - specifier: ~22.10.7 - version: 22.10.7 + specifier: ~22.10.10 + version: 22.10.10 '@typespec/compiler': specifier: workspace:~ version: link:../compiler '@vitest/coverage-v8': - specifier: ^3.0.3 - version: 3.0.3(vitest@3.0.3(@types/node@22.10.7)(@vitest/ui@3.0.3)(happy-dom@16.7.2)(jiti@2.4.2)(jsdom@26.0.0)(tsx@4.19.2)(yaml@2.7.0)) + specifier: ^3.0.4 + version: 3.0.4(vitest@3.0.4(@types/debug@4.1.12)(@types/node@22.10.10)(@vitest/ui@3.0.4)(happy-dom@16.7.2)(jiti@1.21.6)(jsdom@19.0.0)(tsx@4.19.2)(yaml@2.7.0)) '@vitest/ui': specifier: ^3.0.3 - version: 3.0.3(vitest@3.0.3) + version: 3.0.4(vitest@3.0.4) c8: specifier: ^10.1.3 version: 10.1.3 @@ -811,8 +826,8 @@ importers: specifier: ~5.7.3 version: 5.7.3 vitest: - specifier: ^3.0.3 - version: 3.0.3(@types/node@22.10.7)(@vitest/ui@3.0.3)(happy-dom@16.7.2)(jiti@2.4.2)(jsdom@26.0.0)(tsx@4.19.2)(yaml@2.7.0) + specifier: ^3.0.4 + version: 3.0.4(@types/debug@4.1.12)(@types/node@22.10.10)(@vitest/ui@3.0.4)(happy-dom@16.7.2)(jiti@1.21.6)(jsdom@19.0.0)(tsx@4.19.2)(yaml@2.7.0) packages/monarch: dependencies: @@ -821,14 +836,14 @@ importers: version: 0.52.2 devDependencies: '@types/node': - specifier: ~22.10.7 - version: 22.10.7 + specifier: ~22.10.10 + version: 22.10.10 '@vitest/coverage-v8': - specifier: ^3.0.3 - version: 3.0.3(vitest@3.0.3(@types/node@22.10.7)(@vitest/ui@3.0.3)(happy-dom@16.7.2)(jiti@2.4.2)(jsdom@26.0.0)(tsx@4.19.2)(yaml@2.7.0)) + specifier: ^3.0.4 + version: 3.0.4(vitest@3.0.4(@types/debug@4.1.12)(@types/node@22.10.10)(@vitest/ui@3.0.4)(happy-dom@16.7.2)(jiti@1.21.6)(jsdom@19.0.0)(tsx@4.19.2)(yaml@2.7.0)) '@vitest/ui': specifier: ^3.0.3 - version: 3.0.3(vitest@3.0.3) + version: 3.0.4(vitest@3.0.4) c8: specifier: ^10.1.3 version: 10.1.3 @@ -842,14 +857,14 @@ importers: specifier: ~5.7.3 version: 5.7.3 vitest: - specifier: ^3.0.3 - version: 3.0.3(@types/node@22.10.7)(@vitest/ui@3.0.3)(happy-dom@16.7.2)(jiti@2.4.2)(jsdom@26.0.0)(tsx@4.19.2)(yaml@2.7.0) + specifier: ^3.0.4 + version: 3.0.4(@types/debug@4.1.12)(@types/node@22.10.10)(@vitest/ui@3.0.4)(happy-dom@16.7.2)(jiti@1.21.6)(jsdom@19.0.0)(tsx@4.19.2)(yaml@2.7.0) packages/openapi: devDependencies: '@types/node': - specifier: ~22.10.7 - version: 22.10.7 + specifier: ~22.10.10 + version: 22.10.10 '@typespec/compiler': specifier: workspace:~ version: link:../compiler @@ -866,11 +881,11 @@ importers: specifier: workspace:~ version: link:../tspd '@vitest/coverage-v8': - specifier: ^3.0.3 - version: 3.0.3(vitest@3.0.3(@types/node@22.10.7)(@vitest/ui@3.0.3)(happy-dom@16.7.2)(jiti@2.4.2)(jsdom@26.0.0)(tsx@4.19.2)(yaml@2.7.0)) + specifier: ^3.0.4 + version: 3.0.4(vitest@3.0.4(@types/debug@4.1.12)(@types/node@22.10.10)(@vitest/ui@3.0.4)(happy-dom@16.7.2)(jiti@1.21.6)(jsdom@19.0.0)(tsx@4.19.2)(yaml@2.7.0)) '@vitest/ui': specifier: ^3.0.3 - version: 3.0.3(vitest@3.0.3) + version: 3.0.4(vitest@3.0.4) c8: specifier: ^10.1.3 version: 10.1.3 @@ -881,8 +896,8 @@ importers: specifier: ~5.7.3 version: 5.7.3 vitest: - specifier: ^3.0.3 - version: 3.0.3(@types/node@22.10.7)(@vitest/ui@3.0.3)(happy-dom@16.7.2)(jiti@2.4.2)(jsdom@26.0.0)(tsx@4.19.2)(yaml@2.7.0) + specifier: ^3.0.4 + version: 3.0.4(@types/debug@4.1.12)(@types/node@22.10.10)(@vitest/ui@3.0.4)(happy-dom@16.7.2)(jiti@1.21.6)(jsdom@19.0.0)(tsx@4.19.2)(yaml@2.7.0) packages/openapi3: dependencies: @@ -897,8 +912,8 @@ importers: version: 2.7.0 devDependencies: '@types/node': - specifier: ~22.10.7 - version: 22.10.7 + specifier: ~22.10.10 + version: 22.10.10 '@types/yargs': specifier: ~17.0.33 version: 17.0.33 @@ -930,11 +945,11 @@ importers: specifier: workspace:~ version: link:../xml '@vitest/coverage-v8': - specifier: ^3.0.3 - version: 3.0.3(vitest@3.0.3(@types/node@22.10.7)(@vitest/ui@3.0.3)(happy-dom@16.7.2)(jiti@2.4.2)(jsdom@26.0.0)(tsx@4.19.2)(yaml@2.7.0)) + specifier: ^3.0.4 + version: 3.0.4(vitest@3.0.4(@types/debug@4.1.12)(@types/node@22.10.10)(@vitest/ui@3.0.4)(happy-dom@16.7.2)(jiti@1.21.6)(jsdom@19.0.0)(tsx@4.19.2)(yaml@2.7.0)) '@vitest/ui': specifier: ^3.0.3 - version: 3.0.3(vitest@3.0.3) + version: 3.0.4(vitest@3.0.4) c8: specifier: ^10.1.3 version: 10.1.3 @@ -948,14 +963,14 @@ importers: specifier: ~5.7.3 version: 5.7.3 vitest: - specifier: ^3.0.3 - version: 3.0.3(@types/node@22.10.7)(@vitest/ui@3.0.3)(happy-dom@16.7.2)(jiti@2.4.2)(jsdom@26.0.0)(tsx@4.19.2)(yaml@2.7.0) + specifier: ^3.0.4 + version: 3.0.4(@types/debug@4.1.12)(@types/node@22.10.10)(@vitest/ui@3.0.4)(happy-dom@16.7.2)(jiti@1.21.6)(jsdom@19.0.0)(tsx@4.19.2)(yaml@2.7.0) packages/playground: dependencies: '@fluentui/react-components': specifier: ~9.57.0 - version: 9.57.0(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) + version: 9.57.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) '@fluentui/react-icons': specifier: ^2.0.271 version: 2.0.271(react@18.3.1) @@ -1022,37 +1037,37 @@ importers: version: 7.26.0 '@playwright/test': specifier: ^1.49.1 - version: 1.49.1 + version: 1.50.0 '@storybook/addon-actions': specifier: ^8.5.0 - version: 8.5.0(storybook@8.5.0(prettier@3.4.2)) + version: 8.5.1(storybook@8.5.1(prettier@3.4.2)) '@storybook/cli': specifier: ^8.5.0 - version: 8.5.0(@babel/preset-env@7.26.0(@babel/core@7.26.0))(prettier@3.4.2) + version: 8.5.1(@babel/preset-env@7.26.0(@babel/core@7.26.0))(prettier@3.4.2) '@storybook/react': specifier: ^8.5.0 - version: 8.5.0(@storybook/test@8.5.0(storybook@8.5.0(prettier@3.4.2)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.5.0(prettier@3.4.2))(typescript@5.7.3) + version: 8.5.1(@storybook/test@8.5.1(storybook@8.5.1(prettier@3.4.2)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.5.1(prettier@3.4.2))(typescript@5.7.3) '@storybook/react-vite': specifier: ^8.5.0 - version: 8.5.0(@storybook/test@8.5.0(storybook@8.5.0(prettier@3.4.2)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.31.0)(storybook@8.5.0(prettier@3.4.2))(typescript@5.7.3)(vite@6.0.11(@types/node@22.10.7)(jiti@2.4.2)(tsx@4.19.2)(yaml@2.7.0)) + version: 8.5.1(@storybook/test@8.5.1(storybook@8.5.1(prettier@3.4.2)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.31.0)(storybook@8.5.1(prettier@3.4.2))(typescript@5.7.3)(vite@6.0.11(@types/node@22.10.10)(jiti@1.21.6)(tsx@4.19.2)(yaml@2.7.0)) '@storybook/test': specifier: ^8.5.0 - version: 8.5.0(storybook@8.5.0(prettier@3.4.2)) + version: 8.5.1(storybook@8.5.1(prettier@3.4.2)) '@storybook/types': specifier: ^8.5.0 - version: 8.5.0(storybook@8.5.0(prettier@3.4.2)) + version: 8.5.1(storybook@8.5.1(prettier@3.4.2)) '@types/debounce': specifier: ~1.2.4 version: 1.2.4 '@types/node': - specifier: ~22.10.7 - version: 22.10.7 + specifier: ~22.10.10 + version: 22.10.10 '@types/react': specifier: ~18.3.11 - version: 18.3.18 + version: 18.3.12 '@types/react-dom': specifier: ~18.3.0 - version: 18.3.5(@types/react@18.3.18) + version: 18.3.1 '@types/swagger-ui-dist': specifier: ~3.30.5 version: 3.30.5 @@ -1061,7 +1076,7 @@ importers: version: link:../react-components '@vitejs/plugin-react': specifier: ~4.3.4 - version: 4.3.4(vite@6.0.11(@types/node@22.10.7)(jiti@2.4.2)(tsx@4.19.2)(yaml@2.7.0)) + version: 4.3.4(vite@6.0.11(@types/node@22.10.10)(jiti@1.21.6)(tsx@4.19.2)(yaml@2.7.0)) c8: specifier: ^10.1.3 version: 10.1.3 @@ -1079,19 +1094,19 @@ importers: version: 5.7.3 vite: specifier: ^6.0.11 - version: 6.0.11(@types/node@22.10.7)(jiti@2.4.2)(tsx@4.19.2)(yaml@2.7.0) + version: 6.0.11(@types/node@22.10.10)(jiti@1.21.6)(tsx@4.19.2)(yaml@2.7.0) vite-plugin-checker: specifier: ^0.8.0 - version: 0.8.0(eslint@9.18.0(jiti@2.4.2))(optionator@0.9.4)(typescript@5.7.3)(vite@6.0.11(@types/node@22.10.7)(jiti@2.4.2)(tsx@4.19.2)(yaml@2.7.0)) + version: 0.8.0(eslint@9.18.0(jiti@1.21.6))(optionator@0.9.4)(typescript@5.7.3)(vite@6.0.11(@types/node@22.10.10)(jiti@1.21.6)(tsx@4.19.2)(yaml@2.7.0)) vite-plugin-dts: specifier: 4.5.0 - version: 4.5.0(@types/node@22.10.7)(rollup@4.31.0)(typescript@5.7.3)(vite@6.0.11(@types/node@22.10.7)(jiti@2.4.2)(tsx@4.19.2)(yaml@2.7.0)) + version: 4.5.0(@types/node@22.10.10)(rollup@4.31.0)(typescript@5.7.3)(vite@6.0.11(@types/node@22.10.10)(jiti@1.21.6)(tsx@4.19.2)(yaml@2.7.0)) packages/playground-website: dependencies: '@fluentui/react-components': specifier: ~9.57.0 - version: 9.57.0(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) + version: 9.57.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) '@fluentui/react-icons': specifier: ^2.0.271 version: 2.0.271(react@18.3.1) @@ -1152,31 +1167,31 @@ importers: version: 7.26.0 '@playwright/test': specifier: ^1.49.1 - version: 1.49.1 + version: 1.50.0 '@types/debounce': specifier: ~1.2.4 version: 1.2.4 '@types/node': - specifier: ~22.10.7 - version: 22.10.7 + specifier: ~22.10.10 + version: 22.10.10 '@types/react': specifier: ~18.3.11 - version: 18.3.18 + version: 18.3.12 '@types/react-dom': specifier: ~18.3.0 - version: 18.3.5(@types/react@18.3.18) + version: 18.3.1 '@types/swagger-ui': specifier: ~3.52.4 version: 3.52.4 '@vitejs/plugin-react': specifier: ~4.3.4 - version: 4.3.4(vite@6.0.11(@types/node@22.10.7)(jiti@2.4.2)(tsx@4.19.2)(yaml@2.7.0)) + version: 4.3.4(vite@6.0.11(@types/node@22.10.10)(jiti@1.21.6)(tsx@4.19.2)(yaml@2.7.0)) '@vitest/coverage-v8': - specifier: ^3.0.3 - version: 3.0.3(vitest@3.0.3(@types/node@22.10.7)(@vitest/ui@3.0.3)(happy-dom@16.7.2)(jiti@2.4.2)(jsdom@26.0.0)(tsx@4.19.2)(yaml@2.7.0)) + specifier: ^3.0.4 + version: 3.0.4(vitest@3.0.4(@types/debug@4.1.12)(@types/node@22.10.10)(@vitest/ui@3.0.4)(happy-dom@16.7.2)(jiti@1.21.6)(jsdom@19.0.0)(tsx@4.19.2)(yaml@2.7.0)) '@vitest/ui': specifier: ^3.0.3 - version: 3.0.3(vitest@3.0.3) + version: 3.0.4(vitest@3.0.4) c8: specifier: ^10.1.3 version: 10.1.3 @@ -1194,13 +1209,13 @@ importers: version: 5.7.3 vite: specifier: ^6.0.11 - version: 6.0.11(@types/node@22.10.7)(jiti@2.4.2)(tsx@4.19.2)(yaml@2.7.0) + version: 6.0.11(@types/node@22.10.10)(jiti@1.21.6)(tsx@4.19.2)(yaml@2.7.0) vite-plugin-dts: specifier: 4.5.0 - version: 4.5.0(@types/node@22.10.7)(rollup@4.31.0)(typescript@5.7.3)(vite@6.0.11(@types/node@22.10.7)(jiti@2.4.2)(tsx@4.19.2)(yaml@2.7.0)) + version: 4.5.0(@types/node@22.10.10)(rollup@4.31.0)(typescript@5.7.3)(vite@6.0.11(@types/node@22.10.10)(jiti@1.21.6)(tsx@4.19.2)(yaml@2.7.0)) vitest: - specifier: ^3.0.3 - version: 3.0.3(@types/node@22.10.7)(@vitest/ui@3.0.3)(happy-dom@16.7.2)(jiti@2.4.2)(jsdom@26.0.0)(tsx@4.19.2)(yaml@2.7.0) + specifier: ^3.0.4 + version: 3.0.4(@types/debug@4.1.12)(@types/node@22.10.10)(@vitest/ui@3.0.4)(happy-dom@16.7.2)(jiti@1.21.6)(jsdom@19.0.0)(tsx@4.19.2)(yaml@2.7.0) packages/prettier-plugin-typespec: dependencies: @@ -1230,8 +1245,8 @@ importers: specifier: ~4.31.0 version: 4.31.0 vitest: - specifier: ^3.0.3 - version: 3.0.3(@types/node@22.10.7)(@vitest/ui@3.0.3)(happy-dom@16.7.2)(jiti@2.4.2)(jsdom@26.0.0)(tsx@4.19.2)(yaml@2.7.0) + specifier: ^3.0.4 + version: 3.0.4(@types/debug@4.1.12)(@types/node@22.10.10)(@vitest/ui@3.0.4)(happy-dom@16.7.2)(jiti@1.21.6)(jsdom@19.0.0)(tsx@4.19.2)(yaml@2.7.0) packages/protobuf: devDependencies: @@ -1239,8 +1254,8 @@ importers: specifier: ^4.0.9 version: 4.0.9 '@types/node': - specifier: ~22.10.7 - version: 22.10.7 + specifier: ~22.10.10 + version: 22.10.10 '@typespec/compiler': specifier: workspace:~ version: link:../compiler @@ -1248,11 +1263,11 @@ importers: specifier: workspace:~ version: link:../tspd '@vitest/coverage-v8': - specifier: ^3.0.3 - version: 3.0.3(vitest@3.0.3(@types/node@22.10.7)(@vitest/ui@3.0.3)(happy-dom@16.7.2)(jiti@2.4.2)(jsdom@26.0.0)(tsx@4.19.2)(yaml@2.7.0)) + specifier: ^3.0.4 + version: 3.0.4(vitest@3.0.4(@types/debug@4.1.12)(@types/node@22.10.10)(@vitest/ui@3.0.4)(happy-dom@16.7.2)(jiti@1.21.6)(jsdom@19.0.0)(tsx@4.19.2)(yaml@2.7.0)) '@vitest/ui': specifier: ^3.0.3 - version: 3.0.3(vitest@3.0.3) + version: 3.0.4(vitest@3.0.4) c8: specifier: ^10.1.3 version: 10.1.3 @@ -1266,14 +1281,14 @@ importers: specifier: ~5.7.3 version: 5.7.3 vitest: - specifier: ^3.0.3 - version: 3.0.3(@types/node@22.10.7)(@vitest/ui@3.0.3)(happy-dom@16.7.2)(jiti@2.4.2)(jsdom@26.0.0)(tsx@4.19.2)(yaml@2.7.0) + specifier: ^3.0.4 + version: 3.0.4(@types/debug@4.1.12)(@types/node@22.10.10)(@vitest/ui@3.0.4)(happy-dom@16.7.2)(jiti@1.21.6)(jsdom@19.0.0)(tsx@4.19.2)(yaml@2.7.0) packages/react-components: dependencies: '@fluentui/react-components': specifier: ~9.57.0 - version: 9.57.0(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) + version: 9.57.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) '@fluentui/react-icons': specifier: ^2.0.271 version: 2.0.271(react@18.3.1) @@ -1295,25 +1310,25 @@ importers: version: 6.6.3 '@testing-library/react': specifier: ^16.2.0 - version: 16.2.0(@testing-library/dom@10.4.0)(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 16.2.0(@testing-library/dom@10.4.0)(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@types/node': - specifier: ~22.10.7 - version: 22.10.7 + specifier: ~22.10.10 + version: 22.10.10 '@types/react': specifier: ~18.3.11 - version: 18.3.18 + version: 18.3.12 '@types/react-dom': specifier: ~18.3.0 - version: 18.3.5(@types/react@18.3.18) + version: 18.3.1 '@vitejs/plugin-react': specifier: ~4.3.4 - version: 4.3.4(vite@6.0.11(@types/node@22.10.7)(jiti@2.4.2)(tsx@4.19.2)(yaml@2.7.0)) + version: 4.3.4(vite@6.0.11(@types/node@22.10.10)(jiti@1.21.6)(tsx@4.19.2)(yaml@2.7.0)) '@vitest/coverage-v8': - specifier: ^3.0.3 - version: 3.0.3(vitest@3.0.3(@types/node@22.10.7)(@vitest/ui@3.0.3)(happy-dom@16.7.2)(jiti@2.4.2)(jsdom@26.0.0)(tsx@4.19.2)(yaml@2.7.0)) + specifier: ^3.0.4 + version: 3.0.4(vitest@3.0.4(@types/debug@4.1.12)(@types/node@22.10.10)(@vitest/ui@3.0.4)(happy-dom@16.7.2)(jiti@1.21.6)(jsdom@19.0.0)(tsx@4.19.2)(yaml@2.7.0)) '@vitest/ui': specifier: ^3.0.3 - version: 3.0.3(vitest@3.0.3) + version: 3.0.4(vitest@3.0.4) c8: specifier: ^10.1.3 version: 10.1.3 @@ -1325,22 +1340,22 @@ importers: version: 5.7.3 vite: specifier: ^6.0.11 - version: 6.0.11(@types/node@22.10.7)(jiti@2.4.2)(tsx@4.19.2)(yaml@2.7.0) + version: 6.0.11(@types/node@22.10.10)(jiti@1.21.6)(tsx@4.19.2)(yaml@2.7.0) vite-plugin-checker: specifier: ^0.8.0 - version: 0.8.0(eslint@9.18.0(jiti@2.4.2))(optionator@0.9.4)(typescript@5.7.3)(vite@6.0.11(@types/node@22.10.7)(jiti@2.4.2)(tsx@4.19.2)(yaml@2.7.0)) + version: 0.8.0(eslint@9.18.0(jiti@1.21.6))(optionator@0.9.4)(typescript@5.7.3)(vite@6.0.11(@types/node@22.10.10)(jiti@1.21.6)(tsx@4.19.2)(yaml@2.7.0)) vite-plugin-dts: specifier: 4.5.0 - version: 4.5.0(@types/node@22.10.7)(rollup@4.31.0)(typescript@5.7.3)(vite@6.0.11(@types/node@22.10.7)(jiti@2.4.2)(tsx@4.19.2)(yaml@2.7.0)) + version: 4.5.0(@types/node@22.10.10)(rollup@4.31.0)(typescript@5.7.3)(vite@6.0.11(@types/node@22.10.10)(jiti@1.21.6)(tsx@4.19.2)(yaml@2.7.0)) vitest: - specifier: ^3.0.3 - version: 3.0.3(@types/node@22.10.7)(@vitest/ui@3.0.3)(happy-dom@16.7.2)(jiti@2.4.2)(jsdom@26.0.0)(tsx@4.19.2)(yaml@2.7.0) + specifier: ^3.0.4 + version: 3.0.4(@types/debug@4.1.12)(@types/node@22.10.10)(@vitest/ui@3.0.4)(happy-dom@16.7.2)(jiti@1.21.6)(jsdom@19.0.0)(tsx@4.19.2)(yaml@2.7.0) packages/rest: devDependencies: '@types/node': - specifier: ~22.10.7 - version: 22.10.7 + specifier: ~22.10.10 + version: 22.10.10 '@typespec/compiler': specifier: workspace:~ version: link:../compiler @@ -1354,11 +1369,11 @@ importers: specifier: workspace:~ version: link:../tspd '@vitest/coverage-v8': - specifier: ^3.0.3 - version: 3.0.3(vitest@3.0.3(@types/node@22.10.7)(@vitest/ui@3.0.3)(happy-dom@16.7.2)(jiti@2.4.2)(jsdom@26.0.0)(tsx@4.19.2)(yaml@2.7.0)) + specifier: ^3.0.4 + version: 3.0.4(vitest@3.0.4(@types/debug@4.1.12)(@types/node@22.10.10)(@vitest/ui@3.0.4)(happy-dom@16.7.2)(jiti@1.21.6)(jsdom@19.0.0)(tsx@4.19.2)(yaml@2.7.0)) '@vitest/ui': specifier: ^3.0.3 - version: 3.0.3(vitest@3.0.3) + version: 3.0.4(vitest@3.0.4) c8: specifier: ^10.1.3 version: 10.1.3 @@ -1369,8 +1384,8 @@ importers: specifier: ~5.7.3 version: 5.7.3 vitest: - specifier: ^3.0.3 - version: 3.0.3(@types/node@22.10.7)(@vitest/ui@3.0.3)(happy-dom@16.7.2)(jiti@2.4.2)(jsdom@26.0.0)(tsx@4.19.2)(yaml@2.7.0) + specifier: ^3.0.4 + version: 3.0.4(@types/debug@4.1.12)(@types/node@22.10.10)(@vitest/ui@3.0.4)(happy-dom@16.7.2)(jiti@1.21.6)(jsdom@19.0.0)(tsx@4.19.2)(yaml@2.7.0) packages/samples: dependencies: @@ -1389,6 +1404,9 @@ importers: '@typespec/http': specifier: workspace:~ version: link:../http + '@typespec/http-server-csharp': + specifier: workspace:~ + version: link:../http-server-csharp '@typespec/http-server-javascript': specifier: workspace:~ version: link:../http-server-javascript @@ -1418,17 +1436,17 @@ importers: version: link:../versioning devDependencies: '@types/node': - specifier: ~22.10.7 - version: 22.10.7 + specifier: ~22.10.10 + version: 22.10.10 '@typespec/internal-build-utils': specifier: workspace:~ version: link:../internal-build-utils '@vitest/coverage-v8': - specifier: ^3.0.3 - version: 3.0.3(vitest@3.0.3(@types/node@22.10.7)(@vitest/ui@3.0.3)(happy-dom@16.7.2)(jiti@2.4.2)(jsdom@26.0.0)(tsx@4.19.2)(yaml@2.7.0)) + specifier: ^3.0.4 + version: 3.0.4(vitest@3.0.4(@types/debug@4.1.12)(@types/node@22.10.10)(@vitest/ui@3.0.4)(happy-dom@16.7.2)(jiti@1.21.6)(jsdom@19.0.0)(tsx@4.19.2)(yaml@2.7.0)) '@vitest/ui': specifier: ^3.0.3 - version: 3.0.3(vitest@3.0.3) + version: 3.0.4(vitest@3.0.4) autorest: specifier: ~3.7.1 version: 3.7.1 @@ -1442,14 +1460,14 @@ importers: specifier: ~5.7.3 version: 5.7.3 vitest: - specifier: ^3.0.3 - version: 3.0.3(@types/node@22.10.7)(@vitest/ui@3.0.3)(happy-dom@16.7.2)(jiti@2.4.2)(jsdom@26.0.0)(tsx@4.19.2)(yaml@2.7.0) + specifier: ^3.0.4 + version: 3.0.4(@types/debug@4.1.12)(@types/node@22.10.10)(@vitest/ui@3.0.4)(happy-dom@16.7.2)(jiti@1.21.6)(jsdom@19.0.0)(tsx@4.19.2)(yaml@2.7.0) packages/spec: devDependencies: '@types/node': - specifier: ~22.10.7 - version: 22.10.7 + specifier: ~22.10.10 + version: 22.10.10 '@typespec/internal-build-utils': specifier: workspace:~ version: link:../internal-build-utils @@ -1509,8 +1527,8 @@ importers: specifier: ^1.4.10 version: 1.4.12 '@types/node': - specifier: ~22.10.7 - version: 22.10.7 + specifier: ~22.10.10 + version: 22.10.10 '@types/xml2js': specifier: ^0.4.11 version: 0.4.14 @@ -1518,11 +1536,11 @@ importers: specifier: ~17.0.33 version: 17.0.33 '@vitest/coverage-v8': - specifier: ^3.0.3 - version: 3.0.3(vitest@3.0.3(@types/node@22.10.7)(@vitest/ui@3.0.3)(happy-dom@16.7.2)(jiti@2.4.2)(jsdom@26.0.0)(tsx@4.19.2)(yaml@2.7.0)) + specifier: ^3.0.4 + version: 3.0.4(vitest@3.0.4(@types/debug@4.1.12)(@types/node@22.10.10)(@vitest/ui@3.0.4)(happy-dom@16.7.2)(jiti@1.21.6)(jsdom@19.0.0)(tsx@4.19.2)(yaml@2.7.0)) '@vitest/ui': specifier: ^3.0.3 - version: 3.0.3(vitest@3.0.3) + version: 3.0.4(vitest@3.0.4) rimraf: specifier: ~6.0.1 version: 6.0.1 @@ -1530,8 +1548,8 @@ importers: specifier: ~5.7.3 version: 5.7.3 vitest: - specifier: ^3.0.3 - version: 3.0.3(@types/node@22.10.7)(@vitest/ui@3.0.3)(happy-dom@16.7.2)(jiti@2.4.2)(jsdom@26.0.0)(tsx@4.19.2)(yaml@2.7.0) + specifier: ^3.0.4 + version: 3.0.4(@types/debug@4.1.12)(@types/node@22.10.10)(@vitest/ui@3.0.4)(happy-dom@16.7.2)(jiti@1.21.6)(jsdom@19.0.0)(tsx@4.19.2)(yaml@2.7.0) packages/spec-coverage-sdk: dependencies: @@ -1542,8 +1560,8 @@ importers: specifier: ~12.26.0 version: 12.26.0 '@types/node': - specifier: ~22.10.7 - version: 22.10.7 + specifier: ~22.10.10 + version: 22.10.10 devDependencies: rimraf: specifier: ~6.0.1 @@ -1556,10 +1574,10 @@ importers: dependencies: '@emotion/react': specifier: ^11.14.0 - version: 11.14.0(@types/react@18.3.18)(react@18.3.1) + version: 11.14.0(@types/react@18.3.12)(react@18.3.1) '@fluentui/react-components': specifier: ~9.57.0 - version: 9.57.0(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) + version: 9.57.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) '@fluentui/react-icons': specifier: ^2.0.271 version: 2.0.271(react@18.3.1) @@ -1574,17 +1592,17 @@ importers: version: 18.3.1(react@18.3.1) react-markdown: specifier: ^9.0.3 - version: 9.0.3(@types/react@18.3.18)(react@18.3.1) + version: 9.0.3(@types/react@18.3.12)(react@18.3.1) devDependencies: '@types/react': specifier: ~18.3.11 - version: 18.3.18 + version: 18.3.12 '@types/react-dom': specifier: ~18.3.0 - version: 18.3.5(@types/react@18.3.18) + version: 18.3.1 '@vitejs/plugin-react': specifier: ~4.3.4 - version: 4.3.4(vite@6.0.11(@types/node@22.10.7)(jiti@2.4.2)(tsx@4.19.2)(yaml@2.7.0)) + version: 4.3.4(vite@6.0.11(@types/node@22.10.10)(jiti@1.21.6)(tsx@4.19.2)(yaml@2.7.0)) rimraf: specifier: ~6.0.1 version: 6.0.1 @@ -1596,7 +1614,13 @@ importers: version: 5.7.3 vite: specifier: ^6.0.11 - version: 6.0.11(@types/node@22.10.7)(jiti@2.4.2)(tsx@4.19.2)(yaml@2.7.0) + version: 6.0.11(@types/node@22.10.10)(jiti@1.21.6)(tsx@4.19.2)(yaml@2.7.0) + vite-plugin-checker: + specifier: ^0.8.0 + version: 0.8.0(eslint@9.18.0(jiti@1.21.6))(optionator@0.9.4)(typescript@5.7.3)(vite@6.0.11(@types/node@22.10.10)(jiti@1.21.6)(tsx@4.19.2)(yaml@2.7.0)) + vite-plugin-dts: + specifier: 4.5.0 + version: 4.5.0(@types/node@22.10.10)(rollup@4.31.0)(typescript@5.7.3)(vite@6.0.11(@types/node@22.10.10)(jiti@1.21.6)(tsx@4.19.2)(yaml@2.7.0)) packages/spector: dependencies: @@ -1695,8 +1719,8 @@ importers: specifier: ^1.4.10 version: 1.4.12 '@types/node': - specifier: ~22.10.7 - version: 22.10.7 + specifier: ~22.10.10 + version: 22.10.10 '@types/node-fetch': specifier: ^2.6.12 version: 2.6.12 @@ -1719,8 +1743,8 @@ importers: packages/sse: devDependencies: '@types/node': - specifier: ~22.10.7 - version: 22.10.7 + specifier: ~22.10.10 + version: 22.10.10 '@typespec/compiler': specifier: workspace:~ version: link:../compiler @@ -1740,11 +1764,11 @@ importers: specifier: workspace:~ version: link:../tspd '@vitest/coverage-v8': - specifier: ^3.0.3 - version: 3.0.3(vitest@3.0.3(@types/node@22.10.7)(@vitest/ui@3.0.3)(happy-dom@16.7.2)(jiti@2.4.2)(jsdom@26.0.0)(tsx@4.19.2)(yaml@2.7.0)) + specifier: ^3.0.4 + version: 3.0.4(vitest@3.0.4(@types/debug@4.1.12)(@types/node@22.10.10)(@vitest/ui@3.0.4)(happy-dom@16.7.2)(jiti@1.21.6)(jsdom@19.0.0)(tsx@4.19.2)(yaml@2.7.0)) '@vitest/ui': specifier: ^3.0.3 - version: 3.0.3(vitest@3.0.3) + version: 3.0.4(vitest@3.0.4) c8: specifier: ^10.1.3 version: 10.1.3 @@ -1755,14 +1779,14 @@ importers: specifier: ~5.7.3 version: 5.7.3 vitest: - specifier: ^3.0.3 - version: 3.0.3(@types/node@22.10.7)(@vitest/ui@3.0.3)(happy-dom@16.7.2)(jiti@2.4.2)(jsdom@26.0.0)(tsx@4.19.2)(yaml@2.7.0) + specifier: ^3.0.4 + version: 3.0.4(@types/debug@4.1.12)(@types/node@22.10.10)(@vitest/ui@3.0.4)(happy-dom@16.7.2)(jiti@1.21.6)(jsdom@19.0.0)(tsx@4.19.2)(yaml@2.7.0) packages/streams: devDependencies: '@types/node': - specifier: ~22.10.7 - version: 22.10.7 + specifier: ~22.10.10 + version: 22.10.10 '@typespec/compiler': specifier: workspace:~ version: link:../compiler @@ -1773,11 +1797,11 @@ importers: specifier: workspace:~ version: link:../tspd '@vitest/coverage-v8': - specifier: ^3.0.3 - version: 3.0.3(vitest@3.0.3(@types/node@22.10.7)(@vitest/ui@3.0.3)(happy-dom@16.7.2)(jiti@2.4.2)(jsdom@26.0.0)(tsx@4.19.2)(yaml@2.7.0)) + specifier: ^3.0.4 + version: 3.0.4(vitest@3.0.4(@types/debug@4.1.12)(@types/node@22.10.10)(@vitest/ui@3.0.4)(happy-dom@16.7.2)(jiti@1.21.6)(jsdom@19.0.0)(tsx@4.19.2)(yaml@2.7.0)) '@vitest/ui': specifier: ^3.0.3 - version: 3.0.3(vitest@3.0.3) + version: 3.0.4(vitest@3.0.4) c8: specifier: ^10.1.3 version: 10.1.3 @@ -1788,8 +1812,8 @@ importers: specifier: ~5.7.3 version: 5.7.3 vitest: - specifier: ^3.0.3 - version: 3.0.3(@types/node@22.10.7)(@vitest/ui@3.0.3)(happy-dom@16.7.2)(jiti@2.4.2)(jsdom@26.0.0)(tsx@4.19.2)(yaml@2.7.0) + specifier: ^3.0.4 + version: 3.0.4(@types/debug@4.1.12)(@types/node@22.10.10)(@vitest/ui@3.0.4)(happy-dom@16.7.2)(jiti@1.21.6)(jsdom@19.0.0)(tsx@4.19.2)(yaml@2.7.0) packages/tmlanguage-generator: dependencies: @@ -1801,8 +1825,8 @@ importers: version: 3.1.0 devDependencies: '@types/node': - specifier: ~22.10.7 - version: 22.10.7 + specifier: ~22.10.10 + version: 22.10.10 '@types/plist': specifier: ~3.0.5 version: 3.0.5 @@ -1832,8 +1856,8 @@ importers: version: 17.7.2 devDependencies: '@types/node': - specifier: ~22.10.7 - version: 22.10.7 + specifier: ~22.10.10 + version: 22.10.10 '@types/yargs': specifier: ~17.0.33 version: 17.0.33 @@ -1841,11 +1865,11 @@ importers: specifier: workspace:~ version: link:../prettier-plugin-typespec '@vitest/coverage-v8': - specifier: ^3.0.3 - version: 3.0.3(vitest@3.0.3(@types/node@22.10.7)(@vitest/ui@3.0.3)(happy-dom@16.7.2)(jiti@2.4.2)(jsdom@26.0.0)(tsx@4.19.2)(yaml@2.7.0)) + specifier: ^3.0.4 + version: 3.0.4(vitest@3.0.4(@types/debug@4.1.12)(@types/node@22.10.10)(@vitest/ui@3.0.4)(happy-dom@16.7.2)(jiti@1.21.6)(jsdom@19.0.0)(tsx@4.19.2)(yaml@2.7.0)) '@vitest/ui': specifier: ^3.0.3 - version: 3.0.3(vitest@3.0.3) + version: 3.0.4(vitest@3.0.4) c8: specifier: ^10.1.3 version: 10.1.3 @@ -1865,8 +1889,8 @@ importers: specifier: ~5.7.3 version: 5.7.3 vitest: - specifier: ^3.0.3 - version: 3.0.3(@types/node@22.10.7)(@vitest/ui@3.0.3)(happy-dom@16.7.2)(jiti@2.4.2)(jsdom@26.0.0)(tsx@4.19.2)(yaml@2.7.0) + specifier: ^3.0.4 + version: 3.0.4(@types/debug@4.1.12)(@types/node@22.10.10)(@vitest/ui@3.0.4)(happy-dom@16.7.2)(jiti@1.21.6)(jsdom@19.0.0)(tsx@4.19.2)(yaml@2.7.0) packages/typespec-vs: devDependencies: @@ -1887,13 +1911,13 @@ importers: version: 16.0.0(rollup@4.31.0) '@rollup/plugin-typescript': specifier: ~12.1.0 - version: 12.1.2(rollup@4.31.0)(tslib@2.8.1)(typescript@5.7.3) + version: 12.1.1(rollup@4.31.0)(tslib@2.8.1)(typescript@5.7.3) '@types/mocha': specifier: ^10.0.9 version: 10.0.10 '@types/node': - specifier: ~22.10.7 - version: 22.10.7 + specifier: ~22.10.10 + version: 22.10.10 '@types/semver': specifier: ^7.5.8 version: 7.5.8 @@ -1907,14 +1931,14 @@ importers: specifier: workspace:~ version: link:../internal-build-utils '@vitest/coverage-v8': - specifier: ^3.0.3 - version: 3.0.3(vitest@3.0.3(@types/node@22.10.7)(@vitest/ui@3.0.3)(happy-dom@16.7.2)(jiti@2.4.2)(jsdom@26.0.0)(tsx@4.19.2)(yaml@2.7.0)) + specifier: ^3.0.4 + version: 3.0.4(vitest@3.0.4(@types/debug@4.1.12)(@types/node@22.10.10)(@vitest/ui@3.0.4)(happy-dom@16.7.2)(jiti@1.21.6)(jsdom@19.0.0)(tsx@4.19.2)(yaml@2.7.0)) '@vitest/ui': specifier: ^3.0.3 - version: 3.0.3(vitest@3.0.3) + version: 3.0.4(vitest@3.0.4) '@vscode/test-web': - specifier: ^0.0.62 - version: 0.0.62 + specifier: ^0.0.65 + version: 0.0.65 '@vscode/vsce': specifier: ~3.2.1 version: 3.2.1 @@ -1937,8 +1961,8 @@ importers: specifier: ~5.7.3 version: 5.7.3 vitest: - specifier: ^3.0.3 - version: 3.0.3(@types/node@22.10.7)(@vitest/ui@3.0.3)(happy-dom@16.7.2)(jiti@2.4.2)(jsdom@26.0.0)(tsx@4.19.2)(yaml@2.7.0) + specifier: ^3.0.4 + version: 3.0.4(@types/debug@4.1.12)(@types/node@22.10.10)(@vitest/ui@3.0.4)(happy-dom@16.7.2)(jiti@1.21.6)(jsdom@19.0.0)(tsx@4.19.2)(yaml@2.7.0) vscode-languageclient: specifier: ~9.0.1 version: 9.0.1 @@ -1949,8 +1973,8 @@ importers: packages/versioning: devDependencies: '@types/node': - specifier: ~22.10.7 - version: 22.10.7 + specifier: ~22.10.10 + version: 22.10.10 '@typespec/compiler': specifier: workspace:~ version: link:../compiler @@ -1961,11 +1985,11 @@ importers: specifier: workspace:~ version: link:../tspd '@vitest/coverage-v8': - specifier: ^3.0.3 - version: 3.0.3(vitest@3.0.3(@types/node@22.10.7)(@vitest/ui@3.0.3)(happy-dom@16.7.2)(jiti@2.4.2)(jsdom@26.0.0)(tsx@4.19.2)(yaml@2.7.0)) + specifier: ^3.0.4 + version: 3.0.4(vitest@3.0.4(@types/debug@4.1.12)(@types/node@22.10.10)(@vitest/ui@3.0.4)(happy-dom@16.7.2)(jiti@1.21.6)(jsdom@19.0.0)(tsx@4.19.2)(yaml@2.7.0)) '@vitest/ui': specifier: ^3.0.3 - version: 3.0.3(vitest@3.0.3) + version: 3.0.4(vitest@3.0.4) c8: specifier: ^10.1.3 version: 10.1.3 @@ -1976,14 +2000,14 @@ importers: specifier: ~5.7.3 version: 5.7.3 vitest: - specifier: ^3.0.3 - version: 3.0.3(@types/node@22.10.7)(@vitest/ui@3.0.3)(happy-dom@16.7.2)(jiti@2.4.2)(jsdom@26.0.0)(tsx@4.19.2)(yaml@2.7.0) + specifier: ^3.0.4 + version: 3.0.4(@types/debug@4.1.12)(@types/node@22.10.10)(@vitest/ui@3.0.4)(happy-dom@16.7.2)(jiti@1.21.6)(jsdom@19.0.0)(tsx@4.19.2)(yaml@2.7.0) packages/xml: devDependencies: '@types/node': - specifier: ~22.10.7 - version: 22.10.7 + specifier: ~22.10.10 + version: 22.10.10 '@typespec/compiler': specifier: workspace:~ version: link:../compiler @@ -1994,11 +2018,11 @@ importers: specifier: workspace:~ version: link:../tspd '@vitest/coverage-v8': - specifier: ^3.0.3 - version: 3.0.3(vitest@3.0.3(@types/node@22.10.7)(@vitest/ui@3.0.3)(happy-dom@16.7.2)(jiti@2.4.2)(jsdom@26.0.0)(tsx@4.19.2)(yaml@2.7.0)) + specifier: ^3.0.4 + version: 3.0.4(vitest@3.0.4(@types/debug@4.1.12)(@types/node@22.10.10)(@vitest/ui@3.0.4)(happy-dom@16.7.2)(jiti@1.21.6)(jsdom@19.0.0)(tsx@4.19.2)(yaml@2.7.0)) '@vitest/ui': specifier: ^3.0.3 - version: 3.0.3(vitest@3.0.3) + version: 3.0.4(vitest@3.0.4) c8: specifier: ^10.1.3 version: 10.1.3 @@ -2009,8 +2033,8 @@ importers: specifier: ~5.7.3 version: 5.7.3 vitest: - specifier: ^3.0.3 - version: 3.0.3(@types/node@22.10.7)(@vitest/ui@3.0.3)(happy-dom@16.7.2)(jiti@2.4.2)(jsdom@26.0.0)(tsx@4.19.2)(yaml@2.7.0) + specifier: ^3.0.4 + version: 3.0.4(@types/debug@4.1.12)(@types/node@22.10.10)(@vitest/ui@3.0.4)(happy-dom@16.7.2)(jiti@1.21.6)(jsdom@19.0.0)(tsx@4.19.2)(yaml@2.7.0) website: dependencies: @@ -2019,28 +2043,28 @@ importers: version: 0.9.4(prettier-plugin-astro@0.14.1)(prettier@3.4.2)(typescript@5.7.3) '@astrojs/react': specifier: ^4.1.6 - version: 4.1.6(@types/node@22.10.7)(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(jiti@2.4.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tsx@4.19.2)(yaml@2.7.0) + version: 4.1.6(@types/node@22.10.10)(@types/react-dom@18.3.1)(@types/react@18.3.12)(jiti@1.21.6)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tsx@4.19.2)(yaml@2.7.0) '@astrojs/starlight': specifier: ^0.31.1 - version: 0.31.1(astro@5.1.8(@azure/identity@4.6.0)(@azure/storage-blob@12.26.0)(@types/node@22.10.7)(jiti@2.4.2)(rollup@4.31.0)(tsx@4.19.2)(typescript@5.7.3)(yaml@2.7.0)) + version: 0.31.1(astro@5.1.8(@azure/identity@4.6.0)(@azure/storage-blob@12.26.0)(@types/node@22.10.10)(jiti@1.21.6)(rollup@4.31.0)(tsx@4.19.2)(typescript@5.7.3)(yaml@2.7.0)) '@astrojs/starlight-tailwind': specifier: ^3.0.0 - version: 3.0.0(@astrojs/starlight@0.31.1(astro@5.1.8(@azure/identity@4.6.0)(@azure/storage-blob@12.26.0)(@types/node@22.10.7)(jiti@2.4.2)(rollup@4.31.0)(tsx@4.19.2)(typescript@5.7.3)(yaml@2.7.0)))(@astrojs/tailwind@5.1.5(astro@5.1.8(@azure/identity@4.6.0)(@azure/storage-blob@12.26.0)(@types/node@22.10.7)(jiti@2.4.2)(rollup@4.31.0)(tsx@4.19.2)(typescript@5.7.3)(yaml@2.7.0))(tailwindcss@3.4.17))(tailwindcss@3.4.17) + version: 3.0.0(@astrojs/starlight@0.31.1(astro@5.1.8(@azure/identity@4.6.0)(@azure/storage-blob@12.26.0)(@types/node@22.10.10)(jiti@1.21.6)(rollup@4.31.0)(tsx@4.19.2)(typescript@5.7.3)(yaml@2.7.0)))(@astrojs/tailwind@5.1.5(astro@5.1.8(@azure/identity@4.6.0)(@azure/storage-blob@12.26.0)(@types/node@22.10.10)(jiti@1.21.6)(rollup@4.31.0)(tsx@4.19.2)(typescript@5.7.3)(yaml@2.7.0))(tailwindcss@3.4.15))(tailwindcss@3.4.15) '@astrojs/tailwind': specifier: ^5.1.5 - version: 5.1.5(astro@5.1.8(@azure/identity@4.6.0)(@azure/storage-blob@12.26.0)(@types/node@22.10.7)(jiti@2.4.2)(rollup@4.31.0)(tsx@4.19.2)(typescript@5.7.3)(yaml@2.7.0))(tailwindcss@3.4.17) + version: 5.1.5(astro@5.1.8(@azure/identity@4.6.0)(@azure/storage-blob@12.26.0)(@types/node@22.10.10)(jiti@1.21.6)(rollup@4.31.0)(tsx@4.19.2)(typescript@5.7.3)(yaml@2.7.0))(tailwindcss@3.4.15) '@docsearch/css': specifier: ^3.7.0 - version: 3.8.3 + version: 3.8.0 '@docsearch/js': specifier: ^3.7.0 - version: 3.8.3(@algolia/client-search@5.20.0)(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3) + version: 3.8.0(@algolia/client-search@5.15.0)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3) '@expressive-code/core': specifier: ^0.40.1 version: 0.40.1 '@fluentui/react-components': specifier: ~9.57.0 - version: 9.57.0(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) + version: 9.57.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) '@fluentui/react-icons': specifier: ^2.0.271 version: 2.0.271(react@18.3.1) @@ -2052,10 +2076,10 @@ importers: version: link:../packages/playground astro: specifier: ^5.1.8 - version: 5.1.8(@azure/identity@4.6.0)(@azure/storage-blob@12.26.0)(@types/node@22.10.7)(jiti@2.4.2)(rollup@4.31.0)(tsx@4.19.2)(typescript@5.7.3)(yaml@2.7.0) + version: 5.1.8(@azure/identity@4.6.0)(@azure/storage-blob@12.26.0)(@types/node@22.10.10)(jiti@1.21.6)(rollup@4.31.0)(tsx@4.19.2)(typescript@5.7.3)(yaml@2.7.0) astro-rehype-relative-markdown-links: specifier: ^0.15.0 - version: 0.15.0(astro@5.1.8(@azure/identity@4.6.0)(@azure/storage-blob@12.26.0)(@types/node@22.10.7)(jiti@2.4.2)(rollup@4.31.0)(tsx@4.19.2)(typescript@5.7.3)(yaml@2.7.0)) + version: 0.15.0(astro@5.1.8(@azure/identity@4.6.0)(@azure/storage-blob@12.26.0)(@types/node@22.10.10)(jiti@1.21.6)(rollup@4.31.0)(tsx@4.19.2)(typescript@5.7.3)(yaml@2.7.0)) clsx: specifier: ^2.1.1 version: 2.1.1 @@ -2067,7 +2091,7 @@ importers: version: 2.0.5 prism-react-renderer: specifier: ^2.4.0 - version: 2.4.1(react@18.3.1) + version: 2.4.0(react@18.3.1) react: specifier: ~18.3.1 version: 18.3.1 @@ -2079,17 +2103,17 @@ importers: version: 0.33.5 tailwindcss: specifier: ^3.4.14 - version: 3.4.17 + version: 3.4.15 typescript: specifier: ~5.7.3 version: 5.7.3 devDependencies: '@types/react': specifier: ~18.3.11 - version: 18.3.18 + version: 18.3.12 '@types/react-dom': specifier: ~18.3.0 - version: 18.3.5(@types/react@18.3.18) + version: 18.3.1 '@types/remark-heading-id': specifier: ^1.0.0 version: 1.0.0 @@ -2126,6 +2150,9 @@ importers: '@typespec/spec': specifier: workspace:* version: link:../packages/spec + '@typespec/spec-dashboard': + specifier: workspace:~ + version: link:../packages/spec-dashboard '@typespec/sse': specifier: workspace:~ version: link:../packages/sse @@ -2143,10 +2170,10 @@ importers: version: link:../packages/xml astro-expressive-code: specifier: ^0.40.1 - version: 0.40.1(astro@5.1.8(@azure/identity@4.6.0)(@azure/storage-blob@12.26.0)(@types/node@22.10.7)(jiti@2.4.2)(rollup@4.31.0)(tsx@4.19.2)(typescript@5.7.3)(yaml@2.7.0)) + version: 0.40.1(astro@5.1.8(@azure/identity@4.6.0)(@azure/storage-blob@12.26.0)(@types/node@22.10.10)(jiti@1.21.6)(rollup@4.31.0)(tsx@4.19.2)(typescript@5.7.3)(yaml@2.7.0)) rehype-mermaid: specifier: ^3.0.0 - version: 3.0.0(playwright@1.49.1) + version: 3.0.0(playwright@1.50.0) remark-heading-id: specifier: ^1.0.1 version: 1.0.1 @@ -2159,76 +2186,76 @@ packages: '@adobe/css-tools@4.4.1': resolution: {integrity: sha512-12WGKBQzjUAI4ayyF4IAtfw2QR/IDoqk6jTddXDhtYTJF9ASmoE1zst7cVtP0aL/F1jUJL5r+JxKXKEgHNbEUQ==} - '@algolia/autocomplete-core@1.17.9': - resolution: {integrity: sha512-O7BxrpLDPJWWHv/DLA9DRFWs+iY1uOJZkqUwjS5HSZAGcl0hIVCQ97LTLewiZmZ402JYUrun+8NqFP+hCknlbQ==} + '@algolia/autocomplete-core@1.17.7': + resolution: {integrity: sha512-BjiPOW6ks90UKl7TwMv7oNQMnzU+t/wk9mgIDi6b1tXpUek7MW0lbNOUHpvam9pe3lVCf4xPFT+lK7s+e+fs7Q==} - '@algolia/autocomplete-plugin-algolia-insights@1.17.9': - resolution: {integrity: sha512-u1fEHkCbWF92DBeB/KHeMacsjsoI0wFhjZtlCq2ddZbAehshbZST6Hs0Avkc0s+4UyBGbMDnSuXHLuvRWK5iDQ==} + '@algolia/autocomplete-plugin-algolia-insights@1.17.7': + resolution: {integrity: sha512-Jca5Ude6yUOuyzjnz57og7Et3aXjbwCSDf/8onLHSQgw1qW3ALl9mrMWaXb5FmPVkV3EtkD2F/+NkT6VHyPu9A==} peerDependencies: search-insights: '>= 1 < 3' - '@algolia/autocomplete-preset-algolia@1.17.9': - resolution: {integrity: sha512-Na1OuceSJeg8j7ZWn5ssMu/Ax3amtOwk76u4h5J4eK2Nx2KB5qt0Z4cOapCsxot9VcEN11ADV5aUSlQF4RhGjQ==} + '@algolia/autocomplete-preset-algolia@1.17.7': + resolution: {integrity: sha512-ggOQ950+nwbWROq2MOCIL71RE0DdQZsceqrg32UqnhDz8FlO9rL8ONHNsI2R1MH0tkgVIDKI/D0sMiUchsFdWA==} peerDependencies: '@algolia/client-search': '>= 4.9.1 < 6' algoliasearch: '>= 4.9.1 < 6' - '@algolia/autocomplete-shared@1.17.9': - resolution: {integrity: sha512-iDf05JDQ7I0b7JEA/9IektxN/80a2MZ1ToohfmNS3rfeuQnIKI3IJlIafD0xu4StbtQTghx9T3Maa97ytkXenQ==} + '@algolia/autocomplete-shared@1.17.7': + resolution: {integrity: sha512-o/1Vurr42U/qskRSuhBH+VKxMvkkUVTLU6WZQr+L5lGZZLYWyhdzWjW0iGXY7EkwRTjBqvN2EsR81yCTGV/kmg==} peerDependencies: '@algolia/client-search': '>= 4.9.1 < 6' algoliasearch: '>= 4.9.1 < 6' - '@algolia/client-abtesting@5.20.0': - resolution: {integrity: sha512-YaEoNc1Xf2Yk6oCfXXkZ4+dIPLulCx8Ivqj0OsdkHWnsI3aOJChY5qsfyHhDBNSOhqn2ilgHWxSfyZrjxBcAww==} + '@algolia/client-abtesting@5.15.0': + resolution: {integrity: sha512-FaEM40iuiv1mAipYyiptP4EyxkJ8qHfowCpEeusdHUC4C7spATJYArD2rX3AxkVeREkDIgYEOuXcwKUbDCr7Nw==} engines: {node: '>= 14.0.0'} - '@algolia/client-analytics@5.20.0': - resolution: {integrity: sha512-CIT9ni0+5sYwqehw+t5cesjho3ugKQjPVy/iPiJvtJX4g8Cdb6je6SPt2uX72cf2ISiXCAX9U3cY0nN0efnRDw==} + '@algolia/client-analytics@5.15.0': + resolution: {integrity: sha512-lho0gTFsQDIdCwyUKTtMuf9nCLwq9jOGlLGIeQGKDxXF7HbiAysFIu5QW/iQr1LzMgDyM9NH7K98KY+BiIFriQ==} engines: {node: '>= 14.0.0'} - '@algolia/client-common@5.20.0': - resolution: {integrity: sha512-iSTFT3IU8KNpbAHcBUJw2HUrPnMXeXLyGajmCL7gIzWOsYM4GabZDHXOFx93WGiXMti1dymz8k8R+bfHv1YZmA==} + '@algolia/client-common@5.15.0': + resolution: {integrity: sha512-IofrVh213VLsDkPoSKMeM9Dshrv28jhDlBDLRcVJQvlL8pzue7PEB1EZ4UoJFYS3NSn7JOcJ/V+olRQzXlJj1w==} engines: {node: '>= 14.0.0'} - '@algolia/client-insights@5.20.0': - resolution: {integrity: sha512-w9RIojD45z1csvW1vZmAko82fqE/Dm+Ovsy2ElTsjFDB0HMAiLh2FO86hMHbEXDPz6GhHKgGNmBRiRP8dDPgJg==} + '@algolia/client-insights@5.15.0': + resolution: {integrity: sha512-bDDEQGfFidDi0UQUCbxXOCdphbVAgbVmxvaV75cypBTQkJ+ABx/Npw7LkFGw1FsoVrttlrrQbwjvUB6mLVKs/w==} engines: {node: '>= 14.0.0'} - '@algolia/client-personalization@5.20.0': - resolution: {integrity: sha512-p/hftHhrbiHaEcxubYOzqVV4gUqYWLpTwK+nl2xN3eTrSW9SNuFlAvUBFqPXSVBqc6J5XL9dNKn3y8OA1KElSQ==} + '@algolia/client-personalization@5.15.0': + resolution: {integrity: sha512-LfaZqLUWxdYFq44QrasCDED5bSYOswpQjSiIL7Q5fYlefAAUO95PzBPKCfUhSwhb4rKxigHfDkd81AvEicIEoA==} engines: {node: '>= 14.0.0'} - '@algolia/client-query-suggestions@5.20.0': - resolution: {integrity: sha512-m4aAuis5vZi7P4gTfiEs6YPrk/9hNTESj3gEmGFgfJw3hO2ubdS4jSId1URd6dGdt0ax2QuapXufcrN58hPUcw==} + '@algolia/client-query-suggestions@5.15.0': + resolution: {integrity: sha512-wu8GVluiZ5+il8WIRsGKu8VxMK9dAlr225h878GGtpTL6VBvwyJvAyLdZsfFIpY0iN++jiNb31q2C1PlPL+n/A==} engines: {node: '>= 14.0.0'} - '@algolia/client-search@5.20.0': - resolution: {integrity: sha512-KL1zWTzrlN4MSiaK1ea560iCA/UewMbS4ZsLQRPoDTWyrbDKVbztkPwwv764LAqgXk0fvkNZvJ3IelcK7DqhjQ==} + '@algolia/client-search@5.15.0': + resolution: {integrity: sha512-Z32gEMrRRpEta5UqVQA612sLdoqY3AovvUPClDfMxYrbdDAebmGDVPtSogUba1FZ4pP5dx20D3OV3reogLKsRA==} engines: {node: '>= 14.0.0'} - '@algolia/ingestion@1.20.0': - resolution: {integrity: sha512-shj2lTdzl9un4XJblrgqg54DoK6JeKFO8K8qInMu4XhE2JuB8De6PUuXAQwiRigZupbI0xq8aM0LKdc9+qiLQA==} + '@algolia/ingestion@1.15.0': + resolution: {integrity: sha512-MkqkAxBQxtQ5if/EX2IPqFA7LothghVyvPoRNA/meS2AW2qkHwcxjuiBxv4H6mnAVEPfJlhu9rkdVz9LgCBgJg==} engines: {node: '>= 14.0.0'} - '@algolia/monitoring@1.20.0': - resolution: {integrity: sha512-aF9blPwOhKtWvkjyyXh9P5peqmhCA1XxLBRgItT+K6pbT0q4hBDQrCid+pQZJYy4HFUKjB/NDDwyzFhj/rwKhw==} + '@algolia/monitoring@1.15.0': + resolution: {integrity: sha512-QPrFnnGLMMdRa8t/4bs7XilPYnoUXDY8PMQJ1sf9ZFwhUysYYhQNX34/enoO0LBjpoOY6rLpha39YQEFbzgKyQ==} engines: {node: '>= 14.0.0'} - '@algolia/recommend@5.20.0': - resolution: {integrity: sha512-T6B/WPdZR3b89/F9Vvk6QCbt/wrLAtrGoL8z4qPXDFApQ8MuTFWbleN/4rHn6APWO3ps+BUePIEbue2rY5MlRw==} + '@algolia/recommend@5.15.0': + resolution: {integrity: sha512-5eupMwSqMLDObgSMF0XG958zR6GJP3f7jHDQ3/WlzCM9/YIJiWIUoJFGsko9GYsA5xbLDHE/PhWtq4chcCdaGQ==} engines: {node: '>= 14.0.0'} - '@algolia/requester-browser-xhr@5.20.0': - resolution: {integrity: sha512-t6//lXsq8E85JMenHrI6mhViipUT5riNhEfCcvtRsTV+KIBpC6Od18eK864dmBhoc5MubM0f+sGpKOqJIlBSCg==} + '@algolia/requester-browser-xhr@5.15.0': + resolution: {integrity: sha512-Po/GNib6QKruC3XE+WKP1HwVSfCDaZcXu48kD+gwmtDlqHWKc7Bq9lrS0sNZ456rfCKhXksOmMfUs4wRM/Y96w==} engines: {node: '>= 14.0.0'} - '@algolia/requester-fetch@5.20.0': - resolution: {integrity: sha512-FHxYGqRY+6bgjKsK4aUsTAg6xMs2S21elPe4Y50GB0Y041ihvw41Vlwy2QS6K9ldoftX4JvXodbKTcmuQxywdQ==} + '@algolia/requester-fetch@5.15.0': + resolution: {integrity: sha512-rOZ+c0P7ajmccAvpeeNrUmEKoliYFL8aOR5qGW5pFq3oj3Iept7Y5mEtEsOBYsRt6qLnaXn4zUKf+N8nvJpcIw==} engines: {node: '>= 14.0.0'} - '@algolia/requester-node-http@5.20.0': - resolution: {integrity: sha512-kmtQClq/w3vtPteDSPvaW9SPZL/xrIgMrxZyAgsFwrJk0vJxqyC5/hwHmrCraDnStnGSADnLpBf4SpZnwnkwWw==} + '@algolia/requester-node-http@5.15.0': + resolution: {integrity: sha512-b1jTpbFf9LnQHEJP5ddDJKE2sAlhYd7EVSOWgzo/27n/SfCoHfqD0VWntnWYD83PnOKvfe8auZ2+xCb0TXotrQ==} engines: {node: '>= 14.0.0'} '@alloc/quick-lru@5.2.0': @@ -2248,9 +2275,6 @@ packages: '@apidevtools/swagger-methods@3.0.2': resolution: {integrity: sha512-QAkD5kK2b1WfjDS/UQn/qQkbwF31uqRjPTrsCs5ZG9BQGAkjwvqGFjjPqAuzac/IYzpPtRzjCP1WrTuAIjMrXg==} - '@asamuzakjp/css-color@2.8.3': - resolution: {integrity: sha512-GIc76d9UI1hCvOATjZPyHFmE5qhRccp3/zGfMPapK3jBi+yocEzp6BBB0UnfRYP9NP4FANqUZYb0hnfs3TM3hw==} - '@astrojs/check@0.9.4': resolution: {integrity: sha512-IOheHwCtpUfvogHHsvu0AbeRZEnjJg3MopdLddkJE70mULItS/Vh37BHcI00mcOJcH1vhD3odbpvWokpxam7xA==} hasBin: true @@ -2373,16 +2397,16 @@ packages: resolution: {integrity: sha512-4IXXzcCdLdlXuCG+8UKEwLA1T1NHqUfanhXYHiQTn+6sfWCZXduqbtXDGceg3Ce5QxTGo7EqmbV6Bi+aqKuClQ==} engines: {node: '>=18.0.0'} - '@azure/msal-browser@4.0.1': - resolution: {integrity: sha512-jqiwVJPArnEOUhmc+dvo481OP8b2PMcsu3EtGtxt7sxmKgFtdQyGDCndj+2me62JVG/HEgArEgKyMA7L0aNhdA==} + '@azure/msal-browser@4.0.2': + resolution: {integrity: sha512-bq6PasUpJgBSOSMeSlh8gXh4LZGgAaPoJFNcu5u0zxwueh+I8NpMb9oxlCfS/8CJHyXUhTUAMLSnvThemNdyQw==} engines: {node: '>=0.8.0'} '@azure/msal-common@14.16.0': resolution: {integrity: sha512-1KOZj9IpcDSwpNiQNjt0jDYZpQvNZay7QAEi/5DLubay40iGYtLzya/jbjRPLyOTZhEKyL1MzPuw2HqBCjceYA==} engines: {node: '>=0.8.0'} - '@azure/msal-common@15.0.1': - resolution: {integrity: sha512-JELxEK3Pnc4Rq8u+mI9u6o37auSpSOPCB7jaq7QziOAKi9WliWEmZZORCFHPbwf2xKitpHBXTz/0uerj17NsSQ==} + '@azure/msal-common@15.0.2': + resolution: {integrity: sha512-RQHmI5vOMYLNSO0ER7d/O9TojWWEn4m0YtWbL8mZthkKGQI7ALn5ONHUVTUSxSVYwGYdHGNrwiHAzQhboqwZzQ==} engines: {node: '>=0.8.0'} '@azure/msal-node@2.16.2': @@ -2512,6 +2536,11 @@ packages: engines: {node: '>=6.0.0'} hasBin: true + '@babel/parser@7.26.5': + resolution: {integrity: sha512-SRJ4jYmXRqV1/Xc+TIVG84WjHBXKlxO9sHQnA2Pf12QQEAp1LOh6kDzNHXcUnbH1QI0FDoPPVOt+vyUDucxpaw==} + engines: {node: '>=6.0.0'} + hasBin: true + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9': resolution: {integrity: sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==} engines: {node: '>=6.9.0'} @@ -2953,6 +2982,10 @@ packages: resolution: {integrity: sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==} engines: {node: '>=6.9.0'} + '@babel/types@7.26.5': + resolution: {integrity: sha512-L6mZmwFDK6Cjh1nRCLXpa6no13ZIioJDz7mdkzHv399pThrTa/k0nUlNaenOeh2kWu/iaOQYElEpKPUswUa9Vg==} + engines: {node: '>=6.9.0'} + '@bcoe/v8-coverage@1.0.2': resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} engines: {node: '>=18'} @@ -3208,34 +3241,6 @@ packages: resolution: {integrity: sha512-yy4eYWNX2iutXmy4Igbn/hL/NYaNt94DylohPtgVr0Zxnn/AAArt9Bv1KXPpjB8VFy2wzzPzWmZ+MWDUVpHCbg==} engines: {node: '>=18.0'} - '@csstools/color-helpers@5.0.1': - resolution: {integrity: sha512-MKtmkA0BX87PKaO1NFRTFH+UnkgnmySQOvNxJubsadusqPEC2aJ9MOQiMceZJJ6oitUl/i0L6u0M1IrmAOmgBA==} - engines: {node: '>=18'} - - '@csstools/css-calc@2.1.1': - resolution: {integrity: sha512-rL7kaUnTkL9K+Cvo2pnCieqNpTKgQzy5f+N+5Iuko9HAoasP+xgprVh7KN/MaJVvVL1l0EzQq2MoqBHKSrDrag==} - engines: {node: '>=18'} - peerDependencies: - '@csstools/css-parser-algorithms': ^3.0.4 - '@csstools/css-tokenizer': ^3.0.3 - - '@csstools/css-color-parser@3.0.7': - resolution: {integrity: sha512-nkMp2mTICw32uE5NN+EsJ4f5N+IGFeCFu4bGpiKgb2Pq/7J/MpyLBeQ5ry4KKtRFZaYs6sTmcMYrSRIyj5DFKA==} - engines: {node: '>=18'} - peerDependencies: - '@csstools/css-parser-algorithms': ^3.0.4 - '@csstools/css-tokenizer': ^3.0.3 - - '@csstools/css-parser-algorithms@3.0.4': - resolution: {integrity: sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A==} - engines: {node: '>=18'} - peerDependencies: - '@csstools/css-tokenizer': ^3.0.3 - - '@csstools/css-tokenizer@3.0.3': - resolution: {integrity: sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==} - engines: {node: '>=18'} - '@ctrl/tinycolor@4.1.0': resolution: {integrity: sha512-WyOx8cJQ+FQus4Mm4uPIZA64gbk3Wxh0so5Lcii0aJifqwoVOlfFtorjLE0Hen4OYyHZMXDWqMmaQemBhgxFRQ==} engines: {node: '>=14'} @@ -3243,14 +3248,14 @@ packages: '@dabh/diagnostics@2.0.3': resolution: {integrity: sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==} - '@docsearch/css@3.8.3': - resolution: {integrity: sha512-1nELpMV40JDLJ6rpVVFX48R1jsBFIQ6RnEQDsLFGmzOjPWTOMlZqUcXcvRx8VmYV/TqnS1l784Ofz+ZEb+wEOQ==} + '@docsearch/css@3.8.0': + resolution: {integrity: sha512-pieeipSOW4sQ0+bE5UFC51AOZp9NGxg89wAlZ1BAQFaiRAGK1IKUaPQ0UGZeNctJXyqZ1UvBtOQh2HH+U5GtmA==} - '@docsearch/js@3.8.3': - resolution: {integrity: sha512-CQsX1zeoPJIWxN3IGoDSWOqzRc0JsOE9Bclegf9llwjYN2rzzJF93zagGcT3uI3tF31oCqTuUOVGW/mVFb7arw==} + '@docsearch/js@3.8.0': + resolution: {integrity: sha512-PVuV629f5UcYRtBWqK7ID6vNL5647+2ADJypwTjfeBIrJfwPuHtzLy39hMGMfFK+0xgRyhTR0FZ83EkdEraBlg==} - '@docsearch/react@3.8.3': - resolution: {integrity: sha512-6UNrg88K7lJWmuS6zFPL/xgL+n326qXqZ7Ybyy4E8P/6Rcblk3GE8RXxeol4Pd5pFpKMhOhBhzABKKwHtbJCIg==} + '@docsearch/react@3.8.0': + resolution: {integrity: sha512-WnFK720+iwTVt94CxY3u+FgX6exb3BfN5kE9xUY6uuAH/9W/UFboBZFLlrw/zxFRHoHZCOXRtOylsXF+6LHI+Q==} peerDependencies: '@types/react': '>= 16.8.0 < 19.0.0' react: '>= 16.8.0 < 19.0.0' @@ -3652,8 +3657,8 @@ packages: resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/config-array@0.19.0': - resolution: {integrity: sha512-zdHg2FPIFNKPdcHWtiNT+jEFCHYVplAXRDlQDyqy0zGx/q2parwh7brGJSiTxRk/TSMkbM//zt/f5CHgyTyaSQ==} + '@eslint/config-array@0.19.1': + resolution: {integrity: sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/core@0.10.0': @@ -3668,8 +3673,8 @@ packages: resolution: {integrity: sha512-fK6L7rxcq6/z+AaQMtiFTkvbHkBLNlwyRxHpKawP0x3u9+NC6MQTnFW+AdpwC6gfHTW0051cokQgtTN2FqlxQA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/object-schema@2.1.4': - resolution: {integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==} + '@eslint/object-schema@2.1.5': + resolution: {integrity: sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/plugin-kit@0.2.5': @@ -3688,19 +3693,19 @@ packages: '@expressive-code/plugin-text-markers@0.40.1': resolution: {integrity: sha512-LsirF7M4F2yWgrFXEocD74F/MaVXsOsHVsRxBLhXQJemSSkWkDp/EZPt//OaqQ8ExnqWZ2lH7E1/KiN46unKjg==} - '@floating-ui/core@1.6.9': - resolution: {integrity: sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==} + '@floating-ui/core@1.6.8': + resolution: {integrity: sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==} '@floating-ui/devtools@0.2.1': resolution: {integrity: sha512-8PHJLbD6VhBh+LJ1uty/Bz30qs02NXCE5u8WpOhSewlYXUWl03GNXknr9AS2yaAWJEQaY27x7eByJs44gODBcw==} peerDependencies: '@floating-ui/dom': '>=1.5.4' - '@floating-ui/dom@1.6.13': - resolution: {integrity: sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==} + '@floating-ui/dom@1.6.12': + resolution: {integrity: sha512-NP83c0HjokcGVEMeoStg317VD9W7eDlGK7457dMBANbKA6GJZdc7rjujdgqzTaz93jkGgc5P/jeWbaCHnMNc+w==} - '@floating-ui/utils@0.2.9': - resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==} + '@floating-ui/utils@0.2.8': + resolution: {integrity: sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==} '@fluentui/keyboard-keys@9.0.8': resolution: {integrity: sha512-iUSJUUHAyTosnXK8O2Ilbfxma+ZyZPMua5vB028Ys96z80v+LFwntoehlFsdH3rMuPsA8GaC1RE7LMezwPBPdw==} @@ -3780,14 +3785,6 @@ packages: react: '>=16.14.0 <19.0.0' react-dom: '>=16.14.0 <19.0.0' - '@fluentui/react-checkbox@9.2.45': - resolution: {integrity: sha512-BLv1HkT3J81ToDflc1AqgBr3H4tZeelDZH5gJLKqKn3wJb5AyZt98Dq8ROwHUh/SAYftaUa3FEnNc4FpaoaHFA==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - '@fluentui/react-checkbox@9.2.46': resolution: {integrity: sha512-FCt6lC+ruYIadBD9NVzEB+LqAOJ4R8Mbb4LRfHow6YORftj4kJxw0RtCSViNuP9Yvo2DJ/2I6v0SYyeZewod6w==} peerDependencies: @@ -3812,15 +3809,6 @@ packages: react: '>=16.14.0 <19.0.0' react-dom: '>=16.14.0 <19.0.0' - '@fluentui/react-context-selector@9.1.71': - resolution: {integrity: sha512-rBm3+e/RPERRdW8xbL7+JgUHApNkoVOXoRfzva4qWF4dOudmDytPobzNNAyNXQXSbFZoeBYiCQ62OZf7wVpE5A==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - scheduler: '>=0.19.0 <=0.23.0' - '@fluentui/react-context-selector@9.1.72': resolution: {integrity: sha512-n9M7o81fuIzKuvrzdOK9Rcc+SyYg9hkr0bXhdclTHWKBYw2RgIEzXuld1qL3+gOFcSYS6AoNKpqrd9mithWYpw==} peerDependencies: @@ -3854,14 +3842,6 @@ packages: react: '>=16.14.0 <19.0.0' react-dom: '>=16.14.0 <19.0.0' - '@fluentui/react-field@9.1.84': - resolution: {integrity: sha512-lj8fnwz4IcTNe4xIZnURZ59ppmQnESiOmqso2anuxEUUEJ4bYoBVMJnhyl80BI84Lme6F+aqxHt1oOrExZ7i+g==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - '@fluentui/react-field@9.1.85': resolution: {integrity: sha512-fWcS8b6zVARot9ZBzlg49jN0/3lPSUhi++e5saVBsE5J1RtpwiQ0Qo0pXcIkS4Y6ztXaZqIDazfJquJ6M9vPoA==} peerDependencies: @@ -3907,8 +3887,8 @@ packages: react: '>=16.14.0 <19.0.0' react-dom: '>=16.14.0 <19.0.0' - '@fluentui/react-jsx-runtime@9.0.49': - resolution: {integrity: sha512-/ALjAanMoC+kLsQvbK1u5YncXa36OvFiLtPqQMKwagMHIHIFwdVYYkAR34hhqzDQniv05kOfHVTrzDzsi25pxw==} + '@fluentui/react-jsx-runtime@9.0.46': + resolution: {integrity: sha512-hdzwiRPnFQ8dqmqj/Xtep7SP2I+mx+OFsP5glzdDhTFL6au5yBbnUTgI6XEiSAbisBAhl2V2qsp0mJ55gxU+sg==} peerDependencies: '@types/react': '>=16.14.0 <19.0.0' react: '>=16.14.0 <19.0.0' @@ -3919,14 +3899,6 @@ packages: '@types/react': '>=16.14.0 <19.0.0' react: '>=16.14.0 <19.0.0' - '@fluentui/react-label@9.1.82': - resolution: {integrity: sha512-H74Mn1VPB98Hd/kjATAT6+uezxPC95dzQd9zl9SPN/EefZFrJ1Ck0tx0TV/YU6pJSHz43B2fequd8XdEOFWa0w==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - '@fluentui/react-label@9.1.83': resolution: {integrity: sha512-XJF78Vwn4sSRJUyWcTj/F6hJVcHlPozDBcGWipMpnFgKBljuVmE2sg581CUGKn4AOTa9/blc81DLv0AE3itNtQ==} peerDependencies: @@ -4150,14 +4122,6 @@ packages: react: '>=16.14.0 <19.0.0' react-dom: '>=16.14.0 <19.0.0' - '@fluentui/react-tabster@9.23.2': - resolution: {integrity: sha512-DG1rZy8dkD24urQQywhRPfo13qEALCHUWSBmuAYnZ9wAHkGRbDVgdGZLEEUkvP5a6PxdDsFD5AGnC4C+56gKOg==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - '@fluentui/react-tabster@9.23.3': resolution: {integrity: sha512-sGLePr6QmUbYq/rGkaE6MUTRCFucY5HphKEvWoB8ec32btQmAsMlv9YT5BzJ+YQ2Byc39mm1Uthz/Pw5H+tCpA==} peerDependencies: @@ -4241,12 +4205,6 @@ packages: react: '>=16.14.0 <19.0.0' react-dom: '>=16.14.0 <19.0.0' - '@fluentui/react-utilities@9.18.19': - resolution: {integrity: sha512-cBYq2cRc+ofVv4DTgULX5ez6IN/DiZw8IC17giA7NyxGw9ed0Y2p7nqnz/tIa655tY/ZIw5oz+bRJrEPkpzA2g==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - '@fluentui/react-utilities@9.18.20': resolution: {integrity: sha512-4uIgf4e4yP1HWAQapFQKNN88+L88NqbzXyQPf+NWE9lmP5xRyyMePKRX7i4PcJFdSt7lN4BYvwUxJ7DkQ/Npnw==} peerDependencies: @@ -4271,8 +4229,8 @@ packages: '@gerrit0/mini-shiki@1.27.2': resolution: {integrity: sha512-GeWyHz8ao2gBiUW4OJnQDxXQnFgZQwwQk05t/CVVgNBN7/rK8XZ7xY6YhLVv9tH3VppWWmr9DCl3MwemB/i+Og==} - '@griffel/core@1.19.0': - resolution: {integrity: sha512-EIvRNjDDnXNRwIollidVbnuOGkutfgYr4fBEFZnbKo8PSCswm13p8COKLGJ2cL1cxw87JvAoquOESrjI7hDnVA==} + '@griffel/core@1.18.2': + resolution: {integrity: sha512-odJspTMohsYZLSlO/oKsf6El6px1vg1461CpPverOzS9f0xaUKh/ZGenW+MjyyZ3aQ6adkPzcr/my6JFH/zdXQ==} '@griffel/react@1.5.27': resolution: {integrity: sha512-985A8iEBo++h9u96dbj3Kj5hdsBWbpkkwFpy0W8EGL0VRCzZmpb0AlWuq9pDJZACS6eZ2GAb/f9CqgVAgnTnOg==} @@ -4446,6 +4404,10 @@ packages: resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} engines: {node: '>=6.0.0'} + '@jridgewell/gen-mapping@0.3.8': + resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} + engines: {node: '>=6.0.0'} + '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} @@ -4539,65 +4501,58 @@ packages: resolution: {integrity: sha512-cJXiUlycdizQwvqE1iaAb4VRUM3RX09/8q46zjvy+ct9GhfZRWd7jXYVc1tn/CfRlGPVkX/u4sstRlepsm7hfw==} engines: {node: ^18.17.0 || >=20.5.0} - '@octokit/app@15.1.1': - resolution: {integrity: sha512-fk8xrCSPTJGpyBdBNI+DcZ224dm0aApv4vi6X7/zTmANXlegKV2Td+dJ+fd7APPaPN7R+xttUsj2Fm+AFDSfMQ==} + '@octokit/app@15.1.2': + resolution: {integrity: sha512-6aKmKvqnJKoVK+kx0mLlBMKmQYoziPw4Rd/PWr0j65QVQlrDXlu6hGU8fmTXt7tNkf/DsubdIaTT4fkoWzCh5g==} engines: {node: '>= 18'} - '@octokit/auth-app@7.1.3': - resolution: {integrity: sha512-GZdkOp2kZTIy5dG9oXqvzUAZiPvDx4C/lMlN6yQjtG9d/+hYa7W8WXTJoOrXE8UdfL9A/sZMl206dmtkl9lwVQ==} + '@octokit/auth-app@7.1.4': + resolution: {integrity: sha512-5F+3l/maq9JfWQ4bV28jT2G/K8eu9OJ317yzXPTGe4Kw+lKDhFaS4dQ3Ltmb6xImKxfCQdqDqMXODhc9YLipLw==} engines: {node: '>= 18'} - '@octokit/auth-oauth-app@8.1.1': - resolution: {integrity: sha512-5UtmxXAvU2wfcHIPPDWzVSAWXVJzG3NWsxb7zCFplCWEmMCArSZV0UQu5jw5goLQXbFyOr5onzEH37UJB3zQQg==} + '@octokit/auth-oauth-app@8.1.2': + resolution: {integrity: sha512-3woNZgq5/S6RS+9ZTq+JdymxVr7E0s4EYxF20ugQvgX3pomdPUL5r/XdTY9wALoBM2eHVy4ettr5fKpatyTyHw==} engines: {node: '>= 18'} - '@octokit/auth-oauth-device@7.1.1': - resolution: {integrity: sha512-HWl8lYueHonuyjrKKIup/1tiy0xcmQCdq5ikvMO1YwkNNkxb6DXfrPjrMYItNLyCP/o2H87WuijuE+SlBTT8eg==} + '@octokit/auth-oauth-device@7.1.2': + resolution: {integrity: sha512-gTOIzDeV36OhVfxCl69FmvJix7tJIiU6dlxuzLVAzle7fYfO8UDyddr9B+o4CFQVaMBLMGZ9ak2CWMYcGeZnPw==} engines: {node: '>= 18'} - '@octokit/auth-oauth-user@5.1.1': - resolution: {integrity: sha512-rRkMz0ErOppdvEfnemHJXgZ9vTPhBuC6yASeFaB7I2yLMd7QpjfrL1mnvRPlyKo+M6eeLxrKanXJ9Qte29SRsw==} + '@octokit/auth-oauth-user@5.1.2': + resolution: {integrity: sha512-PgVDDPJgZYb3qSEXK4moksA23tfn68zwSAsQKZ1uH6IV9IaNEYx35OXXI80STQaLYnmEE86AgU0tC1YkM4WjsA==} engines: {node: '>= 18'} '@octokit/auth-token@5.1.1': resolution: {integrity: sha512-rh3G3wDO8J9wSjfI436JUKzHIxq8NaiL0tVeB2aXmG6p/9859aUOAjA9pmSPNGGZxfwmaJ9ozOJImuNVJdpvbA==} engines: {node: '>= 18'} - '@octokit/auth-unauthenticated@6.1.0': - resolution: {integrity: sha512-zPSmfrUAcspZH/lOFQnVnvjQZsIvmfApQH6GzJrkIunDooU1Su2qt2FfMTSVPRp7WLTQyC20Kd55lF+mIYaohQ==} + '@octokit/auth-unauthenticated@6.1.1': + resolution: {integrity: sha512-bGXqdN6RhSFHvpPq46SL8sN+F3odQ6oMNLWc875IgoqcC3qus+fOL2th6Tkl94wvdSTy8/OeHzWy/lZebmnhog==} engines: {node: '>= 18'} '@octokit/core@6.1.3': resolution: {integrity: sha512-z+j7DixNnfpdToYsOutStDgeRzJSMnbj8T1C/oQjB6Aa+kRfNjs/Fn7W6c8bmlt6mfy3FkgeKBRnDjxQow5dow==} engines: {node: '>= 18'} - '@octokit/endpoint@10.1.1': - resolution: {integrity: sha512-JYjh5rMOwXMJyUpj028cu0Gbp7qe/ihxfJMLc8VZBMMqSwLgOxDI1911gV4Enl1QSavAQNJcwmwBF9M0VvLh6Q==} - engines: {node: '>= 18'} - - '@octokit/graphql@8.1.1': - resolution: {integrity: sha512-ukiRmuHTi6ebQx/HFRCXKbDlOh/7xEV6QUXaE7MJEKGNAncGI/STSbOkl12qVXZrfZdpXctx5O9X1AIaebiDBg==} + '@octokit/endpoint@10.1.2': + resolution: {integrity: sha512-XybpFv9Ms4hX5OCHMZqyODYqGTZ3H6K6Vva+M9LR7ib/xr1y1ZnlChYv9H680y77Vd/i/k+thXApeRASBQkzhA==} engines: {node: '>= 18'} '@octokit/graphql@8.1.2': resolution: {integrity: sha512-bdlj/CJVjpaz06NBpfHhp4kGJaRZfz7AzC+6EwUImRtrwIw8dIgJ63Xg0OzV9pRn3rIzrt5c2sa++BL0JJ8GLw==} engines: {node: '>= 18'} - '@octokit/oauth-app@7.1.3': - resolution: {integrity: sha512-EHXbOpBkSGVVGF1W+NLMmsnSsJRkcrnVmDKt0TQYRBb6xWfWzoi9sBD4DIqZ8jGhOWO/V8t4fqFyJ4vDQDn9bg==} + '@octokit/oauth-app@7.1.5': + resolution: {integrity: sha512-/Y2MiwWDlGUK4blKKfjJiwjzu/FzwKTTTfTZAAQ0QbdBIDEGJPWhOFH6muSN86zaa4tNheB4YS3oWIR2e4ydzA==} engines: {node: '>= 18'} '@octokit/oauth-authorization-url@7.1.1': resolution: {integrity: sha512-ooXV8GBSabSWyhLUowlMIVd9l1s2nsOGQdlP2SQ4LnkEsGXzeCvbSbCPdZThXhEFzleGPwbapT0Sb+YhXRyjCA==} engines: {node: '>= 18'} - '@octokit/oauth-methods@5.1.2': - resolution: {integrity: sha512-C5lglRD+sBlbrhCUTxgJAFjWgJlmTx5bQ7Ch0+2uqRjYv7Cfb5xpX4WuSC9UgQna3sqRGBL9EImX9PvTpMaQ7g==} + '@octokit/oauth-methods@5.1.3': + resolution: {integrity: sha512-M+bDBi5H8FnH0xhCTg0m9hvcnppdDnxUqbZyOkxlLblKpLAR+eT2nbDPvJDp0eLrvJWA1I8OX0KHf/sBMQARRA==} engines: {node: '>= 18'} - '@octokit/openapi-types@22.2.0': - resolution: {integrity: sha512-QBhVjcUa9W7Wwhm6DBFu6ZZ+1/t/oYxqc2tp81Pi41YNuJinbFRx8B133qVOrAaBbF7D/m0Et6f9/pZt9Rc+tg==} - '@octokit/openapi-types@23.0.1': resolution: {integrity: sha512-izFjMJ1sir0jn0ldEKhZ7xegCTj/ObmEDlEfpFrx4k/JyZSMRHbO3/rBwgE7f3m2DHt+RrNGIVw4wSmwnm3t/g==} @@ -4610,8 +4565,8 @@ packages: peerDependencies: '@octokit/core': '>=6' - '@octokit/plugin-paginate-rest@11.3.5': - resolution: {integrity: sha512-cgwIRtKrpwhLoBi0CUNuY83DPGRMaWVjqVI/bGKsLJ4PzyWZNaEmhHroI2xlrVXkk6nFv0IsZpOp+ZWSWUS2AQ==} + '@octokit/plugin-paginate-rest@11.4.0': + resolution: {integrity: sha512-ttpGck5AYWkwMkMazNCZMqxKqIq1fJBNxBfsFwwfyYKTf914jKkLF0POMS3YkPBwp5g1c2Y4L79gDz01GhSr1g==} engines: {node: '>= 18'} peerDependencies: '@octokit/core': '>=6' @@ -4628,41 +4583,30 @@ packages: peerDependencies: '@octokit/core': '>=6' - '@octokit/plugin-retry@7.1.2': - resolution: {integrity: sha512-XOWnPpH2kJ5VTwozsxGurw+svB2e61aWlmk5EVIYZPwFK5F9h4cyPyj9CIKRyMXMHSwpIsI3mPOdpMmrRhe7UQ==} + '@octokit/plugin-retry@7.1.3': + resolution: {integrity: sha512-8nKOXvYWnzv89gSyIvgFHmCBAxfQAOPRlkacUHL9r5oWtp5Whxl8Skb2n3ACZd+X6cYijD6uvmrQuPH/UCL5zQ==} engines: {node: '>= 18'} peerDependencies: '@octokit/core': '>=6' - '@octokit/plugin-throttling@9.3.2': - resolution: {integrity: sha512-FqpvcTpIWFpMMwIeSoypoJXysSAQ3R+ALJhXXSG1HTP3YZOIeLmcNcimKaXxTcws+Sh6yoRl13SJ5r8sXc1Fhw==} + '@octokit/plugin-throttling@9.4.0': + resolution: {integrity: sha512-IOlXxXhZA4Z3m0EEYtrrACkuHiArHLZ3CvqWwOez/pURNqRuwfoFlTPbN5Muf28pzFuztxPyiUiNwz8KctdZaQ==} engines: {node: '>= 18'} peerDependencies: - '@octokit/core': ^6.0.0 - - '@octokit/request-error@6.1.5': - resolution: {integrity: sha512-IlBTfGX8Yn/oFPMwSfvugfncK2EwRLjzbrpifNaMY8o/HTEAFqCA1FZxjD9cWvSKBHgrIhc4CSBIzMxiLsbzFQ==} - engines: {node: '>= 18'} + '@octokit/core': ^6.1.3 '@octokit/request-error@6.1.6': resolution: {integrity: sha512-pqnVKYo/at0NuOjinrgcQYpEbv4snvP3bKMRqHaD9kIsk9u1LCpb2smHZi8/qJfgeNqLo5hNW4Z7FezNdEo0xg==} engines: {node: '>= 18'} - '@octokit/request@9.1.3': - resolution: {integrity: sha512-V+TFhu5fdF3K58rs1pGUJIDH5RZLbZm5BI+MNF+6o/ssFNT4vWlCh/tVpF3NxGtP15HUxTTMUbsG5llAuU2CZA==} - engines: {node: '>= 18'} - '@octokit/request@9.2.0': resolution: {integrity: sha512-kXLfcxhC4ozCnAXy2ff+cSxpcF0A1UqxjvYMqNuPIeOAzJbVWQ+dy5G2fTylofB/gTbObT8O6JORab+5XtA1Kw==} engines: {node: '>= 18'} - '@octokit/rest@21.0.2': - resolution: {integrity: sha512-+CiLisCoyWmYicH25y1cDfCrv41kRSvTq6pPWtRroRJzhsCZWZyCqGyI8foJT5LmScADSwRAnr/xo+eewL04wQ==} + '@octokit/rest@21.1.0': + resolution: {integrity: sha512-93iLxcKDJboUpmnUyeJ6cRIi7z7cqTZT1K7kRK4LobGxwTwpsa+2tQQbRQNGy7IFDEAmrtkf4F4wBj3D5rVlJQ==} engines: {node: '>= 18'} - '@octokit/types@13.6.1': - resolution: {integrity: sha512-PHZE9Z+kWXb23Ndik8MKPirBPziOc0D2/3KH1P+6jK5nGWe96kadZuE4jev2/Jq7FvIfTlT2Ltg8Fv2x1v0a5g==} - '@octokit/types@13.7.0': resolution: {integrity: sha512-BXfRP+3P3IN6fd4uF3SniaHKOO4UXWBfkdR3vA8mIvaoO/wLjGN5qivUtW0QRitBHHMcfC41SLhNVYIZZE+wkA==} @@ -4670,8 +4614,8 @@ packages: resolution: {integrity: sha512-yFZa3UH11VIxYnnoOYCVoJ3q4ChuSOk2IVBBQ0O3xtKX4x9bmKb/1t+Mxixv2iUhzMdOl1qeWJqEhouXXzB3rQ==} engines: {node: '>= 18'} - '@octokit/webhooks@13.4.1': - resolution: {integrity: sha512-I5YPUtfWidh+OzyrlDahJsUpkpGK0kCTmDRbuqGmlCUzOtxdEkX3R4d6Cd08ijQYwkVXQJanPdbKuZBeV2NMaA==} + '@octokit/webhooks@13.4.2': + resolution: {integrity: sha512-fakbgkCScapQXPxyqx2jZs/Y3jGlyezwUp7ATL7oLAGJ0+SqBKWKstoKZpiQ+REeHutKpYjY9UtxdLSurwl2Tg==} engines: {node: '>= 18'} '@oslojs/encoding@1.1.0': @@ -4713,8 +4657,8 @@ packages: resolution: {integrity: sha512-SnDBEmw0h4XpbHcWR8T0LgLj1Cqn8Cvql+Nahot2zBud945z+MYXH3WVPvMI5U37WsWAgw9Cj7pZ6oL7haKrhg==} engines: {node: '>=18'} - '@playwright/test@1.49.1': - resolution: {integrity: sha512-Ky+BVzPz8pL6PQxHqNRW1k3mIyv933LML7HktS8uik0bUXNCdPhoS/kLihiO1tMf/egaJb4IutXd7UywvXEW+g==} + '@playwright/test@1.50.0': + resolution: {integrity: sha512-ZGNXbt+d65EGjBORQHuYKj+XhCewlwpnSd/EDuLPZGSiEWmgOJB5RmMCCYGy5aMfTs9wx61RivfDKi8H/hcMvw==} engines: {node: '>=18'} hasBin: true @@ -4792,8 +4736,8 @@ packages: resolution: {integrity: sha512-14eYp9iOdJ7SyOIVXomXhbVnc14DEhzMLS3eKqxYxi9LkANUfxx1/pwRiRY/lTiP9RFS+OkIcTm2QiLsmNEctw==} engines: {node: '>=16.14'} - '@pnpm/logger@1000.0.0': - resolution: {integrity: sha512-v5WO9L4pT7ZjZpf7a/a3H3Xj59JPHNMFJwRS7m/01VMWrKjs89CdVIE5e/N6DwuzP750j0iKozTw6UrCVEfQjA==} + '@pnpm/logger@5.2.0': + resolution: {integrity: sha512-dCdSs2wPCweMkRLdISAKBOKSWeq/9iS9aanWgjoUkFs06KN2o5XGFg53oCXg/KbZhF9AXS3vMHPwTebzCeAEsA==} engines: {node: '>=18.12'} '@pnpm/manifest-utils@5.0.1': @@ -4935,8 +4879,8 @@ packages: rollup: optional: true - '@rollup/plugin-typescript@12.1.2': - resolution: {integrity: sha512-cdtSp154H5sv637uMr1a8OTWB0L1SWDSm1rDGiyfcGcvQ6cuTs4MDk2BVEBGysUWago4OJN4EQZqOTl/QY3Jgg==} + '@rollup/plugin-typescript@12.1.1': + resolution: {integrity: sha512-t7O653DpfB5MbFrqPe/VcKFFkvRuFNp9qId3xq4Eth5xlyymzxNpye2z8Hrl0RIMuXTSr5GGcFpkdlMeacUiFQ==} engines: {node: '>=14.0.0'} peerDependencies: rollup: ^2.14.0||^3.0.0||^4.0.0 @@ -5127,9 +5071,9 @@ packages: resolution: {integrity: sha512-nYxaSb/MtlSI+JWcwTHQxyNmWeWrUXJJ/G4liLrGG7+tS4vAz6LF3xRXqLH6wPIVUoZQel2Fs4ddLx4NCpiIYg==} engines: {node: ^18.17.0 || >=20.5.0} - '@sigstore/protobuf-specs@0.3.2': - resolution: {integrity: sha512-c6B0ehIWxMI8wiS/bj6rHMPqeFvngFV7cDU/MY+B16P9Z3Mp9k8L93eYZ7BYzSickzuqAQqAq0V956b3Ju6mLw==} - engines: {node: ^16.14.0 || >=18.0.0} + '@sigstore/protobuf-specs@0.3.3': + resolution: {integrity: sha512-RpacQhBlwpBWd7KEJsRKcBQalbV28fvkxwTOJIqhIuDysMMaJW47V4OqW30iJB9uRpqOSxxEAQFdr8tTattReQ==} + engines: {node: ^18.17.0 || >=20.5.0} '@sigstore/sign@3.0.0': resolution: {integrity: sha512-UjhDMQOkyDoktpXoc5YPJpJK6IooF2gayAr5LvXI4EL7O0vd58okgfRcxuaH+YTdhvb5aa1Q9f+WJ0c2sVuYIw==} @@ -5147,41 +5091,41 @@ packages: resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} engines: {node: '>=18'} - '@storybook/addon-actions@8.5.0': - resolution: {integrity: sha512-6CW9+17rk5eNx6I8EKqCxRKtsJFTR/lHL+xiJ6/iBWApIm8sg63vhXvUTJ58UixmIkT5oLh0+ESNPh+x10D8fw==} + '@storybook/addon-actions@8.5.1': + resolution: {integrity: sha512-oBBSpOJ6/rCdbdU1JxGCLernaCxALLWDIeZk6tLoQbtbsx/czD1sodqjcujjKwbQwNyZTf8xR8zsCSzG06dWDw==} peerDependencies: - storybook: ^8.5.0 + storybook: ^8.5.1 - '@storybook/builder-vite@8.5.0': - resolution: {integrity: sha512-GVJFjAxX/mL3bmXX6N619ShuYprkh6Ix08JU6QGNf/tTkG92BxjgCqQdfovBrviDhFyO2bhkdlEp6ujMo5CbZA==} + '@storybook/builder-vite@8.5.1': + resolution: {integrity: sha512-m7nzMmXL8ySRDp3AWsd18xB/mRVFdGnCbXeC2HREQVsu1WFkvcHtksvF4x1BOeeL73eokD2/GzgpCjAS0xVvbw==} peerDependencies: - storybook: ^8.5.0 + storybook: ^8.5.1 vite: ^4.0.0 || ^5.0.0 || ^6.0.0 - '@storybook/cli@8.5.0': - resolution: {integrity: sha512-46xNDnr0mo1JZP7jcnSmbc4FWYjMgoHsJx86YxzJQEtiMlKsBuDuutgKfe3ESgARhaeAgNytvolIaBPYTY7plw==} + '@storybook/cli@8.5.1': + resolution: {integrity: sha512-hKRAt5B1sWEyjj9mJBeapljMszEYn+FUZ7o0D+z1Q05bvTMdKTkNcrK0gN8CKUr5YZQ0sICqQZrHsa5T3ww2tQ==} hasBin: true - '@storybook/codemod@8.5.0': - resolution: {integrity: sha512-qfOWTxHoD8gd6BfylZLmln7Bx2IEjTuWMi8N2n/ZNpR8JFV2rPsw2gNAqUwOlP3uFgDKWxIsg48OfW1Nlmq72w==} + '@storybook/codemod@8.5.1': + resolution: {integrity: sha512-PrWmbuWRxFICdYGCS7LLcAxhlpgsvjJqXVwaeLcIgFNbvZX/s6LfG1ei98w2qSsY9Z/YSe1VZzx8cB7ueX1GKQ==} - '@storybook/components@8.5.0': - resolution: {integrity: sha512-DhaHtwfEcfWYj3ih/5RBSDHe3Idxyf+oHw2/DmaLKJX6MluhdK3ZqigjRcTmA9Gj/SbR4CkHEEtDzAvBlW0BYw==} + '@storybook/components@8.5.1': + resolution: {integrity: sha512-dgZfIIRdI7yA9bYb1rhWzbvU4AnbndAeNhLouxHJkUR5r2Ycp9mJba5UNynN1slgDOxB+VMnq1fWKyfWQrBqnw==} peerDependencies: storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 - '@storybook/core@8.5.0': - resolution: {integrity: sha512-apborO6ynns7SeydBSqE9o0zT6JSU+VY4gLFPJROGcconvSW4bS5xtJCsgjlulceyWVxepFHGXl4jEZw+SktXA==} + '@storybook/core@8.5.1': + resolution: {integrity: sha512-4zxjclENpZYuNY1fZJE4a7hd8Ho/SiOSN2B57fsIi1qCpKax3JU3J59ZcAWT0iidy5qgM2qMcWbrl0Bl/tWamA==} peerDependencies: prettier: ^2 || ^3 peerDependenciesMeta: prettier: optional: true - '@storybook/csf-plugin@8.5.0': - resolution: {integrity: sha512-cs6ogviNyLG1h9J8Sb47U3DqIrQmn2EHm4ta3fpCeV3ABbrMgbzYyxtmybz4g/AwlDgjAZAt6PPcXkfCJ6p2CQ==} + '@storybook/csf-plugin@8.5.1': + resolution: {integrity: sha512-8GFrQgJ+/hzWAj9o4XK8m7UFPLxf0w3RwX0ZMPeb6zDhq/1BUE97AjKFb4Oexkh4I67Pycv4gRUOY9+tXF/1DA==} peerDependencies: - storybook: ^8.5.0 + storybook: ^8.5.1 '@storybook/csf@0.1.12': resolution: {integrity: sha512-9/exVhabisyIVL0VxTCxo01Tdm8wefIXKXfltAPTSr8cbLn5JAxGQ6QV3mjdecLGEOucfoVhAKtJfVHxEK1iqw==} @@ -5189,49 +5133,49 @@ packages: '@storybook/global@5.0.0': resolution: {integrity: sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==} - '@storybook/instrumenter@8.5.0': - resolution: {integrity: sha512-eZ/UY6w4U2vay+wX7QVwKiRoyMzZscuv6v4k4r8BlmHPFWbhiZDO9S2GsG16UkyKnrQrYk432he70n7hn1Xvmg==} + '@storybook/instrumenter@8.5.1': + resolution: {integrity: sha512-wMAhsIzwOh/xXKANAP3IbtXxRWFAZtpRisB0sy8WVTPS3a1L1cA6X+U80Ex/omek6L0FZwKZSKmmfkDeZkYnCQ==} peerDependencies: - storybook: ^8.5.0 + storybook: ^8.5.1 - '@storybook/manager-api@8.5.0': - resolution: {integrity: sha512-Ildriueo3eif4M+gMlMxu/mrBIbAnz8+oesmQJKdzZfe/U9eQTI9OUqJsxx/IVBmdzQ3ySsgNmzj5VweRkse4A==} + '@storybook/manager-api@8.5.1': + resolution: {integrity: sha512-Oj9kPYbp/82LRQ+rsc0ZH0fkzeiT2U1kvubmNiRjtopQHCP3UTVnvWIXC9zSRFKmS+NaAdd0JYsIBvE8fjnoqQ==} peerDependencies: storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 - '@storybook/preview-api@8.5.0': - resolution: {integrity: sha512-g0XbD54zMUkl6bpuA7qEBCE9rW1QV6KKmwkO4bkxMOJcMke3x9l00JTaYn7Un8wItjXiS3BIG15B6mnfBG7fng==} + '@storybook/preview-api@8.5.1': + resolution: {integrity: sha512-fLR7nvAbjHVLazDA6CLy9O/bpBzKDKqxyBp6SybTBPYa76IzsX8ITSMMt1YcP6rOGhVgcKNA9iBNxRddjLIV0Q==} peerDependencies: storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 - '@storybook/react-dom-shim@8.5.0': - resolution: {integrity: sha512-7P8xg4FiuFpM6kQOzZynno+0zyLVs8NgsmRK58t3JRZXbda1tzlxTXzvqx4hUevvbPJGjmrB0F3xTFH+8Otnvw==} + '@storybook/react-dom-shim@8.5.1': + resolution: {integrity: sha512-peDiT6A1zyODKd7tVQIiFNU42Iolca67h3kkOQPb7nm/Czf2yIa/BHw+yiNDZx82eCIEvBy1Xf7lnjH8PD61xA==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^8.5.0 + storybook: ^8.5.1 - '@storybook/react-vite@8.5.0': - resolution: {integrity: sha512-4f5AM8aPs2aTBeiycotinaDIPJg/YRtPb0F1dDquS097eUOeImS73+NSSCwrIjmSiapG/KWVkPgFnadEumFkAA==} + '@storybook/react-vite@8.5.1': + resolution: {integrity: sha512-ccsPJXjR7WMS/t7R5nJpPtqRzJxjsllqVMNGk9xxoLasWDf3vOLohgyCgt63ws8iOMh26lqZsFyPyWFcpKW/hQ==} engines: {node: '>=18.0.0'} peerDependencies: - '@storybook/test': 8.5.0 + '@storybook/test': 8.5.1 react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^8.5.0 + storybook: ^8.5.1 vite: ^4.0.0 || ^5.0.0 || ^6.0.0 peerDependenciesMeta: '@storybook/test': optional: true - '@storybook/react@8.5.0': - resolution: {integrity: sha512-/jbkmGGc95N7KduIennL/k8grNTP5ye/YBnkcS4TbF7uDWBtKy3/Wqvx5BIlFXq3qeUnZJ8YtZc0lPIYeCY8XQ==} + '@storybook/react@8.5.1': + resolution: {integrity: sha512-wKhR9SZUbpYUxRDAYUHH4fZHVxiNG43PxT1uvLfX/i7TPMw+wW+G3Q2yrgms1oHmqqRCvlnGHwT5/t9FFxN31w==} engines: {node: '>=18.0.0'} peerDependencies: - '@storybook/test': 8.5.0 + '@storybook/test': 8.5.1 react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^8.5.0 + storybook: ^8.5.1 typescript: '>= 4.2.x' peerDependenciesMeta: '@storybook/test': @@ -5239,18 +5183,18 @@ packages: typescript: optional: true - '@storybook/test@8.5.0': - resolution: {integrity: sha512-M/DdPlI6gwL7NGkK5o7GYjdEBp95AsFEUtW29zQfnVIAngYugzi3nIuM/XkQHunidVdAZCYjw2s2Yhhsx/m9sw==} + '@storybook/test@8.5.1': + resolution: {integrity: sha512-V0sEXqL5kS0YKugCqWgmCpNODdlCCiVlPqm3i+E2+G97DR980BwXf8J6VPscQDRS9ZG39BrM83Aau6Anxrt1Tg==} peerDependencies: - storybook: ^8.5.0 + storybook: ^8.5.1 - '@storybook/theming@8.5.0': - resolution: {integrity: sha512-591LbOj/HMmHYUfLgrMerxhF1A9mY61HWKxcRpB6xxalc1Xw1kRtQ49DcwuTXnUu9ktBB3nuOzPNPQPFSh/7PQ==} + '@storybook/theming@8.5.1': + resolution: {integrity: sha512-sg61vY1gM8w42CIi28vo//6E1gHgHLNBNaRhkfvLFpu9PuhAcVWLwBDZq0BoKmDMxRxbSPV2gvIKeXdOtbSCJw==} peerDependencies: storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 - '@storybook/types@8.5.0': - resolution: {integrity: sha512-5orPpfLvSksGH341ibmpFnV86yqlZMbvNax+a+z1h56UKRA+4c/hgdRQl1brs7YaQzrgJ2wUX7PAlJjBJ1erUQ==} + '@storybook/types@8.5.1': + resolution: {integrity: sha512-bD5KZ9628licnzMX4pFwWv6opxh3UTZr4zBO796Mm1lMEcGIqs9qFHDbbxly5tuV6IvI6nOSnm7djAFlba7YgQ==} peerDependencies: storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 @@ -5311,8 +5255,8 @@ packages: '@types/aria-query@5.0.4': resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} - '@types/aws-lambda@8.10.145': - resolution: {integrity: sha512-dtByW6WiFk5W5Jfgz1VM+YPA21xMXTuSFoLYIDY0L44jDLLflVPtZkYuu3/YxpGcvjzKFBZLU+GyKjR0HOYtyw==} + '@types/aws-lambda@8.10.147': + resolution: {integrity: sha512-nD0Z9fNIZcxYX5Mai2CTmFD7wX7UldCkW2ezCF8D1T5hdiLsnTWDGRpfRYntU6VjTdLQjOvyszru7I1c1oCQew==} '@types/babel__code-frame@7.0.6': resolution: {integrity: sha512-Anitqkl3+KrzcW2k77lRlg/GfLZLWXBuNgbEcIOU6M92yw42vsd3xV/Z/yAHEj8m+KUjL6bWOVOFqX8PFPJ4LA==} @@ -5332,8 +5276,8 @@ packages: '@types/body-parser@1.19.5': resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} - '@types/braces@3.0.4': - resolution: {integrity: sha512-0WR3b8eaISjEW7RpZnclONaLFDf7buaowRHdqLp4vLj54AsSAYWfh3DRbfiYJY9XDxMgx1B4sE1Afw2PGpuHOA==} + '@types/braces@3.0.5': + resolution: {integrity: sha512-SQFof9H+LXeWNz8wDe7oN5zu7ket0qwMu5vZubW4GCJ8Kkeh6nBWUz87+KTz/G3Kqsrp0j/W253XJb3KMEeg3w==} '@types/connect@3.4.38': resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} @@ -5522,8 +5466,8 @@ packages: '@types/node@17.0.45': resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} - '@types/node@22.10.7': - resolution: {integrity: sha512-V09KvXxFiutGp6B7XkpaDXlNadZxrzajcY50EuoLIpQ6WWYCSvf19lVIazzfIzQvhUN2HjX12spLojTnhuKlGg==} + '@types/node@22.10.10': + resolution: {integrity: sha512-X47y/mPNzxviAGY5TcYPtYL8JsY3kAq2n8fMmKoRCxq/c4v4pyGNCzM2R6+M5/umG4ZfHuT+sgqDYqWc9rJ6ww==} '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} @@ -5540,8 +5484,8 @@ packages: '@types/prompts@2.4.9': resolution: {integrity: sha512-qTxFi6Buiu8+50/+3DGIWLHM6QuWsEKugJnnP6iv2Mc4ncxE4A/OJkjuVOA+5X0X1S/nq5VJRa8Lu+nwcvbrKA==} - '@types/prop-types@15.7.14': - resolution: {integrity: sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==} + '@types/prop-types@15.7.13': + resolution: {integrity: sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==} '@types/qs@6.9.17': resolution: {integrity: sha512-rX4/bPcfmvxHDv0XjfJELTTr+iB+tn032nPILqHm5wbthUUUuVtNGGqzhya9XUxjTP8Fpr0qYgSZZKxGY++svQ==} @@ -5549,13 +5493,11 @@ packages: '@types/range-parser@1.2.7': resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} - '@types/react-dom@18.3.5': - resolution: {integrity: sha512-P4t6saawp+b/dFrUr2cvkVsfvPguwsxtH6dNIYRllMsefqFzkZk5UIjzyDOv5g1dXIPdG4Sp1yCR4Z6RCUsG/Q==} - peerDependencies: - '@types/react': ^18.0.0 + '@types/react-dom@18.3.1': + resolution: {integrity: sha512-qW1Mfv8taImTthu4KoXgDfLuk4bydU6Q/TkADnDWWHwi4NX4BR+LWfTp2sVmTqRrsHvyDDTelgelxJ+SsejKKQ==} - '@types/react@18.3.18': - resolution: {integrity: sha512-t4yC+vtgnkYjNSKlFx1jkAhH8LgTo2N/7Qvi83kdEaUtMDiwpbLAktKDaAMlRcJ5eSxZkH74eEGt1ky31d7kfQ==} + '@types/react@18.3.12': + resolution: {integrity: sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw==} '@types/remark-heading-id@1.0.0': resolution: {integrity: sha512-V6OgBN2Uv3kaYHOrBI2+j9xIo6N56bMpIFoKVkGltoJtzHr7Vo8pFxDZxNqUXC5NScV991Iq3BYD52BkCFMY+w==} @@ -5700,11 +5642,11 @@ packages: peerDependencies: vite: ^4.2.0 || ^5.0.0 || ^6.0.0 - '@vitest/coverage-v8@3.0.3': - resolution: {integrity: sha512-uVbJ/xhImdNtzPnLyxCZJMTeTIYdgcC2nWtBBBpR1H6z0w8m7D+9/zrDIx2nNxgMg9r+X8+RY2qVpUDeW2b3nw==} + '@vitest/coverage-v8@3.0.4': + resolution: {integrity: sha512-f0twgRCHgbs24Dp8cLWagzcObXMcuKtAwgxjJV/nnysPAJJk1JiKu/W0gIehZLmkljhJXU/E0/dmuQzsA/4jhA==} peerDependencies: - '@vitest/browser': 3.0.3 - vitest: 3.0.3 + '@vitest/browser': 3.0.4 + vitest: 3.0.4 peerDependenciesMeta: '@vitest/browser': optional: true @@ -5712,11 +5654,11 @@ packages: '@vitest/expect@2.0.5': resolution: {integrity: sha512-yHZtwuP7JZivj65Gxoi8upUN2OzHTi3zVfjwdpu2WrvCZPLwsJ2Ey5ILIPccoW23dd/zQBlJ4/dhi7DWNyXCpA==} - '@vitest/expect@3.0.3': - resolution: {integrity: sha512-SbRCHU4qr91xguu+dH3RUdI5dC86zm8aZWydbp961aIR7G8OYNN6ZiayFuf9WAngRbFOfdrLHCGgXTj3GtoMRQ==} + '@vitest/expect@3.0.4': + resolution: {integrity: sha512-Nm5kJmYw6P2BxhJPkO3eKKhGYKRsnqJqf+r0yOGRKpEP+bSCBDsjXgiu1/5QFrnPMEgzfC38ZEjvCFgaNBC0Eg==} - '@vitest/mocker@3.0.3': - resolution: {integrity: sha512-XT2XBc4AN9UdaxJAeIlcSZ0ILi/GzmG5G8XSly4gaiqIvPV3HMTSIDZWJVX6QRJ0PX1m+W8Cy0K9ByXNb/bPIA==} + '@vitest/mocker@3.0.4': + resolution: {integrity: sha512-gEef35vKafJlfQbnyOXZ0Gcr9IBUsMTyTLXsEQwuyYAerpHqvXhzdBnDFuHLpFqth3F7b6BaFr4qV/Cs1ULx5A==} peerDependencies: msw: ^2.4.9 vite: ^5.0.0 || ^6.0.0 @@ -5732,25 +5674,25 @@ packages: '@vitest/pretty-format@2.1.5': resolution: {integrity: sha512-4ZOwtk2bqG5Y6xRGHcveZVr+6txkH7M2e+nPFd6guSoN638v/1XQ0K06eOpi0ptVU/2tW/pIU4IoPotY/GZ9fw==} - '@vitest/pretty-format@3.0.3': - resolution: {integrity: sha512-gCrM9F7STYdsDoNjGgYXKPq4SkSxwwIU5nkaQvdUxiQ0EcNlez+PdKOVIsUJvh9P9IeIFmjn4IIREWblOBpP2Q==} + '@vitest/pretty-format@3.0.4': + resolution: {integrity: sha512-ts0fba+dEhK2aC9PFuZ9LTpULHpY/nd6jhAQ5IMU7Gaj7crPCTdCFfgvXxruRBLFS+MLraicCuFXxISEq8C93g==} - '@vitest/runner@3.0.3': - resolution: {integrity: sha512-Rgi2kOAk5ZxWZlwPguRJFOBmWs6uvvyAAR9k3MvjRvYrG7xYvKChZcmnnpJCS98311CBDMqsW9MzzRFsj2gX3g==} + '@vitest/runner@3.0.4': + resolution: {integrity: sha512-dKHzTQ7n9sExAcWH/0sh1elVgwc7OJ2lMOBrAm73J7AH6Pf9T12Zh3lNE1TETZaqrWFXtLlx3NVrLRb5hCK+iw==} - '@vitest/snapshot@3.0.3': - resolution: {integrity: sha512-kNRcHlI4txBGztuJfPEJ68VezlPAXLRT1u5UCx219TU3kOG2DplNxhWLwDf2h6emwmTPogzLnGVwP6epDaJN6Q==} + '@vitest/snapshot@3.0.4': + resolution: {integrity: sha512-+p5knMLwIk7lTQkM3NonZ9zBewzVp9EVkVpvNta0/PlFWpiqLaRcF4+33L1it3uRUCh0BGLOaXPPGEjNKfWb4w==} '@vitest/spy@2.0.5': resolution: {integrity: sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA==} - '@vitest/spy@3.0.3': - resolution: {integrity: sha512-7/dgux8ZBbF7lEIKNnEqQlyRaER9nkAL9eTmdKJkDO3hS8p59ATGwKOCUDHcBLKr7h/oi/6hP+7djQk8049T2A==} + '@vitest/spy@3.0.4': + resolution: {integrity: sha512-sXIMF0oauYyUy2hN49VFTYodzEAu744MmGcPR3ZBsPM20G+1/cSW/n1U+3Yu/zHxX2bIDe1oJASOkml+osTU6Q==} - '@vitest/ui@3.0.3': - resolution: {integrity: sha512-kGavHxFA3dETa61mgzdvxc3u/JSCiHR2o/0Z99IE8EAwtFxSLZeb2MofPKNVCPY3IAIcTx4blH57BJ1GuiRAUA==} + '@vitest/ui@3.0.4': + resolution: {integrity: sha512-e+s2F9e9FUURkZ5aFIe1Fi3Y8M7UF6gEuShcaV/ur7y/Ldri+1tzWQ1TJq9Vas42NXnXvCAIrU39Z4U2RyET6g==} peerDependencies: - vitest: 3.0.3 + vitest: 3.0.4 '@vitest/utils@2.0.5': resolution: {integrity: sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ==} @@ -5758,8 +5700,8 @@ packages: '@vitest/utils@2.1.5': resolution: {integrity: sha512-yfj6Yrp0Vesw2cwJbP+cl04OC+IHFsuQsrsJBL9pyGeQXE56v1UAOQco+SR55Vf1nQzfV0QJg1Qum7AaWUwwYg==} - '@vitest/utils@3.0.3': - resolution: {integrity: sha512-f+s8CvyzPtMFY1eZKkIHGhPsQgYo5qCm6O8KZoim9qm1/jT64qBgGpO5tHscNH6BzRHM+edLNOP+3vO8+8pE/A==} + '@vitest/utils@3.0.4': + resolution: {integrity: sha512-8BqC1ksYsHtbWH+DfpOAKrFw3jl3Uf9J7yeFh85Pz52IWuh1hBBtyfEbRNNZNjl8H8A5yMLH9/t+k7HIKzQcZQ==} '@volar/kit@2.4.10': resolution: {integrity: sha512-ul+rLeO9RlFDgkY/FhPWMnpFqAsjvjkKz8VZeOY5YCJMwTblmmSBlNJtFNxSBx9t/k1q80nEthLyxiJ50ZbIAg==} @@ -5796,8 +5738,8 @@ packages: '@vscode/l10n@0.0.18': resolution: {integrity: sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==} - '@vscode/test-web@0.0.62': - resolution: {integrity: sha512-Ypug5PvhPOPFbuHVilai7t23tm3Wm5geIpC2DB09Gy9o0jZCduramiSdPf+YN7yhkFy1usFYtN3Eaks1XoBrOQ==} + '@vscode/test-web@0.0.65': + resolution: {integrity: sha512-jNc6FyJARgiru/2Y8vXSkaf399JFtTNxAAtwLPzSSU5C4+AJwvOOOhlVHQfmee51R9LIs6uwZryFxmqSfMhniQ==} engines: {node: '>=16'} hasBin: true @@ -5925,10 +5867,6 @@ packages: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} - agent-base@7.1.1: - resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} - engines: {node: '>= 14'} - agent-base@7.1.3: resolution: {integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==} engines: {node: '>= 14'} @@ -5961,8 +5899,8 @@ packages: ajv@8.17.1: resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} - algoliasearch@5.20.0: - resolution: {integrity: sha512-groO71Fvi5SWpxjI9Ia+chy0QBwT61mg6yxJV27f5YFf+Mw+STT75K6SHySpP8Co5LsCrtsbCH5dJZSRtkSKaQ==} + algoliasearch@5.15.0: + resolution: {integrity: sha512-Yf3Swz1s63hjvBVZ/9f2P1Uu48GjmjCN+Esxb6MAONMGtZB1fRX8/S1AhUTtsuTlcGovbYLxpHgc7wEzstDZBw==} engines: {node: '>= 14.0.0'} alien-signals@0.4.14: @@ -6054,6 +5992,10 @@ packages: resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} engines: {node: '>= 0.4'} + array-buffer-byte-length@1.0.2: + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} + engines: {node: '>= 0.4'} + array-flatten@1.1.1: resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} @@ -6075,16 +6017,16 @@ packages: resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} engines: {node: '>= 0.4'} - array.prototype.flat@1.3.2: - resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} + array.prototype.flat@1.3.3: + resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} engines: {node: '>= 0.4'} - array.prototype.flatmap@1.3.2: - resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} + array.prototype.flatmap@1.3.3: + resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} engines: {node: '>= 0.4'} - arraybuffer.prototype.slice@1.0.3: - resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} + arraybuffer.prototype.slice@1.0.4: + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} engines: {node: '>= 0.4'} as-table@1.0.55: @@ -6117,6 +6059,10 @@ packages: engines: {node: ^18.17.1 || ^20.3.0 || >=22.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0'} hasBin: true + async-function@1.0.0: + resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} + engines: {node: '>= 0.4'} + async@3.2.6: resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} @@ -6279,6 +6225,11 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true + browserslist@4.24.4: + resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + buffer-crc32@0.2.13: resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} @@ -6328,10 +6279,22 @@ packages: resolution: {integrity: sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==} engines: {node: '>= 6.0.0'} + call-bind-apply-helpers@1.0.1: + resolution: {integrity: sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==} + engines: {node: '>= 0.4'} + call-bind@1.0.7: resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} engines: {node: '>= 0.4'} + call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} + + call-bound@1.0.3: + resolution: {integrity: sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==} + engines: {node: '>= 0.4'} + call-me-maybe@1.0.2: resolution: {integrity: sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==} @@ -6366,6 +6329,9 @@ packages: caniuse-lite@1.0.30001682: resolution: {integrity: sha512-rJFwz3yRO6NU6Y8aEJKPzS4fngOE8j05pd33FW5Uk9v9b5StWNhGFeVpogwS2FFl78wNDGW5NsVvlwySPEDU5w==} + caniuse-lite@1.0.30001695: + resolution: {integrity: sha512-vHyLade6wTgI2u1ec3WQBxv+2BrTERV28UXQu9LO6lZ9pYeMk34vjXFLOxo1A4UBA8XTL4njRQZdno/yYaSmWw==} + catch-unknown@2.0.0: resolution: {integrity: sha512-4ELowf+Fp6Qwv77ZvRDto9oJMsOalEk8IYvS5KsmIhRZQWbfArlIhIOONJtmCzOeeqpip6JzYqAYaNR9sIyLVQ==} @@ -6663,8 +6629,8 @@ packages: resolution: {integrity: sha512-TG2hpqe4ELx54QER/S3HQ9SRVnQnGBtKUz5bLQWtYAQ+o6GpgMs6sYUvaiJjVxb+UXwhRhAEP3m7LbsIZ77Hmw==} engines: {node: '>= 0.8'} - core-js-compat@3.39.0: - resolution: {integrity: sha512-VgEUx3VwlExr5no0tXlBt+silBvhTryPwCXRI2Id1PN8WTKu7MreethvddqOubrYxkFdv/RnYrqlv1sFNAUelw==} + core-js-compat@3.40.0: + resolution: {integrity: sha512-0XEDpr5y5mijvw8Lbc6E5AkjrHfp7eEoPlu36SWeAbcL8fn1G1ANe8DBlo2XoNN89oVpxWwOjYIPVzR4ZvsKCQ==} core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} @@ -6688,8 +6654,8 @@ packages: typescript: optional: true - create-storybook@8.5.0: - resolution: {integrity: sha512-AnoN8KXnRRJdjEvtIabQEVYgAuFnaR5cRhnMXawDJ3kZDtdmy9TLIShtmYoUS0Am+6zzhVayDjWZWeQc1pD4Cw==} + create-storybook@8.5.1: + resolution: {integrity: sha512-VLCsbw+5dSYUhK2fk7LObed/T57BCWFJdgwB951FlDYHGVGQomb5St6V6T7w0+fDHkDMmQPqUw8I7CBhHt51cw==} hasBin: true cross-env@7.0.3: @@ -6775,10 +6741,6 @@ packages: resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==} engines: {node: '>=8'} - cssstyle@4.2.1: - resolution: {integrity: sha512-9+vem03dMXG7gDmZ62uqmRiMRNtinIZ9ZyuF6BdxzfOD+FdN5hretzynkn0ReS2DO2GSw76RWHs0UmJPI2zUjw==} - engines: {node: '>=18'} - csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} @@ -6949,20 +6911,16 @@ packages: resolution: {integrity: sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==} engines: {node: '>=12'} - data-urls@5.0.0: - resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} - engines: {node: '>=18'} - - data-view-buffer@1.0.1: - resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} + data-view-buffer@1.0.2: + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} engines: {node: '>= 0.4'} - data-view-byte-length@1.0.1: - resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} + data-view-byte-length@1.0.2: + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} engines: {node: '>= 0.4'} - data-view-byte-offset@1.0.0: - resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} + data-view-byte-offset@1.0.1: + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} engines: {node: '>= 0.4'} date-fns@4.1.0: @@ -6994,6 +6952,15 @@ packages: supports-color: optional: true + debug@4.3.7: + resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + debug@4.4.0: resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} engines: {node: '>=6.0'} @@ -7160,6 +7127,10 @@ packages: resolution: {integrity: sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==} engines: {node: '>=4'} + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + duplexify@3.7.1: resolution: {integrity: sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==} @@ -7186,18 +7157,21 @@ packages: electron-to-chromium@1.5.63: resolution: {integrity: sha512-ddeXKuY9BHo/mw145axlyWjlJ1UBt4WK3AlvkT7W2AbqfRQoacVoRUCF6wL3uIx/8wT9oLKXzI+rFqHHscByaA==} - embla-carousel-autoplay@8.5.2: - resolution: {integrity: sha512-27emJ0px3q/c0kCHCjwRrEbYcyYUPfGO3g5IBWF1i7714TTzE6L9P81V6PHLoSMAKJ1aHoT2e7YFOsuFKCbyag==} + electron-to-chromium@1.5.87: + resolution: {integrity: sha512-mPFwmEWmRivw2F8x3w3l2m6htAUN97Gy0kwpO++2m9iT1Gt8RCFVUfv9U/sIbHJ6rY4P6/ooqFL/eL7ock+pPg==} + + embla-carousel-autoplay@8.5.1: + resolution: {integrity: sha512-FnZklFpePfp8wbj177UwVaGFehgs+ASVcJvYLWTtHuYKURynCc3IdDn2qrn0E5Qpa3g9yeGwCS4p8QkrZmO8xg==} peerDependencies: - embla-carousel: 8.5.2 + embla-carousel: 8.5.1 - embla-carousel-fade@8.5.2: - resolution: {integrity: sha512-QJ46Xy+mpijjquQeIY0d0sPSy34XduREUnz7tn1K20hcKyZYTONNIXQZu3GGNwG59cvhMqYJMw9ki92Rjd14YA==} + embla-carousel-fade@8.5.1: + resolution: {integrity: sha512-n7vRe2tsTW0vc0Xxtk3APoxhUSXIGh/lGRKYtBJS/SWDeXf9E3qVUst4MfHhwXaHlfu5PLqG3xIEDAr2gwbbNA==} peerDependencies: - embla-carousel: 8.5.2 + embla-carousel: 8.5.1 - embla-carousel@8.5.2: - resolution: {integrity: sha512-xQ9oVLrun/eCG/7ru3R+I5bJ7shsD8fFwLEY7yPe27/+fDHCNj0OT5EoG5ZbFyOxOcG6yTwW8oTz/dWyFnyGpg==} + embla-carousel@8.5.1: + resolution: {integrity: sha512-JUb5+FOHobSiWQ2EJNaueCNT/cQU9L6XWBbWmorWPQT9bkbk+fhsuLr8wWrzXKagO3oWszBO7MSx+GfaRk4E6A==} emmet@2.4.11: resolution: {integrity: sha512-23QPJB3moh/U9sT4rQzGgeyyGIrcM+GH5uVYg2C6wZIxAIJq7Ng3QLT79tl8FUwDXhyq9SusfknOrofAKqvgyQ==} @@ -7261,14 +7235,18 @@ packages: error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - es-abstract@1.23.5: - resolution: {integrity: sha512-vlmniQ0WNPwXqA0BnmwV3Ng7HxiGlh6r5U6JcTMNx8OilcAGqVJBHJcPjqOMaczU9fRuRK5Px2BdVyPRnKMMVQ==} + es-abstract@1.23.9: + resolution: {integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==} engines: {node: '>= 0.4'} es-define-property@1.0.0: resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} engines: {node: '>= 0.4'} + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + es-errors@1.3.0: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} @@ -7282,19 +7260,19 @@ packages: es-module-shims@2.0.5: resolution: {integrity: sha512-NIm759Jyh1py4a0FgxiUwrGawfqXpLvK+8IRvOzfNOwePZYV27XynglQe5aCcr0B0Wn+DFDRTRJSPtWa66Eo9g==} - es-object-atoms@1.0.0: - resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} engines: {node: '>= 0.4'} - es-set-tostringtag@2.0.3: - resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} engines: {node: '>= 0.4'} es-shim-unscopables@1.0.2: resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} - es-to-primitive@1.2.1: - resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + es-to-primitive@1.3.0: + resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} es-toolkit@1.27.0: @@ -7601,6 +7579,14 @@ packages: picomatch: optional: true + fdir@6.4.3: + resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + fecha@4.2.3: resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} @@ -7753,8 +7739,8 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - function.prototype.name@1.1.6: - resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} + function.prototype.name@1.1.8: + resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} engines: {node: '>= 0.4'} functions-have-names@1.2.3: @@ -7780,6 +7766,14 @@ packages: resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} engines: {node: '>= 0.4'} + get-intrinsic@1.2.7: + resolution: {integrity: sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + get-source@2.0.12: resolution: {integrity: sha512-X5+4+iD+HoSeEED+uwrQ07BOQr0kEDFMVqqpBuI+RaZBpBpHCuXxo70bjar6f0b0u/DQJsJ7ssurpP0V60Az+w==} @@ -7795,12 +7789,12 @@ packages: resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} engines: {node: '>=16'} - get-symbol-description@1.0.2: - resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} + get-symbol-description@1.1.0: + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} engines: {node: '>= 0.4'} - get-tsconfig@4.8.1: - resolution: {integrity: sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==} + get-tsconfig@4.10.0: + resolution: {integrity: sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==} giget@1.2.3: resolution: {integrity: sha512-8EHPljDvs7qKykr6uw8b+lqLiUc/vUg+KVTI0uND4s63TdsZM2Xus3mflvF0DDG9SiM4RlCkFGL+7aAjRmV7KA==} @@ -7829,6 +7823,11 @@ packages: engines: {node: 20 || >=22} hasBin: true + glob@11.0.1: + resolution: {integrity: sha512-zrQDm8XPnYEKawJScsnM0QzobJxlT/kHOOlRTio8IH/GrmxRE5fjllkzdaHclIuNjUQTJYH2xHNIGfdpJkDJUw==} + engines: {node: 20 || >=22} + hasBin: true + glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Glob versions prior to v9 are no longer supported @@ -7845,8 +7844,8 @@ packages: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} - globals@15.12.0: - resolution: {integrity: sha512-1+gLErljJFhbOVyaetcwJiJ4+eLe45S2E7P5UiZ9xGfeq3ATQf5DOv9G7MH3gGbKQLkzmNh2DxfZwLdw+j6oTQ==} + globals@15.14.0: + resolution: {integrity: sha512-OkToC372DtlQeje9/zHIo5CT8lRP/FUgEOKBEhU4e0abL7J7CD24fD9ohiLN5hagG/kWCYj4K5oaxxtj2Z0Dig==} engines: {node: '>=18'} globalthis@1.0.4: @@ -7864,6 +7863,10 @@ packages: gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + graceful-fs@4.2.10: resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} @@ -7901,6 +7904,10 @@ packages: has-bigints@1.0.2: resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + has-bigints@1.1.0: + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} + engines: {node: '>= 0.4'} + has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} @@ -7920,10 +7927,18 @@ packages: resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} engines: {node: '>= 0.4'} + has-proto@1.2.0: + resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} + engines: {node: '>= 0.4'} + has-symbols@1.0.3: resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} engines: {node: '>= 0.4'} + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + has-tostringtag@1.0.2: resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'} @@ -8028,10 +8043,6 @@ packages: resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==} engines: {node: '>=12'} - html-encoding-sniffer@4.0.0: - resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} - engines: {node: '>=18'} - html-escape@1.0.2: resolution: {integrity: sha512-r4cqVc7QAX1/jpPsW9OJNsTTtFhcf+ZBqoA3rWOddMg/y+n6ElKfz+IGKbvV2RTeECDzyrQXa2rpo3IFFrANWg==} @@ -8179,6 +8190,10 @@ packages: resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} engines: {node: '>= 0.4'} + internal-slot@1.1.0: + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} + engines: {node: '>= 0.4'} + internmap@1.0.1: resolution: {integrity: sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==} @@ -8215,15 +8230,27 @@ packages: resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} engines: {node: '>= 0.4'} + is-array-buffer@3.0.5: + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} + engines: {node: '>= 0.4'} + is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} is-arrayish@0.3.2: resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + is-async-function@2.1.1: + resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} + engines: {node: '>= 0.4'} + is-bigint@1.0.4: resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + is-bigint@1.1.0: + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} + engines: {node: '>= 0.4'} + is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} @@ -8232,6 +8259,10 @@ packages: resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} engines: {node: '>= 0.4'} + is-boolean-object@1.2.1: + resolution: {integrity: sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng==} + engines: {node: '>= 0.4'} + is-builtin-module@3.2.1: resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} engines: {node: '>=6'} @@ -8240,22 +8271,22 @@ packages: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} - is-core-module@2.15.1: - resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==} - engines: {node: '>= 0.4'} - is-core-module@2.16.1: resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} engines: {node: '>= 0.4'} - is-data-view@1.0.1: - resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} + is-data-view@1.0.2: + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} engines: {node: '>= 0.4'} is-date-object@1.0.5: resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} engines: {node: '>= 0.4'} + is-date-object@1.1.0: + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} + engines: {node: '>= 0.4'} + is-decimal@2.0.1: resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} @@ -8280,12 +8311,16 @@ packages: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} + is-finalizationregistry@1.1.1: + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} + engines: {node: '>= 0.4'} + is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} - is-generator-function@1.0.10: - resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + is-generator-function@1.1.0: + resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} engines: {node: '>= 0.4'} is-glob@4.0.3: @@ -8319,14 +8354,14 @@ packages: is-module@1.0.0: resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} - is-negative-zero@2.0.3: - resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} - engines: {node: '>= 0.4'} - is-number-object@1.0.7: resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} engines: {node: '>= 0.4'} + is-number-object@1.1.1: + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} + engines: {node: '>= 0.4'} + is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} @@ -8356,6 +8391,10 @@ packages: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + is-set@2.0.3: resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} engines: {node: '>= 0.4'} @@ -8364,6 +8403,10 @@ packages: resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} engines: {node: '>= 0.4'} + is-shared-array-buffer@1.0.4: + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} + engines: {node: '>= 0.4'} + is-stream@2.0.1: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} @@ -8376,6 +8419,10 @@ packages: resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} engines: {node: '>= 0.4'} + is-string@1.1.1: + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} + engines: {node: '>= 0.4'} + is-subdir@1.2.0: resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} engines: {node: '>=4'} @@ -8384,8 +8431,12 @@ packages: resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} engines: {node: '>= 0.4'} - is-typed-array@1.1.13: - resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} + is-symbol@1.1.1: + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} + engines: {node: '>= 0.4'} + + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} engines: {node: '>= 0.4'} is-unicode-supported@0.1.0: @@ -8404,8 +8455,9 @@ packages: resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} engines: {node: '>= 0.4'} - is-weakref@1.0.2: - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + is-weakref@1.1.0: + resolution: {integrity: sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q==} + engines: {node: '>= 0.4'} is-weakset@2.0.3: resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} @@ -8467,10 +8519,6 @@ packages: resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==} hasBin: true - jiti@2.4.2: - resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} - hasBin: true - jju@1.4.0: resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} @@ -8510,15 +8558,6 @@ packages: canvas: optional: true - jsdom@26.0.0: - resolution: {integrity: sha512-BZYDGVAIriBWTpIxYzrXjv3E/4u8+/pSG5bQdIYCbNCGOvsPkDQfTVLAIXAf9ETdCpduCVTkDe2NNZ8NIwUVzw==} - engines: {node: '>=18'} - peerDependencies: - canvas: ^3.0.0 - peerDependenciesMeta: - canvas: - optional: true - jsesc@0.5.0: resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} hasBin: true @@ -8528,6 +8567,11 @@ packages: engines: {node: '>=6'} hasBin: true + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} @@ -8681,14 +8725,14 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} + lilconfig@2.1.0: + resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} + engines: {node: '>=10'} + lilconfig@3.1.2: resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==} engines: {node: '>=14'} - lilconfig@3.1.3: - resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} - engines: {node: '>=14'} - lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} @@ -8854,6 +8898,10 @@ packages: resolution: {integrity: sha512-E1fhSTPRyhAlNaNvGXAgZQlq1hL0bgYMTk/6bktVlIhzUnX/SZs7296ACdVeNJE8xFNGSuvd9IpI7vSnmcqLvw==} engines: {node: '>=10'} + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + mdast-util-definitions@6.0.0: resolution: {integrity: sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==} @@ -9290,6 +9338,9 @@ packages: node-releases@2.0.18: resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} + node-releases@2.0.19: + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + nopt@8.1.0: resolution: {integrity: sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==} engines: {node: ^18.17.0 || >=20.5.0} @@ -9355,9 +9406,6 @@ packages: nwsapi@2.2.0: resolution: {integrity: sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==} - nwsapi@2.2.16: - resolution: {integrity: sha512-F1I/bimDpj3ncaNDhfyMWuFqmQDBwDB0Fogc2qpL3BWvkQteFD/8BzWuIRl83rq0DXfm8SGt/HFhLXZyljTXcQ==} - nypm@0.3.12: resolution: {integrity: sha512-D3pzNDWIvgA+7IORhD/IuWzEk4uXv6GsgOxiid4UU3h9oq5IqV1KtPDi63n4sZJ/xcWlr88c0QM2RgN5VbOhFA==} engines: {node: ^14.16.0 || >=16.10.0} @@ -9387,6 +9435,10 @@ packages: resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} engines: {node: '>= 0.4'} + object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} + engines: {node: '>= 0.4'} + object.fromentries@2.0.8: resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} engines: {node: '>= 0.4'} @@ -9395,12 +9447,12 @@ packages: resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} engines: {node: '>= 0.4'} - object.values@1.2.0: - resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} + object.values@1.2.1: + resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} engines: {node: '>= 0.4'} - octokit@4.0.2: - resolution: {integrity: sha512-wbqF4uc1YbcldtiBFfkSnquHtECEIpYD78YUXI6ri1Im5OO2NLo6ZVpRdbJpdnpZ05zMrVPssNiEo6JQtea+Qg==} + octokit@4.1.0: + resolution: {integrity: sha512-/UrQAOSvkc+lUUWKNzy4ByAgYU9KpFzZQt8DnC962YmQuDiZb1SNJ90YukCCK5aMzKqqCA+z1kkAlmzYvdYKag==} engines: {node: '>= 18'} ofetch@1.4.1: @@ -9463,6 +9515,10 @@ packages: resolution: {integrity: sha512-ANIvzobt1rls2BDny5fWZ3ZVKyD6nscLvfFRpQgfWsythlcsVUC9kL0zq6j2Z5z9wwp1kd7wpsD/T9qNPVLCaQ==} engines: {node: '>=18'} + own-keys@1.0.1: + resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} + engines: {node: '>= 0.4'} + p-defer@1.0.0: resolution: {integrity: sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==} engines: {node: '>=4'} @@ -9691,13 +9747,13 @@ packages: engines: {node: '>=18'} hasBin: true - playwright-core@1.49.1: - resolution: {integrity: sha512-BzmpVcs4kE2CH15rWfzpjzVGhWERJfmnXmniSyKeRZUs9Ws65m+RGIi7mjJK/euCegfn3i7jvqWeWyHe9y3Vgg==} + playwright-core@1.50.0: + resolution: {integrity: sha512-CXkSSlr4JaZs2tZHI40DsZUN/NIwgaUPsyLuOAaIZp2CyF2sN5MM5NJsyB188lFSSozFxQ5fPT4qM+f0tH/6wQ==} engines: {node: '>=18'} hasBin: true - playwright@1.49.1: - resolution: {integrity: sha512-VYL8zLoNTBxVOrJBbDuRgDWa3i+mfQgDTrL8Ah9QXZ7ax4Dsj0MSq5bYgytRnDVVe+njoKnfsYkH3HzqVj5UZA==} + playwright@1.50.0: + resolution: {integrity: sha512-+GinGfGTrd2IfX1TA4N2gNmeIksSb+IAe589ZH+FlmpV3MYTx6+buChGIuDLQwrGNCw2lWibqV50fU510N7S+w==} engines: {node: '>=18'} hasBin: true @@ -9827,8 +9883,8 @@ packages: printable-characters@1.0.42: resolution: {integrity: sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==} - prism-react-renderer@2.4.1: - resolution: {integrity: sha512-ey8Ls/+Di31eqzUxC46h8MksNuGx/n0AAC8uKpwFau4RPDYLuE3EXTp8N8G2vX2N7UC/+IXeNUnlWBGGcAG+Ig==} + prism-react-renderer@2.4.0: + resolution: {integrity: sha512-327BsVCD/unU4CNLZTWVHyUHKnsqcvj2qbPlQ8MiBE2eq2rgctjigPA1Gp9HLF83kZ20zNN6jgizHJeEsyFYOw==} peerDependencies: react: '>=16.0.0' @@ -10060,6 +10116,10 @@ packages: resolution: {integrity: sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==} engines: {node: '>=6'} + reflect.getprototypeof@1.0.10: + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} + engines: {node: '>= 0.4'} + regenerate-unicode-properties@10.2.0: resolution: {integrity: sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==} engines: {node: '>=4'} @@ -10090,6 +10150,10 @@ packages: resolution: {integrity: sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==} engines: {node: '>= 0.4'} + regexp.prototype.flags@1.5.4: + resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} + engines: {node: '>= 0.4'} + regexpu-core@6.1.1: resolution: {integrity: sha512-k67Nb9jvwJcJmVpw0jPttR1/zVfnKf8Km0IPatrU/zJ5XeG3+Slx0xLXs9HByJSzXzrlz5EDvN6yLNMDc2qdnw==} engines: {node: '>=4'} @@ -10276,9 +10340,6 @@ packages: roughjs@4.6.6: resolution: {integrity: sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==} - rrweb-cssom@0.8.0: - resolution: {integrity: sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==} - rtl-css-js@1.16.1: resolution: {integrity: sha512-lRQgou1mu19e+Ya0LsTvKrVJ5TYUbqCVPAiImX3UfLTenarvPUl1QFdvu5Z3PYmHT9RCcwIfbjRQBntExyj3Zg==} @@ -10294,8 +10355,8 @@ packages: s.color@0.0.15: resolution: {integrity: sha512-AUNrbEUHeKY8XsYr/DYpl+qk5+aM+DChopnWOPEzn8YKzOhv4l2zH6LzZms3tOZP3wwdOyc0RmTciyi46HLIuA==} - safe-array-concat@1.1.2: - resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} + safe-array-concat@1.1.3: + resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} engines: {node: '>=0.4'} safe-buffer@5.1.2: @@ -10308,8 +10369,12 @@ packages: resolution: {integrity: sha512-vdTshSQ2JsRCgT8eKZWNJIL26C6bVqy1SOmuCMlKHegVeo8KYRobRrefOdUq9OozSPUUiSxrylteeRmLOMFfWg==} engines: {node: '>=12'} - safe-regex-test@1.0.3: - resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} + safe-push-apply@1.0.0: + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} + engines: {node: '>= 0.4'} + + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} engines: {node: '>= 0.4'} safe-stable-stringify@2.5.0: @@ -10329,16 +10394,9 @@ packages: resolution: {integrity: sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==} engines: {node: '>=10'} - saxes@6.0.0: - resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} - engines: {node: '>=v12.22.7'} - scheduler@0.23.2: resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} - scheduler@0.25.0: - resolution: {integrity: sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==} - search-insights@2.17.3: resolution: {integrity: sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==} @@ -10383,6 +10441,10 @@ packages: resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} engines: {node: '>= 0.4'} + set-proto@1.0.0: + resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} + engines: {node: '>= 0.4'} + setprototypeof@1.1.0: resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} @@ -10411,10 +10473,26 @@ packages: shiki@1.29.1: resolution: {integrity: sha512-TghWKV9pJTd/N+IgAIVJtr0qZkB7FfFCUrrEJc0aRmZupo3D1OCVRknQWVRVA7AX/M0Ld7QfoAruPzr3CnUJuw==} + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + side-channel@1.0.6: resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} engines: {node: '>= 0.4'} + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} @@ -10462,8 +10540,8 @@ packages: resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} - socks-proxy-agent@8.0.4: - resolution: {integrity: sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw==} + socks-proxy-agent@8.0.5: + resolution: {integrity: sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==} engines: {node: '>= 14'} socks@2.8.3: @@ -10505,8 +10583,8 @@ packages: spdx-expression-parse@3.0.1: resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} - spdx-license-ids@3.0.20: - resolution: {integrity: sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==} + spdx-license-ids@3.0.21: + resolution: {integrity: sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==} split2@3.2.2: resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} @@ -10553,8 +10631,8 @@ packages: resolution: {integrity: sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==} engines: {node: '>=4', npm: '>=6'} - storybook@8.5.0: - resolution: {integrity: sha512-cEx42OlCetManF+cONVJVYP7SYsnI2K922DfWKmZhebP0it0n6TUof4y5/XzJ8YUruwPgyclGLdX8TvdRuNSfw==} + storybook@8.5.1: + resolution: {integrity: sha512-HuaAFA97j2w4i/1EHKj6X4iDiVzPrXzQpmTEE1tLD1QXzqrQKKHse+Ggc8AGMuLTAzxA6xmrX9xibgMNWCgvRA==} hasBin: true peerDependencies: prettier: ^2 || ^3 @@ -10595,12 +10673,13 @@ packages: resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} engines: {node: '>=18'} - string.prototype.trim@1.2.9: - resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} + string.prototype.trim@1.2.10: + resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} engines: {node: '>= 0.4'} - string.prototype.trimend@1.0.8: - resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} + string.prototype.trimend@1.0.9: + resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} + engines: {node: '>= 0.4'} string.prototype.trimstart@1.0.8: resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} @@ -10681,9 +10760,6 @@ packages: stylis@4.3.4: resolution: {integrity: sha512-osIBl6BGUmSfDkyH2mB7EFvCJntXDrLhKjHTRj/rK6xLH0yuPrHULDRQzKokSOD4VoorhtKpfcfW1GAntu8now==} - stylis@4.3.5: - resolution: {integrity: sha512-K7npNOKGRYuhAFFzkzMGfxFDpN6gDwf8hcMiE+uveTVbBgm93HrNP3ZDUpKqzZ4pG7TP6fmb+EMAQPjq9FqqvA==} - sucrase@3.35.0: resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} engines: {node: '>=16 || 14 >=14.17'} @@ -10726,8 +10802,8 @@ packages: tabster@8.2.0: resolution: {integrity: sha512-Gvplk/Yl/12aVFA6FPOqGcq31Qv8hbPfYO0N+6IxrRgRT6eSLsipT6gkZBYjyOwGsp6BD5XlZAuJgupfG/GHoA==} - tailwindcss@3.4.17: - resolution: {integrity: sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==} + tailwindcss@3.4.15: + resolution: {integrity: sha512-r4MeXnfBmSOuKUWmXe6h2CcyfzJCEk4F0pptO5jlnYSIViUkVmsawj80N5h2lO3gwcmSb4n3PuN+e+GC1Guylw==} engines: {node: '>=14.0.0'} hasBin: true @@ -10818,13 +10894,6 @@ packages: resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} engines: {node: '>=14.0.0'} - tldts-core@6.1.74: - resolution: {integrity: sha512-gTwtY6L2GfuxiL4CWpLknv9JDYYqBvKCk/BT5uAaAvCA0s6pzX7lr2IrkQZSUlnSjRHIjTl8ZwKCVXJ7XNRWYw==} - - tldts@6.1.74: - resolution: {integrity: sha512-O5vTZ1UmmEmrLl/59U9igitnSMlprALLaLgbv//dEvjobPT9vyURhHXKMCDLEhn3qxZFIkb9PwAfNYV0Ol7RPQ==} - hasBin: true - tmp@0.2.3: resolution: {integrity: sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==} engines: {node: '>=14.14'} @@ -10849,18 +10918,10 @@ packages: resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} engines: {node: '>=6'} - tough-cookie@5.1.0: - resolution: {integrity: sha512-rvZUv+7MoBYTiDmFPBrhL7Ujx9Sk+q9wwm22x8c8T5IJaR+Wsyc7TNxbVxo84kZoRJZZMazowFLqpankBEQrGg==} - engines: {node: '>=16'} - tr46@3.0.0: resolution: {integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==} engines: {node: '>=12'} - tr46@5.0.0: - resolution: {integrity: sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==} - engines: {node: '>=18'} - tree-kill@1.2.2: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true @@ -10875,8 +10936,8 @@ packages: trough@2.2.0: resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} - ts-api-utils@1.4.0: - resolution: {integrity: sha512-032cPxaEKwM+GT3vA5JXNzIaizx388rhsSW79vGRNGXfRRAdEAn2mvk36PvK5HnOchyWZ7afLEXqYCvPCrzuzQ==} + ts-api-utils@1.4.3: + resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==} engines: {node: '>=16'} peerDependencies: typescript: '>=4.2.0' @@ -10969,20 +11030,20 @@ packages: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} - typed-array-buffer@1.0.2: - resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} + typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} engines: {node: '>= 0.4'} - typed-array-byte-length@1.0.1: - resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} + typed-array-byte-length@1.0.3: + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} engines: {node: '>= 0.4'} - typed-array-byte-offset@1.0.2: - resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} + typed-array-byte-offset@1.0.4: + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} engines: {node: '>= 0.4'} - typed-array-length@1.0.6: - resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} + typed-array-length@1.0.7: + resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} engines: {node: '>= 0.4'} typed-rest-client@1.8.11: @@ -11044,8 +11105,9 @@ packages: ultrahtml@1.5.3: resolution: {integrity: sha512-GykOvZwgDWZlTQMtp5jrD4BVL+gNn2NVlVafjcFUJ7taY20tqYdwdoWBFy6GBJsNTZe1GkGPkSl5knQAjtgceg==} - unbox-primitive@1.0.2: - resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + unbox-primitive@1.1.0: + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} + engines: {node: '>= 0.4'} uncrypto@0.1.3: resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} @@ -11228,6 +11290,12 @@ packages: peerDependencies: browserslist: '>= 4.21.0' + update-browserslist-db@1.1.2: + resolution: {integrity: sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} @@ -11245,10 +11313,10 @@ packages: react: '>=16.8.0 <19.0.0' react-dom: '>=16.8.0 <19.0.0' - use-sync-external-store@1.4.0: - resolution: {integrity: sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw==} + use-sync-external-store@1.2.2: + resolution: {integrity: sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==} peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} @@ -11296,8 +11364,8 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - vite-node@3.0.3: - resolution: {integrity: sha512-0sQcwhwAEw/UJGojbhOrnq3HtiZ3tC7BzpAa0lx3QaTX0S3YX70iGcik25UBdB96pmdwjyY2uyKNYruxCDmiEg==} + vite-node@3.0.4: + resolution: {integrity: sha512-7JZKEzcYV2Nx3u6rlvN8qdo3QV7Fxyt6hx+CCKz9fbWxdX5IvUOmTWEAxMrWxaiSf7CKGLJQ5rFu8prb/jBjOA==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true @@ -11392,20 +11460,23 @@ packages: vite: optional: true - vitest@3.0.3: - resolution: {integrity: sha512-dWdwTFUW9rcnL0LyF2F+IfvNQWB0w9DERySCk8VMG75F8k25C7LsZoh6XfCjPvcR8Nb+Lqi9JKr6vnzH7HSrpQ==} + vitest@3.0.4: + resolution: {integrity: sha512-6XG8oTKy2gnJIFTHP6LD7ExFeNLxiTkK3CfMvT7IfR8IN+BYICCf0lXUQmX7i7JoxUP8QmeP4mTnWXgflu4yjw==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' + '@types/debug': ^4.1.12 '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - '@vitest/browser': 3.0.3 - '@vitest/ui': 3.0.3 + '@vitest/browser': 3.0.4 + '@vitest/ui': 3.0.4 happy-dom: '*' jsdom: '*' peerDependenciesMeta: '@edge-runtime/vm': optional: true + '@types/debug': + optional: true '@types/node': optional: true '@vitest/browser': @@ -11545,10 +11616,6 @@ packages: resolution: {integrity: sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg==} engines: {node: '>=12'} - w3c-xmlserializer@5.0.0: - resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} - engines: {node: '>=18'} - walk-up-path@3.0.1: resolution: {integrity: sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA==} @@ -11593,13 +11660,17 @@ packages: resolution: {integrity: sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==} engines: {node: '>=12'} - whatwg-url@14.1.0: - resolution: {integrity: sha512-jlf/foYIKywAt3x/XWKZ/3rz8OSJPiWktjmk891alJUEjiVxKX9LEO92qH3hv4aJ0mN3MWPvGMCy8jQi95xK4w==} - engines: {node: '>=18'} - which-boxed-primitive@1.0.2: resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + which-boxed-primitive@1.1.1: + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} + engines: {node: '>= 0.4'} + + which-builtin-type@1.2.1: + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} + engines: {node: '>= 0.4'} + which-collection@1.0.2: resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} engines: {node: '>= 0.4'} @@ -11616,6 +11687,10 @@ packages: resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} engines: {node: '>= 0.4'} + which-typed-array@1.1.18: + resolution: {integrity: sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==} + engines: {node: '>= 0.4'} + which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -11709,10 +11784,6 @@ packages: resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} engines: {node: '>=12'} - xml-name-validator@5.0.0: - resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} - engines: {node: '>=18'} - xml2js@0.5.0: resolution: {integrity: sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==} engines: {node: '>=4.0.0'} @@ -11832,116 +11903,116 @@ snapshots: '@adobe/css-tools@4.4.1': {} - '@algolia/autocomplete-core@1.17.9(@algolia/client-search@5.20.0)(algoliasearch@5.20.0)(search-insights@2.17.3)': + '@algolia/autocomplete-core@1.17.7(@algolia/client-search@5.15.0)(algoliasearch@5.15.0)(search-insights@2.17.3)': dependencies: - '@algolia/autocomplete-plugin-algolia-insights': 1.17.9(@algolia/client-search@5.20.0)(algoliasearch@5.20.0)(search-insights@2.17.3) - '@algolia/autocomplete-shared': 1.17.9(@algolia/client-search@5.20.0)(algoliasearch@5.20.0) + '@algolia/autocomplete-plugin-algolia-insights': 1.17.7(@algolia/client-search@5.15.0)(algoliasearch@5.15.0)(search-insights@2.17.3) + '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.15.0)(algoliasearch@5.15.0) transitivePeerDependencies: - '@algolia/client-search' - algoliasearch - search-insights - '@algolia/autocomplete-plugin-algolia-insights@1.17.9(@algolia/client-search@5.20.0)(algoliasearch@5.20.0)(search-insights@2.17.3)': + '@algolia/autocomplete-plugin-algolia-insights@1.17.7(@algolia/client-search@5.15.0)(algoliasearch@5.15.0)(search-insights@2.17.3)': dependencies: - '@algolia/autocomplete-shared': 1.17.9(@algolia/client-search@5.20.0)(algoliasearch@5.20.0) + '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.15.0)(algoliasearch@5.15.0) search-insights: 2.17.3 transitivePeerDependencies: - '@algolia/client-search' - algoliasearch - '@algolia/autocomplete-preset-algolia@1.17.9(@algolia/client-search@5.20.0)(algoliasearch@5.20.0)': + '@algolia/autocomplete-preset-algolia@1.17.7(@algolia/client-search@5.15.0)(algoliasearch@5.15.0)': dependencies: - '@algolia/autocomplete-shared': 1.17.9(@algolia/client-search@5.20.0)(algoliasearch@5.20.0) - '@algolia/client-search': 5.20.0 - algoliasearch: 5.20.0 + '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.15.0)(algoliasearch@5.15.0) + '@algolia/client-search': 5.15.0 + algoliasearch: 5.15.0 - '@algolia/autocomplete-shared@1.17.9(@algolia/client-search@5.20.0)(algoliasearch@5.20.0)': + '@algolia/autocomplete-shared@1.17.7(@algolia/client-search@5.15.0)(algoliasearch@5.15.0)': dependencies: - '@algolia/client-search': 5.20.0 - algoliasearch: 5.20.0 + '@algolia/client-search': 5.15.0 + algoliasearch: 5.15.0 - '@algolia/client-abtesting@5.20.0': + '@algolia/client-abtesting@5.15.0': dependencies: - '@algolia/client-common': 5.20.0 - '@algolia/requester-browser-xhr': 5.20.0 - '@algolia/requester-fetch': 5.20.0 - '@algolia/requester-node-http': 5.20.0 + '@algolia/client-common': 5.15.0 + '@algolia/requester-browser-xhr': 5.15.0 + '@algolia/requester-fetch': 5.15.0 + '@algolia/requester-node-http': 5.15.0 - '@algolia/client-analytics@5.20.0': + '@algolia/client-analytics@5.15.0': dependencies: - '@algolia/client-common': 5.20.0 - '@algolia/requester-browser-xhr': 5.20.0 - '@algolia/requester-fetch': 5.20.0 - '@algolia/requester-node-http': 5.20.0 + '@algolia/client-common': 5.15.0 + '@algolia/requester-browser-xhr': 5.15.0 + '@algolia/requester-fetch': 5.15.0 + '@algolia/requester-node-http': 5.15.0 - '@algolia/client-common@5.20.0': {} + '@algolia/client-common@5.15.0': {} - '@algolia/client-insights@5.20.0': + '@algolia/client-insights@5.15.0': dependencies: - '@algolia/client-common': 5.20.0 - '@algolia/requester-browser-xhr': 5.20.0 - '@algolia/requester-fetch': 5.20.0 - '@algolia/requester-node-http': 5.20.0 + '@algolia/client-common': 5.15.0 + '@algolia/requester-browser-xhr': 5.15.0 + '@algolia/requester-fetch': 5.15.0 + '@algolia/requester-node-http': 5.15.0 - '@algolia/client-personalization@5.20.0': + '@algolia/client-personalization@5.15.0': dependencies: - '@algolia/client-common': 5.20.0 - '@algolia/requester-browser-xhr': 5.20.0 - '@algolia/requester-fetch': 5.20.0 - '@algolia/requester-node-http': 5.20.0 + '@algolia/client-common': 5.15.0 + '@algolia/requester-browser-xhr': 5.15.0 + '@algolia/requester-fetch': 5.15.0 + '@algolia/requester-node-http': 5.15.0 - '@algolia/client-query-suggestions@5.20.0': + '@algolia/client-query-suggestions@5.15.0': dependencies: - '@algolia/client-common': 5.20.0 - '@algolia/requester-browser-xhr': 5.20.0 - '@algolia/requester-fetch': 5.20.0 - '@algolia/requester-node-http': 5.20.0 + '@algolia/client-common': 5.15.0 + '@algolia/requester-browser-xhr': 5.15.0 + '@algolia/requester-fetch': 5.15.0 + '@algolia/requester-node-http': 5.15.0 - '@algolia/client-search@5.20.0': + '@algolia/client-search@5.15.0': dependencies: - '@algolia/client-common': 5.20.0 - '@algolia/requester-browser-xhr': 5.20.0 - '@algolia/requester-fetch': 5.20.0 - '@algolia/requester-node-http': 5.20.0 + '@algolia/client-common': 5.15.0 + '@algolia/requester-browser-xhr': 5.15.0 + '@algolia/requester-fetch': 5.15.0 + '@algolia/requester-node-http': 5.15.0 - '@algolia/ingestion@1.20.0': + '@algolia/ingestion@1.15.0': dependencies: - '@algolia/client-common': 5.20.0 - '@algolia/requester-browser-xhr': 5.20.0 - '@algolia/requester-fetch': 5.20.0 - '@algolia/requester-node-http': 5.20.0 + '@algolia/client-common': 5.15.0 + '@algolia/requester-browser-xhr': 5.15.0 + '@algolia/requester-fetch': 5.15.0 + '@algolia/requester-node-http': 5.15.0 - '@algolia/monitoring@1.20.0': + '@algolia/monitoring@1.15.0': dependencies: - '@algolia/client-common': 5.20.0 - '@algolia/requester-browser-xhr': 5.20.0 - '@algolia/requester-fetch': 5.20.0 - '@algolia/requester-node-http': 5.20.0 + '@algolia/client-common': 5.15.0 + '@algolia/requester-browser-xhr': 5.15.0 + '@algolia/requester-fetch': 5.15.0 + '@algolia/requester-node-http': 5.15.0 - '@algolia/recommend@5.20.0': + '@algolia/recommend@5.15.0': dependencies: - '@algolia/client-common': 5.20.0 - '@algolia/requester-browser-xhr': 5.20.0 - '@algolia/requester-fetch': 5.20.0 - '@algolia/requester-node-http': 5.20.0 + '@algolia/client-common': 5.15.0 + '@algolia/requester-browser-xhr': 5.15.0 + '@algolia/requester-fetch': 5.15.0 + '@algolia/requester-node-http': 5.15.0 - '@algolia/requester-browser-xhr@5.20.0': + '@algolia/requester-browser-xhr@5.15.0': dependencies: - '@algolia/client-common': 5.20.0 + '@algolia/client-common': 5.15.0 - '@algolia/requester-fetch@5.20.0': + '@algolia/requester-fetch@5.15.0': dependencies: - '@algolia/client-common': 5.20.0 + '@algolia/client-common': 5.15.0 - '@algolia/requester-node-http@5.20.0': + '@algolia/requester-node-http@5.15.0': dependencies: - '@algolia/client-common': 5.20.0 + '@algolia/client-common': 5.15.0 '@alloc/quick-lru@5.2.0': {} '@ampproject/remapping@2.3.0': dependencies: - '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 '@antfu/install-pkg@0.4.1': @@ -11953,15 +12024,6 @@ snapshots: '@apidevtools/swagger-methods@3.0.2': {} - '@asamuzakjp/css-color@2.8.3': - dependencies: - '@csstools/css-calc': 2.1.1(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3) - '@csstools/css-color-parser': 3.0.7(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3) - '@csstools/css-parser-algorithms': 3.0.4(@csstools/css-tokenizer@3.0.3) - '@csstools/css-tokenizer': 3.0.3 - lru-cache: 10.4.3 - optional: true - '@astrojs/check@0.9.4(prettier-plugin-astro@0.14.1)(prettier@3.4.2)(typescript@5.7.3)': dependencies: '@astrojs/language-server': 2.15.4(prettier-plugin-astro@0.14.1)(prettier@3.4.2)(typescript@5.7.3) @@ -12027,12 +12089,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@astrojs/mdx@4.0.7(astro@5.1.8(@azure/identity@4.6.0)(@azure/storage-blob@12.26.0)(@types/node@22.10.7)(jiti@2.4.2)(rollup@4.31.0)(tsx@4.19.2)(typescript@5.7.3)(yaml@2.7.0))': + '@astrojs/mdx@4.0.7(astro@5.1.8(@azure/identity@4.6.0)(@azure/storage-blob@12.26.0)(@types/node@22.10.10)(jiti@1.21.6)(rollup@4.31.0)(tsx@4.19.2)(typescript@5.7.3)(yaml@2.7.0))': dependencies: '@astrojs/markdown-remark': 6.0.2 '@mdx-js/mdx': 3.1.0(acorn@8.14.0) acorn: 8.14.0 - astro: 5.1.8(@azure/identity@4.6.0)(@azure/storage-blob@12.26.0)(@types/node@22.10.7)(jiti@2.4.2)(rollup@4.31.0)(tsx@4.19.2)(typescript@5.7.3)(yaml@2.7.0) + astro: 5.1.8(@azure/identity@4.6.0)(@azure/storage-blob@12.26.0)(@types/node@22.10.10)(jiti@1.21.6)(rollup@4.31.0)(tsx@4.19.2)(typescript@5.7.3)(yaml@2.7.0) es-module-lexer: 1.6.0 estree-util-visit: 2.0.0 hast-util-to-html: 9.0.4 @@ -12050,15 +12112,15 @@ snapshots: dependencies: prismjs: 1.29.0 - '@astrojs/react@4.1.6(@types/node@22.10.7)(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(jiti@2.4.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tsx@4.19.2)(yaml@2.7.0)': + '@astrojs/react@4.1.6(@types/node@22.10.10)(@types/react-dom@18.3.1)(@types/react@18.3.12)(jiti@1.21.6)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tsx@4.19.2)(yaml@2.7.0)': dependencies: - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) - '@vitejs/plugin-react': 4.3.4(vite@6.0.11(@types/node@22.10.7)(jiti@2.4.2)(tsx@4.19.2)(yaml@2.7.0)) + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + '@vitejs/plugin-react': 4.3.4(vite@6.0.11(@types/node@22.10.10)(jiti@1.21.6)(tsx@4.19.2)(yaml@2.7.0)) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) ultrahtml: 1.5.3 - vite: 6.0.11(@types/node@22.10.7)(jiti@2.4.2)(tsx@4.19.2)(yaml@2.7.0) + vite: 6.0.11(@types/node@22.10.10)(jiti@1.21.6)(tsx@4.19.2)(yaml@2.7.0) transitivePeerDependencies: - '@types/node' - jiti @@ -12079,22 +12141,22 @@ snapshots: stream-replace-string: 2.0.0 zod: 3.23.8 - '@astrojs/starlight-tailwind@3.0.0(@astrojs/starlight@0.31.1(astro@5.1.8(@azure/identity@4.6.0)(@azure/storage-blob@12.26.0)(@types/node@22.10.7)(jiti@2.4.2)(rollup@4.31.0)(tsx@4.19.2)(typescript@5.7.3)(yaml@2.7.0)))(@astrojs/tailwind@5.1.5(astro@5.1.8(@azure/identity@4.6.0)(@azure/storage-blob@12.26.0)(@types/node@22.10.7)(jiti@2.4.2)(rollup@4.31.0)(tsx@4.19.2)(typescript@5.7.3)(yaml@2.7.0))(tailwindcss@3.4.17))(tailwindcss@3.4.17)': + '@astrojs/starlight-tailwind@3.0.0(@astrojs/starlight@0.31.1(astro@5.1.8(@azure/identity@4.6.0)(@azure/storage-blob@12.26.0)(@types/node@22.10.10)(jiti@1.21.6)(rollup@4.31.0)(tsx@4.19.2)(typescript@5.7.3)(yaml@2.7.0)))(@astrojs/tailwind@5.1.5(astro@5.1.8(@azure/identity@4.6.0)(@azure/storage-blob@12.26.0)(@types/node@22.10.10)(jiti@1.21.6)(rollup@4.31.0)(tsx@4.19.2)(typescript@5.7.3)(yaml@2.7.0))(tailwindcss@3.4.15))(tailwindcss@3.4.15)': dependencies: - '@astrojs/starlight': 0.31.1(astro@5.1.8(@azure/identity@4.6.0)(@azure/storage-blob@12.26.0)(@types/node@22.10.7)(jiti@2.4.2)(rollup@4.31.0)(tsx@4.19.2)(typescript@5.7.3)(yaml@2.7.0)) - '@astrojs/tailwind': 5.1.5(astro@5.1.8(@azure/identity@4.6.0)(@azure/storage-blob@12.26.0)(@types/node@22.10.7)(jiti@2.4.2)(rollup@4.31.0)(tsx@4.19.2)(typescript@5.7.3)(yaml@2.7.0))(tailwindcss@3.4.17) - tailwindcss: 3.4.17 + '@astrojs/starlight': 0.31.1(astro@5.1.8(@azure/identity@4.6.0)(@azure/storage-blob@12.26.0)(@types/node@22.10.10)(jiti@1.21.6)(rollup@4.31.0)(tsx@4.19.2)(typescript@5.7.3)(yaml@2.7.0)) + '@astrojs/tailwind': 5.1.5(astro@5.1.8(@azure/identity@4.6.0)(@azure/storage-blob@12.26.0)(@types/node@22.10.10)(jiti@1.21.6)(rollup@4.31.0)(tsx@4.19.2)(typescript@5.7.3)(yaml@2.7.0))(tailwindcss@3.4.15) + tailwindcss: 3.4.15 - '@astrojs/starlight@0.31.1(astro@5.1.8(@azure/identity@4.6.0)(@azure/storage-blob@12.26.0)(@types/node@22.10.7)(jiti@2.4.2)(rollup@4.31.0)(tsx@4.19.2)(typescript@5.7.3)(yaml@2.7.0))': + '@astrojs/starlight@0.31.1(astro@5.1.8(@azure/identity@4.6.0)(@azure/storage-blob@12.26.0)(@types/node@22.10.10)(jiti@1.21.6)(rollup@4.31.0)(tsx@4.19.2)(typescript@5.7.3)(yaml@2.7.0))': dependencies: - '@astrojs/mdx': 4.0.7(astro@5.1.8(@azure/identity@4.6.0)(@azure/storage-blob@12.26.0)(@types/node@22.10.7)(jiti@2.4.2)(rollup@4.31.0)(tsx@4.19.2)(typescript@5.7.3)(yaml@2.7.0)) + '@astrojs/mdx': 4.0.7(astro@5.1.8(@azure/identity@4.6.0)(@azure/storage-blob@12.26.0)(@types/node@22.10.10)(jiti@1.21.6)(rollup@4.31.0)(tsx@4.19.2)(typescript@5.7.3)(yaml@2.7.0)) '@astrojs/sitemap': 3.2.1 '@pagefind/default-ui': 1.3.0 '@types/hast': 3.0.4 '@types/js-yaml': 4.0.9 '@types/mdast': 4.0.4 - astro: 5.1.8(@azure/identity@4.6.0)(@azure/storage-blob@12.26.0)(@types/node@22.10.7)(jiti@2.4.2)(rollup@4.31.0)(tsx@4.19.2)(typescript@5.7.3)(yaml@2.7.0) - astro-expressive-code: 0.40.1(astro@5.1.8(@azure/identity@4.6.0)(@azure/storage-blob@12.26.0)(@types/node@22.10.7)(jiti@2.4.2)(rollup@4.31.0)(tsx@4.19.2)(typescript@5.7.3)(yaml@2.7.0)) + astro: 5.1.8(@azure/identity@4.6.0)(@azure/storage-blob@12.26.0)(@types/node@22.10.10)(jiti@1.21.6)(rollup@4.31.0)(tsx@4.19.2)(typescript@5.7.3)(yaml@2.7.0) + astro-expressive-code: 0.40.1(astro@5.1.8(@azure/identity@4.6.0)(@azure/storage-blob@12.26.0)(@types/node@22.10.10)(jiti@1.21.6)(rollup@4.31.0)(tsx@4.19.2)(typescript@5.7.3)(yaml@2.7.0)) bcp-47: 2.1.0 hast-util-from-html: 2.0.3 hast-util-select: 6.0.3 @@ -12115,13 +12177,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@astrojs/tailwind@5.1.5(astro@5.1.8(@azure/identity@4.6.0)(@azure/storage-blob@12.26.0)(@types/node@22.10.7)(jiti@2.4.2)(rollup@4.31.0)(tsx@4.19.2)(typescript@5.7.3)(yaml@2.7.0))(tailwindcss@3.4.17)': + '@astrojs/tailwind@5.1.5(astro@5.1.8(@azure/identity@4.6.0)(@azure/storage-blob@12.26.0)(@types/node@22.10.10)(jiti@1.21.6)(rollup@4.31.0)(tsx@4.19.2)(typescript@5.7.3)(yaml@2.7.0))(tailwindcss@3.4.15)': dependencies: - astro: 5.1.8(@azure/identity@4.6.0)(@azure/storage-blob@12.26.0)(@types/node@22.10.7)(jiti@2.4.2)(rollup@4.31.0)(tsx@4.19.2)(typescript@5.7.3)(yaml@2.7.0) + astro: 5.1.8(@azure/identity@4.6.0)(@azure/storage-blob@12.26.0)(@types/node@22.10.10)(jiti@1.21.6)(rollup@4.31.0)(tsx@4.19.2)(typescript@5.7.3)(yaml@2.7.0) autoprefixer: 10.4.20(postcss@8.5.1) postcss: 8.5.1 postcss-load-config: 4.0.2(postcss@8.5.1) - tailwindcss: 3.4.17 + tailwindcss: 3.4.15 transitivePeerDependencies: - ts-node @@ -12218,7 +12280,7 @@ snapshots: '@azure/core-tracing': 1.2.0 '@azure/core-util': 1.11.0 '@azure/logger': 1.1.4 - '@azure/msal-browser': 4.0.1 + '@azure/msal-browser': 4.0.2 '@azure/msal-node': 2.16.2 events: 3.3.0 jws: 4.0.0 @@ -12232,13 +12294,13 @@ snapshots: dependencies: tslib: 2.8.1 - '@azure/msal-browser@4.0.1': + '@azure/msal-browser@4.0.2': dependencies: - '@azure/msal-common': 15.0.1 + '@azure/msal-common': 15.0.2 '@azure/msal-common@14.16.0': {} - '@azure/msal-common@15.0.1': {} + '@azure/msal-common@15.0.2': {} '@azure/msal-node@2.16.2': dependencies: @@ -12302,16 +12364,16 @@ snapshots: '@babel/types': 7.26.0 '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 - jsesc: 3.0.2 + jsesc: 3.1.0 '@babel/helper-annotate-as-pure@7.25.9': dependencies: - '@babel/types': 7.26.0 + '@babel/types': 7.26.5 '@babel/helper-builder-binary-assignment-operator-visitor@7.25.9': dependencies: '@babel/traverse': 7.25.9 - '@babel/types': 7.26.0 + '@babel/types': 7.26.5 transitivePeerDependencies: - supports-color @@ -12357,14 +12419,14 @@ snapshots: '@babel/helper-member-expression-to-functions@7.25.9': dependencies: '@babel/traverse': 7.25.9 - '@babel/types': 7.26.0 + '@babel/types': 7.26.5 transitivePeerDependencies: - supports-color '@babel/helper-module-imports@7.25.9': dependencies: '@babel/traverse': 7.25.9 - '@babel/types': 7.26.0 + '@babel/types': 7.26.5 transitivePeerDependencies: - supports-color @@ -12379,7 +12441,7 @@ snapshots: '@babel/helper-optimise-call-expression@7.25.9': dependencies: - '@babel/types': 7.26.0 + '@babel/types': 7.26.5 '@babel/helper-plugin-utils@7.25.9': {} @@ -12404,14 +12466,14 @@ snapshots: '@babel/helper-simple-access@7.25.9': dependencies: '@babel/traverse': 7.25.9 - '@babel/types': 7.26.0 + '@babel/types': 7.26.5 transitivePeerDependencies: - supports-color '@babel/helper-skip-transparent-expression-wrappers@7.25.9': dependencies: '@babel/traverse': 7.25.9 - '@babel/types': 7.26.0 + '@babel/types': 7.26.5 transitivePeerDependencies: - supports-color @@ -12425,7 +12487,7 @@ snapshots: dependencies: '@babel/template': 7.25.9 '@babel/traverse': 7.25.9 - '@babel/types': 7.26.0 + '@babel/types': 7.26.5 transitivePeerDependencies: - supports-color @@ -12445,6 +12507,10 @@ snapshots: dependencies: '@babel/types': 7.26.0 + '@babel/parser@7.26.5': + dependencies: + '@babel/types': 7.26.5 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 @@ -12935,7 +13001,7 @@ snapshots: babel-plugin-polyfill-corejs2: 0.4.12(@babel/core@7.26.0) babel-plugin-polyfill-corejs3: 0.10.6(@babel/core@7.26.0) babel-plugin-polyfill-regenerator: 0.6.3(@babel/core@7.26.0) - core-js-compat: 3.39.0 + core-js-compat: 3.40.0 semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -12951,7 +13017,7 @@ snapshots: dependencies: '@babel/core': 7.26.0 '@babel/helper-plugin-utils': 7.25.9 - '@babel/types': 7.26.0 + '@babel/types': 7.26.5 esutils: 2.0.3 '@babel/preset-typescript@7.26.0(@babel/core@7.26.0)': @@ -13001,6 +13067,11 @@ snapshots: '@babel/helper-string-parser': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 + '@babel/types@7.26.5': + dependencies: + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + '@bcoe/v8-coverage@1.0.2': {} '@braintree/sanitize-url@7.1.0': {} @@ -13045,10 +13116,10 @@ snapshots: '@chronus/github@0.4.5': dependencies: '@chronus/chronus': 0.14.0 - '@octokit/graphql': 8.1.1 - '@octokit/rest': 21.0.2 + '@octokit/graphql': 8.1.2 + '@octokit/rest': 21.1.0 cross-spawn: 7.0.6 - octokit: 4.0.2 + octokit: 4.1.0 picocolors: 1.1.1 yargs: 17.7.2 transitivePeerDependencies: @@ -13268,31 +13339,6 @@ snapshots: '@cspell/url@8.17.2': {} - '@csstools/color-helpers@5.0.1': - optional: true - - '@csstools/css-calc@2.1.1(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)': - dependencies: - '@csstools/css-parser-algorithms': 3.0.4(@csstools/css-tokenizer@3.0.3) - '@csstools/css-tokenizer': 3.0.3 - optional: true - - '@csstools/css-color-parser@3.0.7(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)': - dependencies: - '@csstools/color-helpers': 5.0.1 - '@csstools/css-calc': 2.1.1(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3) - '@csstools/css-parser-algorithms': 3.0.4(@csstools/css-tokenizer@3.0.3) - '@csstools/css-tokenizer': 3.0.3 - optional: true - - '@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3)': - dependencies: - '@csstools/css-tokenizer': 3.0.3 - optional: true - - '@csstools/css-tokenizer@3.0.3': - optional: true - '@ctrl/tinycolor@4.1.0': {} '@dabh/diagnostics@2.0.3': @@ -13301,11 +13347,11 @@ snapshots: enabled: 2.0.0 kuler: 2.0.0 - '@docsearch/css@3.8.3': {} + '@docsearch/css@3.8.0': {} - '@docsearch/js@3.8.3(@algolia/client-search@5.20.0)(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)': + '@docsearch/js@3.8.0(@algolia/client-search@5.15.0)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)': dependencies: - '@docsearch/react': 3.8.3(@algolia/client-search@5.20.0)(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3) + '@docsearch/react': 3.8.0(@algolia/client-search@5.15.0)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3) preact: 10.24.3 transitivePeerDependencies: - '@algolia/client-search' @@ -13314,14 +13360,14 @@ snapshots: - react-dom - search-insights - '@docsearch/react@3.8.3(@algolia/client-search@5.20.0)(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)': + '@docsearch/react@3.8.0(@algolia/client-search@5.15.0)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)': dependencies: - '@algolia/autocomplete-core': 1.17.9(@algolia/client-search@5.20.0)(algoliasearch@5.20.0)(search-insights@2.17.3) - '@algolia/autocomplete-preset-algolia': 1.17.9(@algolia/client-search@5.20.0)(algoliasearch@5.20.0) - '@docsearch/css': 3.8.3 - algoliasearch: 5.20.0 + '@algolia/autocomplete-core': 1.17.7(@algolia/client-search@5.15.0)(algoliasearch@5.15.0)(search-insights@2.17.3) + '@algolia/autocomplete-preset-algolia': 1.17.7(@algolia/client-search@5.15.0)(algoliasearch@5.15.0) + '@docsearch/css': 3.8.0 + algoliasearch: 5.15.0 optionalDependencies: - '@types/react': 18.3.18 + '@types/react': 18.3.12 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) search-insights: 2.17.3 @@ -13389,7 +13435,7 @@ snapshots: '@emotion/memoize@0.9.0': {} - '@emotion/react@11.14.0(@types/react@18.3.18)(react@18.3.1)': + '@emotion/react@11.14.0(@types/react@18.3.12)(react@18.3.1)': dependencies: '@babel/runtime': 7.26.0 '@emotion/babel-plugin': 11.13.5 @@ -13401,7 +13447,7 @@ snapshots: hoist-non-react-statics: 3.3.2 react: 18.3.1 optionalDependencies: - '@types/react': 18.3.18 + '@types/react': 18.3.12 transitivePeerDependencies: - supports-color @@ -13591,16 +13637,16 @@ snapshots: '@esfx/disposable@1.0.0': {} - '@eslint-community/eslint-utils@4.4.1(eslint@9.18.0(jiti@2.4.2))': + '@eslint-community/eslint-utils@4.4.1(eslint@9.18.0(jiti@1.21.6))': dependencies: - eslint: 9.18.0(jiti@2.4.2) + eslint: 9.18.0(jiti@1.21.6) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} - '@eslint/config-array@0.19.0': + '@eslint/config-array@0.19.1': dependencies: - '@eslint/object-schema': 2.1.4 + '@eslint/object-schema': 2.1.5 debug: 4.4.0(supports-color@8.1.1) minimatch: 3.1.2 transitivePeerDependencies: @@ -13626,7 +13672,7 @@ snapshots: '@eslint/js@9.18.0': {} - '@eslint/object-schema@2.1.4': {} + '@eslint/object-schema@2.1.5': {} '@eslint/plugin-kit@0.2.5': dependencies: @@ -13658,20 +13704,20 @@ snapshots: dependencies: '@expressive-code/core': 0.40.1 - '@floating-ui/core@1.6.9': + '@floating-ui/core@1.6.8': dependencies: - '@floating-ui/utils': 0.2.9 + '@floating-ui/utils': 0.2.8 - '@floating-ui/devtools@0.2.1(@floating-ui/dom@1.6.13)': + '@floating-ui/devtools@0.2.1(@floating-ui/dom@1.6.12)': dependencies: - '@floating-ui/dom': 1.6.13 + '@floating-ui/dom': 1.6.12 - '@floating-ui/dom@1.6.13': + '@floating-ui/dom@1.6.12': dependencies: - '@floating-ui/core': 1.6.9 - '@floating-ui/utils': 0.2.9 + '@floating-ui/core': 1.6.8 + '@floating-ui/utils': 0.2.8 - '@floating-ui/utils@0.2.9': {} + '@floating-ui/utils@0.2.8': {} '@fluentui/keyboard-keys@9.0.8': dependencies: @@ -13681,400 +13727,354 @@ snapshots: dependencies: '@swc/helpers': 0.5.15 - '@fluentui/react-accordion@9.5.14(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0)': + '@fluentui/react-accordion@9.5.14(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': dependencies: - '@fluentui/react-aria': 9.13.14(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-context-selector': 9.1.72(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) + '@fluentui/react-aria': 9.13.14(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-context-selector': 9.1.72(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) '@fluentui/react-icons': 2.0.271(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-motion': 9.6.7(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-motion-components-preview': 0.4.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-tabster': 9.23.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.12)(react@18.3.1) + '@fluentui/react-motion': 9.6.7(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-motion-components-preview': 0.4.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.12)(react@18.3.1) + '@fluentui/react-tabster': 9.23.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.20(@types/react@18.3.18)(react@18.3.1) + '@fluentui/react-utilities': 9.18.20(@types/react@18.3.12)(react@18.3.1) '@griffel/react': 1.5.27(react@18.3.1) '@swc/helpers': 0.5.15 - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) transitivePeerDependencies: - scheduler - '@fluentui/react-alert@9.0.0-beta.124(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0)': + '@fluentui/react-alert@9.0.0-beta.124(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': dependencies: - '@fluentui/react-avatar': 9.6.49(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) - '@fluentui/react-button': 9.3.100(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-avatar': 9.6.49(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-button': 9.3.100(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@fluentui/react-icons': 2.0.271(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-tabster': 9.23.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.0.46(@types/react@18.3.12)(react@18.3.1) + '@fluentui/react-tabster': 9.23.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.20(@types/react@18.3.18)(react@18.3.1) + '@fluentui/react-utilities': 9.18.20(@types/react@18.3.12)(react@18.3.1) '@griffel/react': 1.5.27(react@18.3.1) '@swc/helpers': 0.5.15 - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) transitivePeerDependencies: - scheduler - '@fluentui/react-aria@9.13.14(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@fluentui/react-aria@9.13.14(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@fluentui/keyboard-keys': 9.0.8 - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-tabster': 9.23.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-utilities': 9.18.20(@types/react@18.3.18)(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.12)(react@18.3.1) + '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.12)(react@18.3.1) + '@fluentui/react-tabster': 9.23.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-utilities': 9.18.20(@types/react@18.3.12)(react@18.3.1) '@swc/helpers': 0.5.15 - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@fluentui/react-avatar@9.6.49(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0)': + '@fluentui/react-avatar@9.6.49(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': dependencies: - '@fluentui/react-badge': 9.2.50(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-context-selector': 9.1.72(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) + '@fluentui/react-badge': 9.2.50(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-context-selector': 9.1.72(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) '@fluentui/react-icons': 2.0.271(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-popover': 9.9.31(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-tabster': 9.23.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.12)(react@18.3.1) + '@fluentui/react-popover': 9.9.31(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.12)(react@18.3.1) + '@fluentui/react-tabster': 9.23.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-tooltip': 9.5.4(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-utilities': 9.18.20(@types/react@18.3.18)(react@18.3.1) + '@fluentui/react-tooltip': 9.5.4(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-utilities': 9.18.20(@types/react@18.3.12)(react@18.3.1) '@griffel/react': 1.5.27(react@18.3.1) '@swc/helpers': 0.5.15 - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) transitivePeerDependencies: - scheduler - '@fluentui/react-badge@9.2.50(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@fluentui/react-badge@9.2.50(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@fluentui/react-icons': 2.0.271(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.18)(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.12)(react@18.3.1) + '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.12)(react@18.3.1) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.20(@types/react@18.3.18)(react@18.3.1) + '@fluentui/react-utilities': 9.18.20(@types/react@18.3.12)(react@18.3.1) '@griffel/react': 1.5.27(react@18.3.1) '@swc/helpers': 0.5.15 - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@fluentui/react-breadcrumb@9.0.49(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@fluentui/react-breadcrumb@9.0.49(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@fluentui/react-aria': 9.13.14(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-button': 9.3.100(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-aria': 9.13.14(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-button': 9.3.100(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@fluentui/react-icons': 2.0.271(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-link': 9.3.7(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-tabster': 9.23.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.12)(react@18.3.1) + '@fluentui/react-link': 9.3.7(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.12)(react@18.3.1) + '@fluentui/react-tabster': 9.23.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.20(@types/react@18.3.18)(react@18.3.1) + '@fluentui/react-utilities': 9.18.20(@types/react@18.3.12)(react@18.3.1) '@griffel/react': 1.5.27(react@18.3.1) '@swc/helpers': 0.5.15 - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@fluentui/react-button@9.3.100(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@fluentui/react-button@9.3.100(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@fluentui/keyboard-keys': 9.0.8 - '@fluentui/react-aria': 9.13.14(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-aria': 9.13.14(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@fluentui/react-icons': 2.0.271(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-tabster': 9.23.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.12)(react@18.3.1) + '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.12)(react@18.3.1) + '@fluentui/react-tabster': 9.23.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.20(@types/react@18.3.18)(react@18.3.1) + '@fluentui/react-utilities': 9.18.20(@types/react@18.3.12)(react@18.3.1) '@griffel/react': 1.5.27(react@18.3.1) '@swc/helpers': 0.5.15 - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@fluentui/react-card@9.0.102(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@fluentui/react-card@9.0.102(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@fluentui/keyboard-keys': 9.0.8 - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-tabster': 9.23.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-text': 9.4.32(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.12)(react@18.3.1) + '@fluentui/react-tabster': 9.23.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-text': 9.4.32(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.20(@types/react@18.3.18)(react@18.3.1) + '@fluentui/react-utilities': 9.18.20(@types/react@18.3.12)(react@18.3.1) '@griffel/react': 1.5.27(react@18.3.1) '@swc/helpers': 0.5.15 - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@fluentui/react-carousel@9.4.5(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0)': + '@fluentui/react-carousel@9.4.5(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': dependencies: - '@fluentui/react-aria': 9.13.14(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-button': 9.3.100(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-context-selector': 9.1.72(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) + '@fluentui/react-aria': 9.13.14(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-button': 9.3.100(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-context-selector': 9.1.72(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) '@fluentui/react-icons': 2.0.271(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-tabster': 9.23.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.12)(react@18.3.1) + '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.12)(react@18.3.1) + '@fluentui/react-tabster': 9.23.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.20(@types/react@18.3.18)(react@18.3.1) + '@fluentui/react-utilities': 9.18.20(@types/react@18.3.12)(react@18.3.1) '@griffel/react': 1.5.27(react@18.3.1) '@swc/helpers': 0.5.15 - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) - embla-carousel: 8.5.2 - embla-carousel-autoplay: 8.5.2(embla-carousel@8.5.2) - embla-carousel-fade: 8.5.2(embla-carousel@8.5.2) + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + embla-carousel: 8.5.1 + embla-carousel-autoplay: 8.5.1(embla-carousel@8.5.1) + embla-carousel-fade: 8.5.1(embla-carousel@8.5.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) transitivePeerDependencies: - scheduler - '@fluentui/react-checkbox@9.2.45(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0)': + '@fluentui/react-checkbox@9.2.46(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': dependencies: - '@fluentui/react-field': 9.1.84(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) + '@fluentui/react-field': 9.1.85(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) '@fluentui/react-icons': 2.0.271(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.49(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-label': 9.1.82(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-tabster': 9.23.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.12)(react@18.3.1) + '@fluentui/react-label': 9.1.83(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.12)(react@18.3.1) + '@fluentui/react-tabster': 9.23.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.19(@types/react@18.3.18)(react@18.3.1) + '@fluentui/react-utilities': 9.18.20(@types/react@18.3.12)(react@18.3.1) '@griffel/react': 1.5.27(react@18.3.1) '@swc/helpers': 0.5.15 - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) transitivePeerDependencies: - scheduler - '@fluentui/react-checkbox@9.2.46(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0)': - dependencies: - '@fluentui/react-field': 9.1.85(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) - '@fluentui/react-icons': 2.0.271(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-label': 9.1.83(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-tabster': 9.23.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.20(@types/react@18.3.18)(react@18.3.1) - '@griffel/react': 1.5.27(react@18.3.1) - '@swc/helpers': 0.5.15 - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - scheduler - - '@fluentui/react-combobox@9.13.17(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0)': + '@fluentui/react-combobox@9.13.17(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': dependencies: '@fluentui/keyboard-keys': 9.0.8 - '@fluentui/react-aria': 9.13.14(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-context-selector': 9.1.72(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) - '@fluentui/react-field': 9.1.85(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) + '@fluentui/react-aria': 9.13.14(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-context-selector': 9.1.72(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-field': 9.1.85(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) '@fluentui/react-icons': 2.0.271(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-portal': 9.4.42(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-positioning': 9.16.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-tabster': 9.23.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.12)(react@18.3.1) + '@fluentui/react-portal': 9.4.42(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-positioning': 9.16.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.12)(react@18.3.1) + '@fluentui/react-tabster': 9.23.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.20(@types/react@18.3.18)(react@18.3.1) + '@fluentui/react-utilities': 9.18.20(@types/react@18.3.12)(react@18.3.1) '@griffel/react': 1.5.27(react@18.3.1) '@swc/helpers': 0.5.15 - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) transitivePeerDependencies: - scheduler - '@fluentui/react-components@9.57.0(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0)': - dependencies: - '@fluentui/react-accordion': 9.5.14(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) - '@fluentui/react-alert': 9.0.0-beta.124(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) - '@fluentui/react-aria': 9.13.14(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-avatar': 9.6.49(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) - '@fluentui/react-badge': 9.2.50(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-breadcrumb': 9.0.49(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-button': 9.3.100(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-card': 9.0.102(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-carousel': 9.4.5(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) - '@fluentui/react-checkbox': 9.2.46(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) - '@fluentui/react-combobox': 9.13.17(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) - '@fluentui/react-dialog': 9.11.28(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) - '@fluentui/react-divider': 9.2.82(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-drawer': 9.6.8(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) - '@fluentui/react-field': 9.1.85(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) - '@fluentui/react-image': 9.1.80(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-infobutton': 9.0.0-beta.102(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) - '@fluentui/react-infolabel': 9.0.56(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) - '@fluentui/react-input': 9.4.98(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) - '@fluentui/react-label': 9.1.83(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-link': 9.3.7(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-list': 9.0.0(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) - '@fluentui/react-menu': 9.14.26(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) - '@fluentui/react-message-bar': 9.3.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-motion': 9.6.7(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-overflow': 9.2.7(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) - '@fluentui/react-persona': 9.2.108(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) - '@fluentui/react-popover': 9.9.31(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) - '@fluentui/react-portal': 9.4.42(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-positioning': 9.16.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-progress': 9.1.96(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) - '@fluentui/react-provider': 9.19.0(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-radio': 9.2.41(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) - '@fluentui/react-rating': 9.0.28(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-search': 9.0.28(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) - '@fluentui/react-select': 9.1.96(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-skeleton': 9.1.25(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) - '@fluentui/react-slider': 9.2.5(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) - '@fluentui/react-spinbutton': 9.2.97(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) - '@fluentui/react-spinner': 9.5.7(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-swatch-picker': 9.1.19(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) - '@fluentui/react-switch': 9.1.103(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) - '@fluentui/react-table': 9.15.28(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) - '@fluentui/react-tabs': 9.6.7(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) - '@fluentui/react-tabster': 9.23.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-tag-picker': 9.4.0(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) - '@fluentui/react-tags': 9.3.29(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) - '@fluentui/react-teaching-popover': 9.2.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) - '@fluentui/react-text': 9.4.32(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-textarea': 9.3.97(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) + '@fluentui/react-components@9.57.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': + dependencies: + '@fluentui/react-accordion': 9.5.14(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-alert': 9.0.0-beta.124(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-aria': 9.13.14(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-avatar': 9.6.49(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-badge': 9.2.50(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-breadcrumb': 9.0.49(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-button': 9.3.100(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-card': 9.0.102(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-carousel': 9.4.5(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-checkbox': 9.2.46(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-combobox': 9.13.17(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-dialog': 9.11.28(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-divider': 9.2.82(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-drawer': 9.6.8(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-field': 9.1.85(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-image': 9.1.80(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-infobutton': 9.0.0-beta.102(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-infolabel': 9.0.56(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-input': 9.4.98(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-label': 9.1.83(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-link': 9.3.7(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-list': 9.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-menu': 9.14.26(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-message-bar': 9.3.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-motion': 9.6.7(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-overflow': 9.2.7(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-persona': 9.2.108(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-popover': 9.9.31(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-portal': 9.4.42(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-positioning': 9.16.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-progress': 9.1.96(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-provider': 9.19.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-radio': 9.2.41(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-rating': 9.0.28(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-search': 9.0.28(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-select': 9.1.96(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.12)(react@18.3.1) + '@fluentui/react-skeleton': 9.1.25(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-slider': 9.2.5(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-spinbutton': 9.2.97(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-spinner': 9.5.7(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-swatch-picker': 9.1.19(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-switch': 9.1.103(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-table': 9.15.28(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-tabs': 9.6.7(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-tabster': 9.23.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-tag-picker': 9.4.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-tags': 9.3.29(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-teaching-popover': 9.2.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-text': 9.4.32(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-textarea': 9.3.97(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-toast': 9.3.65(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-toolbar': 9.2.15(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) - '@fluentui/react-tooltip': 9.5.4(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-tree': 9.9.0(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) - '@fluentui/react-utilities': 9.18.20(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-virtualizer': 9.0.0-alpha.90(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-toast': 9.3.65(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-toolbar': 9.2.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-tooltip': 9.5.4(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-tree': 9.9.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-utilities': 9.18.20(@types/react@18.3.12)(react@18.3.1) + '@fluentui/react-virtualizer': 9.0.0-alpha.90(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@griffel/react': 1.5.27(react@18.3.1) '@swc/helpers': 0.5.15 - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) transitivePeerDependencies: - scheduler - '@fluentui/react-context-selector@9.1.71(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0)': - dependencies: - '@fluentui/react-utilities': 9.18.19(@types/react@18.3.18)(react@18.3.1) - '@swc/helpers': 0.5.15 - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - scheduler: 0.25.0 - - '@fluentui/react-context-selector@9.1.72(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0)': + '@fluentui/react-context-selector@9.1.72(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': dependencies: - '@fluentui/react-utilities': 9.18.20(@types/react@18.3.18)(react@18.3.1) + '@fluentui/react-utilities': 9.18.20(@types/react@18.3.12)(react@18.3.1) '@swc/helpers': 0.5.15 - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - scheduler: 0.25.0 + scheduler: 0.23.2 - '@fluentui/react-dialog@9.11.28(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0)': + '@fluentui/react-dialog@9.11.28(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': dependencies: '@fluentui/keyboard-keys': 9.0.8 - '@fluentui/react-aria': 9.13.14(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-context-selector': 9.1.72(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) + '@fluentui/react-aria': 9.13.14(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-context-selector': 9.1.72(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) '@fluentui/react-icons': 2.0.271(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-motion': 9.6.7(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-motion-components-preview': 0.4.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-portal': 9.4.42(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-tabster': 9.23.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.12)(react@18.3.1) + '@fluentui/react-motion': 9.6.7(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-motion-components-preview': 0.4.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-portal': 9.4.42(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.12)(react@18.3.1) + '@fluentui/react-tabster': 9.23.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.20(@types/react@18.3.18)(react@18.3.1) + '@fluentui/react-utilities': 9.18.20(@types/react@18.3.12)(react@18.3.1) '@griffel/react': 1.5.27(react@18.3.1) '@swc/helpers': 0.5.15 - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) transitivePeerDependencies: - scheduler - '@fluentui/react-divider@9.2.82(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@fluentui/react-divider@9.2.82(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.18)(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.12)(react@18.3.1) + '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.12)(react@18.3.1) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.20(@types/react@18.3.18)(react@18.3.1) + '@fluentui/react-utilities': 9.18.20(@types/react@18.3.12)(react@18.3.1) '@griffel/react': 1.5.27(react@18.3.1) '@swc/helpers': 0.5.15 - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@fluentui/react-drawer@9.6.8(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0)': + '@fluentui/react-drawer@9.6.8(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': dependencies: - '@fluentui/react-dialog': 9.11.28(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-motion': 9.6.7(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-portal': 9.4.42(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-tabster': 9.23.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-dialog': 9.11.28(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.12)(react@18.3.1) + '@fluentui/react-motion': 9.6.7(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-portal': 9.4.42(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.12)(react@18.3.1) + '@fluentui/react-tabster': 9.23.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.20(@types/react@18.3.18)(react@18.3.1) + '@fluentui/react-utilities': 9.18.20(@types/react@18.3.12)(react@18.3.1) '@griffel/react': 1.5.27(react@18.3.1) '@swc/helpers': 0.5.15 - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) transitivePeerDependencies: - scheduler - '@fluentui/react-field@9.1.84(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0)': + '@fluentui/react-field@9.1.85(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': dependencies: - '@fluentui/react-context-selector': 9.1.71(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) + '@fluentui/react-context-selector': 9.1.72(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) '@fluentui/react-icons': 2.0.271(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.49(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-label': 9.1.82(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.12)(react@18.3.1) + '@fluentui/react-label': 9.1.83(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.19(@types/react@18.3.18)(react@18.3.1) + '@fluentui/react-utilities': 9.18.20(@types/react@18.3.12)(react@18.3.1) '@griffel/react': 1.5.27(react@18.3.1) '@swc/helpers': 0.5.15 - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - scheduler - - '@fluentui/react-field@9.1.85(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0)': - dependencies: - '@fluentui/react-context-selector': 9.1.72(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) - '@fluentui/react-icons': 2.0.271(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-label': 9.1.83(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.20(@types/react@18.3.18)(react@18.3.1) - '@griffel/react': 1.5.27(react@18.3.1) - '@swc/helpers': 0.5.15 - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) transitivePeerDependencies: @@ -14086,672 +14086,645 @@ snapshots: react: 18.3.1 tslib: 2.8.1 - '@fluentui/react-image@9.1.80(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@fluentui/react-image@9.1.80(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.18)(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.12)(react@18.3.1) + '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.12)(react@18.3.1) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.20(@types/react@18.3.18)(react@18.3.1) + '@fluentui/react-utilities': 9.18.20(@types/react@18.3.12)(react@18.3.1) '@griffel/react': 1.5.27(react@18.3.1) '@swc/helpers': 0.5.15 - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@fluentui/react-infobutton@9.0.0-beta.102(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0)': + '@fluentui/react-infobutton@9.0.0-beta.102(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': dependencies: '@fluentui/react-icons': 2.0.271(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-label': 9.1.83(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-popover': 9.9.31(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) - '@fluentui/react-tabster': 9.23.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.0.46(@types/react@18.3.12)(react@18.3.1) + '@fluentui/react-label': 9.1.83(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-popover': 9.9.31(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-tabster': 9.23.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.20(@types/react@18.3.18)(react@18.3.1) + '@fluentui/react-utilities': 9.18.20(@types/react@18.3.12)(react@18.3.1) '@griffel/react': 1.5.27(react@18.3.1) '@swc/helpers': 0.5.15 - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) transitivePeerDependencies: - scheduler - '@fluentui/react-infolabel@9.0.56(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0)': + '@fluentui/react-infolabel@9.0.56(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': dependencies: '@fluentui/react-icons': 2.0.271(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-label': 9.1.83(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-popover': 9.9.31(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) - '@fluentui/react-tabster': 9.23.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.12)(react@18.3.1) + '@fluentui/react-label': 9.1.83(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-popover': 9.9.31(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-tabster': 9.23.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.20(@types/react@18.3.18)(react@18.3.1) + '@fluentui/react-utilities': 9.18.20(@types/react@18.3.12)(react@18.3.1) '@griffel/react': 1.5.27(react@18.3.1) '@swc/helpers': 0.5.15 - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) transitivePeerDependencies: - scheduler - '@fluentui/react-input@9.4.98(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0)': + '@fluentui/react-input@9.4.98(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': dependencies: - '@fluentui/react-field': 9.1.85(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.18)(react@18.3.1) + '@fluentui/react-field': 9.1.85(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.12)(react@18.3.1) + '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.12)(react@18.3.1) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.20(@types/react@18.3.18)(react@18.3.1) + '@fluentui/react-utilities': 9.18.20(@types/react@18.3.12)(react@18.3.1) '@griffel/react': 1.5.27(react@18.3.1) '@swc/helpers': 0.5.15 - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) transitivePeerDependencies: - scheduler - '@fluentui/react-jsx-runtime@9.0.49(@types/react@18.3.18)(react@18.3.1)': + '@fluentui/react-jsx-runtime@9.0.46(@types/react@18.3.12)(react@18.3.1)': dependencies: - '@fluentui/react-utilities': 9.18.19(@types/react@18.3.18)(react@18.3.1) + '@fluentui/react-utilities': 9.18.20(@types/react@18.3.12)(react@18.3.1) '@swc/helpers': 0.5.15 - '@types/react': 18.3.18 + '@types/react': 18.3.12 react: 18.3.1 react-is: 17.0.2 - '@fluentui/react-jsx-runtime@9.0.50(@types/react@18.3.18)(react@18.3.1)': + '@fluentui/react-jsx-runtime@9.0.50(@types/react@18.3.12)(react@18.3.1)': dependencies: - '@fluentui/react-utilities': 9.18.20(@types/react@18.3.18)(react@18.3.1) + '@fluentui/react-utilities': 9.18.20(@types/react@18.3.12)(react@18.3.1) '@swc/helpers': 0.5.15 - '@types/react': 18.3.18 + '@types/react': 18.3.12 react: 18.3.1 react-is: 17.0.2 - '@fluentui/react-label@9.1.82(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@fluentui/react-jsx-runtime': 9.0.49(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.19(@types/react@18.3.18)(react@18.3.1) - '@griffel/react': 1.5.27(react@18.3.1) - '@swc/helpers': 0.5.15 - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - '@fluentui/react-label@9.1.83(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@fluentui/react-label@9.1.83(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.18)(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.12)(react@18.3.1) + '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.12)(react@18.3.1) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.20(@types/react@18.3.18)(react@18.3.1) + '@fluentui/react-utilities': 9.18.20(@types/react@18.3.12)(react@18.3.1) '@griffel/react': 1.5.27(react@18.3.1) '@swc/helpers': 0.5.15 - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@fluentui/react-link@9.3.7(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@fluentui/react-link@9.3.7(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@fluentui/keyboard-keys': 9.0.8 - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-tabster': 9.23.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.12)(react@18.3.1) + '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.12)(react@18.3.1) + '@fluentui/react-tabster': 9.23.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.20(@types/react@18.3.18)(react@18.3.1) + '@fluentui/react-utilities': 9.18.20(@types/react@18.3.12)(react@18.3.1) '@griffel/react': 1.5.27(react@18.3.1) '@swc/helpers': 0.5.15 - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@fluentui/react-list-preview@0.4.4(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0)': + '@fluentui/react-list-preview@0.4.4(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': dependencies: '@fluentui/keyboard-keys': 9.0.8 - '@fluentui/react-checkbox': 9.2.45(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) - '@fluentui/react-context-selector': 9.1.71(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) - '@fluentui/react-jsx-runtime': 9.0.49(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-tabster': 9.23.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-checkbox': 9.2.46(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-context-selector': 9.1.72(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.12)(react@18.3.1) + '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.12)(react@18.3.1) + '@fluentui/react-tabster': 9.23.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.19(@types/react@18.3.18)(react@18.3.1) + '@fluentui/react-utilities': 9.18.20(@types/react@18.3.12)(react@18.3.1) '@griffel/react': 1.5.27(react@18.3.1) '@swc/helpers': 0.5.15 - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) transitivePeerDependencies: - scheduler - '@fluentui/react-list@9.0.0(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0)': + '@fluentui/react-list@9.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': dependencies: '@fluentui/keyboard-keys': 9.0.8 - '@fluentui/react-checkbox': 9.2.46(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) - '@fluentui/react-context-selector': 9.1.72(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-tabster': 9.23.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-checkbox': 9.2.46(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-context-selector': 9.1.72(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.12)(react@18.3.1) + '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.12)(react@18.3.1) + '@fluentui/react-tabster': 9.23.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.20(@types/react@18.3.18)(react@18.3.1) + '@fluentui/react-utilities': 9.18.20(@types/react@18.3.12)(react@18.3.1) '@griffel/react': 1.5.27(react@18.3.1) '@swc/helpers': 0.5.15 - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) transitivePeerDependencies: - scheduler - '@fluentui/react-menu@9.14.26(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0)': + '@fluentui/react-menu@9.14.26(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': dependencies: '@fluentui/keyboard-keys': 9.0.8 - '@fluentui/react-aria': 9.13.14(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-context-selector': 9.1.72(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) + '@fluentui/react-aria': 9.13.14(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-context-selector': 9.1.72(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) '@fluentui/react-icons': 2.0.271(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-portal': 9.4.42(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-positioning': 9.16.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-tabster': 9.23.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.12)(react@18.3.1) + '@fluentui/react-portal': 9.4.42(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-positioning': 9.16.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.12)(react@18.3.1) + '@fluentui/react-tabster': 9.23.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.20(@types/react@18.3.18)(react@18.3.1) + '@fluentui/react-utilities': 9.18.20(@types/react@18.3.12)(react@18.3.1) '@griffel/react': 1.5.27(react@18.3.1) '@swc/helpers': 0.5.15 - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) transitivePeerDependencies: - scheduler - '@fluentui/react-message-bar@9.3.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@fluentui/react-message-bar@9.3.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@fluentui/react-button': 9.3.100(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-button': 9.3.100(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@fluentui/react-icons': 2.0.271(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-link': 9.3.7(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-motion': 9.6.7(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-motion-components-preview': 0.4.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.18)(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.12)(react@18.3.1) + '@fluentui/react-link': 9.3.7(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-motion': 9.6.7(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-motion-components-preview': 0.4.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.12)(react@18.3.1) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.20(@types/react@18.3.18)(react@18.3.1) + '@fluentui/react-utilities': 9.18.20(@types/react@18.3.12)(react@18.3.1) '@griffel/react': 1.5.27(react@18.3.1) '@swc/helpers': 0.5.15 - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@fluentui/react-motion-components-preview@0.4.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@fluentui/react-motion-components-preview@0.4.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@fluentui/react-motion': 9.6.7(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-motion': 9.6.7(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@swc/helpers': 0.5.15 - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@fluentui/react-motion@9.6.7(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@fluentui/react-motion@9.6.7(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-utilities': 9.18.20(@types/react@18.3.18)(react@18.3.1) + '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.12)(react@18.3.1) + '@fluentui/react-utilities': 9.18.20(@types/react@18.3.12)(react@18.3.1) '@swc/helpers': 0.5.15 - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) react-is: 17.0.2 - '@fluentui/react-overflow@9.2.7(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0)': + '@fluentui/react-overflow@9.2.7(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': dependencies: '@fluentui/priority-overflow': 9.1.14 - '@fluentui/react-context-selector': 9.1.72(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) + '@fluentui/react-context-selector': 9.1.72(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.20(@types/react@18.3.18)(react@18.3.1) + '@fluentui/react-utilities': 9.18.20(@types/react@18.3.12)(react@18.3.1) '@griffel/react': 1.5.27(react@18.3.1) '@swc/helpers': 0.5.15 - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) transitivePeerDependencies: - scheduler - '@fluentui/react-persona@9.2.108(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0)': + '@fluentui/react-persona@9.2.108(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': dependencies: - '@fluentui/react-avatar': 9.6.49(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) - '@fluentui/react-badge': 9.2.50(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.18)(react@18.3.1) + '@fluentui/react-avatar': 9.6.49(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-badge': 9.2.50(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.12)(react@18.3.1) + '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.12)(react@18.3.1) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.20(@types/react@18.3.18)(react@18.3.1) + '@fluentui/react-utilities': 9.18.20(@types/react@18.3.12)(react@18.3.1) '@griffel/react': 1.5.27(react@18.3.1) '@swc/helpers': 0.5.15 - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) transitivePeerDependencies: - scheduler - '@fluentui/react-popover@9.9.31(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0)': + '@fluentui/react-popover@9.9.31(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': dependencies: '@fluentui/keyboard-keys': 9.0.8 - '@fluentui/react-aria': 9.13.14(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-context-selector': 9.1.72(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-portal': 9.4.42(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-positioning': 9.16.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-tabster': 9.23.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-aria': 9.13.14(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-context-selector': 9.1.72(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.12)(react@18.3.1) + '@fluentui/react-portal': 9.4.42(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-positioning': 9.16.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.12)(react@18.3.1) + '@fluentui/react-tabster': 9.23.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.20(@types/react@18.3.18)(react@18.3.1) + '@fluentui/react-utilities': 9.18.20(@types/react@18.3.12)(react@18.3.1) '@griffel/react': 1.5.27(react@18.3.1) '@swc/helpers': 0.5.15 - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) transitivePeerDependencies: - scheduler - '@fluentui/react-portal@9.4.42(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@fluentui/react-portal@9.4.42(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-tabster': 9.23.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-utilities': 9.18.20(@types/react@18.3.18)(react@18.3.1) + '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.12)(react@18.3.1) + '@fluentui/react-tabster': 9.23.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-utilities': 9.18.20(@types/react@18.3.12)(react@18.3.1) '@griffel/react': 1.5.27(react@18.3.1) '@swc/helpers': 0.5.15 - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - use-disposable: 1.0.4(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + use-disposable: 1.0.4(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-positioning@9.16.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@fluentui/react-positioning@9.16.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@floating-ui/devtools': 0.2.1(@floating-ui/dom@1.6.13) - '@floating-ui/dom': 1.6.13 - '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.18)(react@18.3.1) + '@floating-ui/devtools': 0.2.1(@floating-ui/dom@1.6.12) + '@floating-ui/dom': 1.6.12 + '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.12)(react@18.3.1) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.20(@types/react@18.3.18)(react@18.3.1) + '@fluentui/react-utilities': 9.18.20(@types/react@18.3.12)(react@18.3.1) '@griffel/react': 1.5.27(react@18.3.1) '@swc/helpers': 0.5.15 - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@fluentui/react-progress@9.1.96(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0)': + '@fluentui/react-progress@9.1.96(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': dependencies: - '@fluentui/react-field': 9.1.85(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.18)(react@18.3.1) + '@fluentui/react-field': 9.1.85(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.12)(react@18.3.1) + '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.12)(react@18.3.1) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.20(@types/react@18.3.18)(react@18.3.1) + '@fluentui/react-utilities': 9.18.20(@types/react@18.3.12)(react@18.3.1) '@griffel/react': 1.5.27(react@18.3.1) '@swc/helpers': 0.5.15 - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) transitivePeerDependencies: - scheduler - '@fluentui/react-provider@9.19.0(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@fluentui/react-provider@9.19.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@fluentui/react-icons': 2.0.271(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-tabster': 9.23.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.12)(react@18.3.1) + '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.12)(react@18.3.1) + '@fluentui/react-tabster': 9.23.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.20(@types/react@18.3.18)(react@18.3.1) - '@griffel/core': 1.19.0 + '@fluentui/react-utilities': 9.18.20(@types/react@18.3.12)(react@18.3.1) + '@griffel/core': 1.18.2 '@griffel/react': 1.5.27(react@18.3.1) '@swc/helpers': 0.5.15 - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@fluentui/react-radio@9.2.41(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0)': + '@fluentui/react-radio@9.2.41(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': dependencies: - '@fluentui/react-field': 9.1.85(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-label': 9.1.83(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-tabster': 9.23.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-field': 9.1.85(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.12)(react@18.3.1) + '@fluentui/react-label': 9.1.83(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.12)(react@18.3.1) + '@fluentui/react-tabster': 9.23.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.20(@types/react@18.3.18)(react@18.3.1) + '@fluentui/react-utilities': 9.18.20(@types/react@18.3.12)(react@18.3.1) '@griffel/react': 1.5.27(react@18.3.1) '@swc/helpers': 0.5.15 - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) transitivePeerDependencies: - scheduler - '@fluentui/react-rating@9.0.28(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@fluentui/react-rating@9.0.28(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@fluentui/react-icons': 2.0.271(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-tabster': 9.23.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.12)(react@18.3.1) + '@fluentui/react-tabster': 9.23.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.20(@types/react@18.3.18)(react@18.3.1) + '@fluentui/react-utilities': 9.18.20(@types/react@18.3.12)(react@18.3.1) '@griffel/react': 1.5.27(react@18.3.1) '@swc/helpers': 0.5.15 - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@fluentui/react-search@9.0.28(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0)': + '@fluentui/react-search@9.0.28(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': dependencies: '@fluentui/react-icons': 2.0.271(react@18.3.1) - '@fluentui/react-input': 9.4.98(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.18)(react@18.3.1) + '@fluentui/react-input': 9.4.98(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.12)(react@18.3.1) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.20(@types/react@18.3.18)(react@18.3.1) + '@fluentui/react-utilities': 9.18.20(@types/react@18.3.12)(react@18.3.1) '@griffel/react': 1.5.27(react@18.3.1) '@swc/helpers': 0.5.15 - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) transitivePeerDependencies: - scheduler - '@fluentui/react-select@9.1.96(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0)': + '@fluentui/react-select@9.1.96(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': dependencies: - '@fluentui/react-field': 9.1.85(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) + '@fluentui/react-field': 9.1.85(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) '@fluentui/react-icons': 2.0.271(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.18)(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.12)(react@18.3.1) + '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.12)(react@18.3.1) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.20(@types/react@18.3.18)(react@18.3.1) + '@fluentui/react-utilities': 9.18.20(@types/react@18.3.12)(react@18.3.1) '@griffel/react': 1.5.27(react@18.3.1) '@swc/helpers': 0.5.15 - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) transitivePeerDependencies: - scheduler - '@fluentui/react-shared-contexts@9.21.2(@types/react@18.3.18)(react@18.3.1)': + '@fluentui/react-shared-contexts@9.21.2(@types/react@18.3.12)(react@18.3.1)': dependencies: '@fluentui/react-theme': 9.1.17 '@swc/helpers': 0.5.15 - '@types/react': 18.3.18 + '@types/react': 18.3.12 react: 18.3.1 - '@fluentui/react-skeleton@9.1.25(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0)': + '@fluentui/react-skeleton@9.1.25(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': dependencies: - '@fluentui/react-field': 9.1.85(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.18)(react@18.3.1) + '@fluentui/react-field': 9.1.85(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.12)(react@18.3.1) + '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.12)(react@18.3.1) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.20(@types/react@18.3.18)(react@18.3.1) + '@fluentui/react-utilities': 9.18.20(@types/react@18.3.12)(react@18.3.1) '@griffel/react': 1.5.27(react@18.3.1) '@swc/helpers': 0.5.15 - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) transitivePeerDependencies: - scheduler - '@fluentui/react-slider@9.2.5(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0)': + '@fluentui/react-slider@9.2.5(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': dependencies: - '@fluentui/react-field': 9.1.85(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-tabster': 9.23.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-field': 9.1.85(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.12)(react@18.3.1) + '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.12)(react@18.3.1) + '@fluentui/react-tabster': 9.23.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.20(@types/react@18.3.18)(react@18.3.1) + '@fluentui/react-utilities': 9.18.20(@types/react@18.3.12)(react@18.3.1) '@griffel/react': 1.5.27(react@18.3.1) '@swc/helpers': 0.5.15 - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) transitivePeerDependencies: - scheduler - '@fluentui/react-spinbutton@9.2.97(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0)': + '@fluentui/react-spinbutton@9.2.97(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': dependencies: '@fluentui/keyboard-keys': 9.0.8 - '@fluentui/react-field': 9.1.85(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) + '@fluentui/react-field': 9.1.85(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) '@fluentui/react-icons': 2.0.271(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.18)(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.12)(react@18.3.1) + '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.12)(react@18.3.1) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.20(@types/react@18.3.18)(react@18.3.1) + '@fluentui/react-utilities': 9.18.20(@types/react@18.3.12)(react@18.3.1) '@griffel/react': 1.5.27(react@18.3.1) '@swc/helpers': 0.5.15 - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) transitivePeerDependencies: - scheduler - '@fluentui/react-spinner@9.5.7(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@fluentui/react-spinner@9.5.7(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-label': 9.1.83(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.18)(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.12)(react@18.3.1) + '@fluentui/react-label': 9.1.83(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.12)(react@18.3.1) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.20(@types/react@18.3.18)(react@18.3.1) + '@fluentui/react-utilities': 9.18.20(@types/react@18.3.12)(react@18.3.1) '@griffel/react': 1.5.27(react@18.3.1) '@swc/helpers': 0.5.15 - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@fluentui/react-swatch-picker@9.1.19(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0)': + '@fluentui/react-swatch-picker@9.1.19(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': dependencies: - '@fluentui/react-context-selector': 9.1.72(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) - '@fluentui/react-field': 9.1.85(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) + '@fluentui/react-context-selector': 9.1.72(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-field': 9.1.85(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) '@fluentui/react-icons': 2.0.271(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-tabster': 9.23.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.12)(react@18.3.1) + '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.12)(react@18.3.1) + '@fluentui/react-tabster': 9.23.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.20(@types/react@18.3.18)(react@18.3.1) + '@fluentui/react-utilities': 9.18.20(@types/react@18.3.12)(react@18.3.1) '@griffel/react': 1.5.27(react@18.3.1) '@swc/helpers': 0.5.15 - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) transitivePeerDependencies: - scheduler - '@fluentui/react-switch@9.1.103(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0)': + '@fluentui/react-switch@9.1.103(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': dependencies: - '@fluentui/react-field': 9.1.85(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) + '@fluentui/react-field': 9.1.85(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) '@fluentui/react-icons': 2.0.271(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-label': 9.1.83(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-tabster': 9.23.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.12)(react@18.3.1) + '@fluentui/react-label': 9.1.83(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.12)(react@18.3.1) + '@fluentui/react-tabster': 9.23.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.20(@types/react@18.3.18)(react@18.3.1) + '@fluentui/react-utilities': 9.18.20(@types/react@18.3.12)(react@18.3.1) '@griffel/react': 1.5.27(react@18.3.1) '@swc/helpers': 0.5.15 - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) transitivePeerDependencies: - scheduler - '@fluentui/react-table@9.15.28(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0)': + '@fluentui/react-table@9.15.28(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': dependencies: '@fluentui/keyboard-keys': 9.0.8 - '@fluentui/react-aria': 9.13.14(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-avatar': 9.6.49(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) - '@fluentui/react-checkbox': 9.2.46(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) - '@fluentui/react-context-selector': 9.1.72(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) + '@fluentui/react-aria': 9.13.14(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-avatar': 9.6.49(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-checkbox': 9.2.46(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-context-selector': 9.1.72(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) '@fluentui/react-icons': 2.0.271(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-radio': 9.2.41(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-tabster': 9.23.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.12)(react@18.3.1) + '@fluentui/react-radio': 9.2.41(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.12)(react@18.3.1) + '@fluentui/react-tabster': 9.23.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.20(@types/react@18.3.18)(react@18.3.1) + '@fluentui/react-utilities': 9.18.20(@types/react@18.3.12)(react@18.3.1) '@griffel/react': 1.5.27(react@18.3.1) '@swc/helpers': 0.5.15 - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) transitivePeerDependencies: - scheduler - '@fluentui/react-tabs@9.6.7(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0)': + '@fluentui/react-tabs@9.6.7(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': dependencies: - '@fluentui/react-context-selector': 9.1.72(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-tabster': 9.23.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-context-selector': 9.1.72(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.12)(react@18.3.1) + '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.12)(react@18.3.1) + '@fluentui/react-tabster': 9.23.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.20(@types/react@18.3.18)(react@18.3.1) + '@fluentui/react-utilities': 9.18.20(@types/react@18.3.12)(react@18.3.1) '@griffel/react': 1.5.27(react@18.3.1) '@swc/helpers': 0.5.15 - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) transitivePeerDependencies: - scheduler - '@fluentui/react-tabster@9.23.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.19(@types/react@18.3.18)(react@18.3.1) - '@griffel/react': 1.5.27(react@18.3.1) - '@swc/helpers': 0.5.15 - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) - keyborg: 2.6.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - tabster: 8.2.0 - - '@fluentui/react-tabster@9.23.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@fluentui/react-tabster@9.23.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.18)(react@18.3.1) + '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.12)(react@18.3.1) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.20(@types/react@18.3.18)(react@18.3.1) + '@fluentui/react-utilities': 9.18.20(@types/react@18.3.12)(react@18.3.1) '@griffel/react': 1.5.27(react@18.3.1) '@swc/helpers': 0.5.15 - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 keyborg: 2.6.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) tabster: 8.2.0 - '@fluentui/react-tag-picker@9.4.0(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0)': + '@fluentui/react-tag-picker@9.4.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': dependencies: '@fluentui/keyboard-keys': 9.0.8 - '@fluentui/react-aria': 9.13.14(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-combobox': 9.13.17(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) - '@fluentui/react-context-selector': 9.1.72(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) - '@fluentui/react-field': 9.1.85(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) + '@fluentui/react-aria': 9.13.14(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-combobox': 9.13.17(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-context-selector': 9.1.72(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-field': 9.1.85(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) '@fluentui/react-icons': 2.0.271(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-portal': 9.4.42(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-positioning': 9.16.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-tabster': 9.23.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-tags': 9.3.29(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) + '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.12)(react@18.3.1) + '@fluentui/react-portal': 9.4.42(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-positioning': 9.16.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.12)(react@18.3.1) + '@fluentui/react-tabster': 9.23.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-tags': 9.3.29(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.20(@types/react@18.3.18)(react@18.3.1) + '@fluentui/react-utilities': 9.18.20(@types/react@18.3.12)(react@18.3.1) '@griffel/react': 1.5.27(react@18.3.1) '@swc/helpers': 0.5.15 - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) transitivePeerDependencies: - scheduler - '@fluentui/react-tags@9.3.29(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0)': + '@fluentui/react-tags@9.3.29(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': dependencies: '@fluentui/keyboard-keys': 9.0.8 - '@fluentui/react-aria': 9.13.14(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-avatar': 9.6.49(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) + '@fluentui/react-aria': 9.13.14(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-avatar': 9.6.49(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) '@fluentui/react-icons': 2.0.271(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-tabster': 9.23.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.12)(react@18.3.1) + '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.12)(react@18.3.1) + '@fluentui/react-tabster': 9.23.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.20(@types/react@18.3.18)(react@18.3.1) + '@fluentui/react-utilities': 9.18.20(@types/react@18.3.12)(react@18.3.1) '@griffel/react': 1.5.27(react@18.3.1) '@swc/helpers': 0.5.15 - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) transitivePeerDependencies: - scheduler - '@fluentui/react-teaching-popover@9.2.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0)': + '@fluentui/react-teaching-popover@9.2.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': dependencies: - '@fluentui/react-aria': 9.13.14(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-button': 9.3.100(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-context-selector': 9.1.72(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) + '@fluentui/react-aria': 9.13.14(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-button': 9.3.100(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-context-selector': 9.1.72(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) '@fluentui/react-icons': 2.0.271(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-popover': 9.9.31(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-tabster': 9.23.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.12)(react@18.3.1) + '@fluentui/react-popover': 9.9.31(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.12)(react@18.3.1) + '@fluentui/react-tabster': 9.23.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.20(@types/react@18.3.18)(react@18.3.1) + '@fluentui/react-utilities': 9.18.20(@types/react@18.3.12)(react@18.3.1) '@griffel/react': 1.5.27(react@18.3.1) '@swc/helpers': 0.5.15 - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - use-sync-external-store: 1.4.0(react@18.3.1) + use-sync-external-store: 1.2.2(react@18.3.1) transitivePeerDependencies: - scheduler - '@fluentui/react-text@9.4.32(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@fluentui/react-text@9.4.32(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.18)(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.12)(react@18.3.1) + '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.12)(react@18.3.1) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.20(@types/react@18.3.18)(react@18.3.1) + '@fluentui/react-utilities': 9.18.20(@types/react@18.3.12)(react@18.3.1) '@griffel/react': 1.5.27(react@18.3.1) '@swc/helpers': 0.5.15 - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@fluentui/react-textarea@9.3.97(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0)': + '@fluentui/react-textarea@9.3.97(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': dependencies: - '@fluentui/react-field': 9.1.85(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.18)(react@18.3.1) + '@fluentui/react-field': 9.1.85(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.12)(react@18.3.1) + '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.12)(react@18.3.1) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.20(@types/react@18.3.18)(react@18.3.1) + '@fluentui/react-utilities': 9.18.20(@types/react@18.3.12)(react@18.3.1) '@griffel/react': 1.5.27(react@18.3.1) '@swc/helpers': 0.5.15 - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) transitivePeerDependencies: @@ -14762,114 +14735,106 @@ snapshots: '@fluentui/tokens': 1.0.0-alpha.14 '@swc/helpers': 0.5.15 - '@fluentui/react-toast@9.3.65(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@fluentui/react-toast@9.3.65(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@fluentui/keyboard-keys': 9.0.8 - '@fluentui/react-aria': 9.13.14(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-aria': 9.13.14(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@fluentui/react-icons': 2.0.271(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-motion': 9.6.7(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-motion-components-preview': 0.4.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-portal': 9.4.42(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-tabster': 9.23.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.12)(react@18.3.1) + '@fluentui/react-motion': 9.6.7(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-motion-components-preview': 0.4.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-portal': 9.4.42(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.12)(react@18.3.1) + '@fluentui/react-tabster': 9.23.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.20(@types/react@18.3.18)(react@18.3.1) + '@fluentui/react-utilities': 9.18.20(@types/react@18.3.12)(react@18.3.1) '@griffel/react': 1.5.27(react@18.3.1) '@swc/helpers': 0.5.15 - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@fluentui/react-toolbar@9.2.15(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0)': + '@fluentui/react-toolbar@9.2.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': dependencies: - '@fluentui/react-button': 9.3.100(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-context-selector': 9.1.72(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) - '@fluentui/react-divider': 9.2.82(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-radio': 9.2.41(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-tabster': 9.23.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-button': 9.3.100(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-context-selector': 9.1.72(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-divider': 9.2.82(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.12)(react@18.3.1) + '@fluentui/react-radio': 9.2.41(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.12)(react@18.3.1) + '@fluentui/react-tabster': 9.23.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.20(@types/react@18.3.18)(react@18.3.1) + '@fluentui/react-utilities': 9.18.20(@types/react@18.3.12)(react@18.3.1) '@griffel/react': 1.5.27(react@18.3.1) '@swc/helpers': 0.5.15 - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) transitivePeerDependencies: - scheduler - '@fluentui/react-tooltip@9.5.4(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@fluentui/react-tooltip@9.5.4(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@fluentui/keyboard-keys': 9.0.8 - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-portal': 9.4.42(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-positioning': 9.16.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-tabster': 9.23.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.12)(react@18.3.1) + '@fluentui/react-portal': 9.4.42(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-positioning': 9.16.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.12)(react@18.3.1) + '@fluentui/react-tabster': 9.23.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.20(@types/react@18.3.18)(react@18.3.1) + '@fluentui/react-utilities': 9.18.20(@types/react@18.3.12)(react@18.3.1) '@griffel/react': 1.5.27(react@18.3.1) '@swc/helpers': 0.5.15 - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@fluentui/react-tree@9.9.0(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0)': + '@fluentui/react-tree@9.9.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)': dependencies: '@fluentui/keyboard-keys': 9.0.8 - '@fluentui/react-aria': 9.13.14(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-avatar': 9.6.49(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) - '@fluentui/react-button': 9.3.100(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-checkbox': 9.2.46(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) - '@fluentui/react-context-selector': 9.1.72(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) + '@fluentui/react-aria': 9.13.14(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-avatar': 9.6.49(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-button': 9.3.100(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-checkbox': 9.2.46(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-context-selector': 9.1.72(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) '@fluentui/react-icons': 2.0.271(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-motion': 9.6.7(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-motion-components-preview': 0.4.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@fluentui/react-radio': 9.2.41(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.25.0) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-tabster': 9.23.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.12)(react@18.3.1) + '@fluentui/react-motion': 9.6.7(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-motion-components-preview': 0.4.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fluentui/react-radio': 9.2.41(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.12)(react@18.3.1) + '@fluentui/react-tabster': 9.23.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.20(@types/react@18.3.18)(react@18.3.1) + '@fluentui/react-utilities': 9.18.20(@types/react@18.3.12)(react@18.3.1) '@griffel/react': 1.5.27(react@18.3.1) '@swc/helpers': 0.5.15 - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) transitivePeerDependencies: - scheduler - '@fluentui/react-utilities@9.18.19(@types/react@18.3.18)(react@18.3.1)': - dependencies: - '@fluentui/keyboard-keys': 9.0.8 - '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.18)(react@18.3.1) - '@swc/helpers': 0.5.15 - '@types/react': 18.3.18 - react: 18.3.1 - - '@fluentui/react-utilities@9.18.20(@types/react@18.3.18)(react@18.3.1)': + '@fluentui/react-utilities@9.18.20(@types/react@18.3.12)(react@18.3.1)': dependencies: '@fluentui/keyboard-keys': 9.0.8 - '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.18)(react@18.3.1) + '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.12)(react@18.3.1) '@swc/helpers': 0.5.15 - '@types/react': 18.3.18 + '@types/react': 18.3.12 react: 18.3.1 - '@fluentui/react-virtualizer@9.0.0-alpha.90(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@fluentui/react-virtualizer@9.0.0-alpha.90(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.18)(react@18.3.1) - '@fluentui/react-utilities': 9.18.20(@types/react@18.3.18)(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.0.50(@types/react@18.3.12)(react@18.3.1) + '@fluentui/react-shared-contexts': 9.21.2(@types/react@18.3.12)(react@18.3.1) + '@fluentui/react-utilities': 9.18.20(@types/react@18.3.12)(react@18.3.1) '@griffel/react': 1.5.27(react@18.3.1) '@swc/helpers': 0.5.15 - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -14885,18 +14850,18 @@ snapshots: '@shikijs/types': 1.29.1 '@shikijs/vscode-textmate': 10.0.1 - '@griffel/core@1.19.0': + '@griffel/core@1.18.2': dependencies: '@emotion/hash': 0.9.2 '@griffel/style-types': 1.3.0 csstype: 3.1.3 rtl-css-js: 1.16.1 - stylis: 4.3.5 + stylis: 4.3.4 tslib: 2.8.1 '@griffel/react@1.5.27(react@18.3.1)': dependencies: - '@griffel/core': 1.19.0 + '@griffel/core': 1.18.2 react: 18.3.1 tslib: 2.8.1 @@ -15025,11 +14990,11 @@ snapshots: '@istanbuljs/schema@0.1.3': {} - '@joshwooding/vite-plugin-react-docgen-typescript@0.4.2(typescript@5.7.3)(vite@6.0.11(@types/node@22.10.7)(jiti@2.4.2)(tsx@4.19.2)(yaml@2.7.0))': + '@joshwooding/vite-plugin-react-docgen-typescript@0.4.2(typescript@5.7.3)(vite@6.0.11(@types/node@22.10.10)(jiti@1.21.6)(tsx@4.19.2)(yaml@2.7.0))': dependencies: magic-string: 0.27.0 react-docgen-typescript: 2.2.2(typescript@5.7.3) - vite: 6.0.11(@types/node@22.10.7)(jiti@2.4.2)(tsx@4.19.2)(yaml@2.7.0) + vite: 6.0.11(@types/node@22.10.10)(jiti@1.21.6)(tsx@4.19.2)(yaml@2.7.0) optionalDependencies: typescript: 5.7.3 @@ -15039,6 +15004,12 @@ snapshots: '@jridgewell/sourcemap-codec': 1.5.0 '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/gen-mapping@0.3.8': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/resolve-uri@3.1.2': {} '@jridgewell/set-array@1.2.1': {} @@ -15096,26 +15067,26 @@ snapshots: dependencies: langium: 3.0.0 - '@microsoft/api-extractor-model@7.30.2(@types/node@22.10.7)': + '@microsoft/api-extractor-model@7.30.2(@types/node@22.10.10)': dependencies: '@microsoft/tsdoc': 0.15.1 '@microsoft/tsdoc-config': 0.17.1 - '@rushstack/node-core-library': 5.10.2(@types/node@22.10.7) + '@rushstack/node-core-library': 5.10.2(@types/node@22.10.10) transitivePeerDependencies: - '@types/node' - '@microsoft/api-extractor@7.49.1(@types/node@22.10.7)': + '@microsoft/api-extractor@7.49.1(@types/node@22.10.10)': dependencies: - '@microsoft/api-extractor-model': 7.30.2(@types/node@22.10.7) + '@microsoft/api-extractor-model': 7.30.2(@types/node@22.10.10) '@microsoft/tsdoc': 0.15.1 '@microsoft/tsdoc-config': 0.17.1 - '@rushstack/node-core-library': 5.10.2(@types/node@22.10.7) + '@rushstack/node-core-library': 5.10.2(@types/node@22.10.10) '@rushstack/rig-package': 0.5.3 - '@rushstack/terminal': 0.14.5(@types/node@22.10.7) - '@rushstack/ts-command-line': 4.23.3(@types/node@22.10.7) + '@rushstack/terminal': 0.14.5(@types/node@22.10.10) + '@rushstack/ts-command-line': 4.23.3(@types/node@22.10.10) lodash: 4.17.21 minimatch: 3.0.8 - resolve: 1.22.8 + resolve: 1.22.10 semver: 7.5.4 source-map: 0.6.1 typescript: 5.7.2 @@ -15145,11 +15116,11 @@ snapshots: '@npmcli/agent@3.0.0': dependencies: - agent-base: 7.1.1 + agent-base: 7.1.3 http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.5 + https-proxy-agent: 7.0.6 lru-cache: 10.4.3 - socks-proxy-agent: 8.0.4 + socks-proxy-agent: 8.0.5 transitivePeerDependencies: - supports-color @@ -15208,56 +15179,56 @@ snapshots: - bluebird - supports-color - '@octokit/app@15.1.1': + '@octokit/app@15.1.2': dependencies: - '@octokit/auth-app': 7.1.3 - '@octokit/auth-unauthenticated': 6.1.0 + '@octokit/auth-app': 7.1.4 + '@octokit/auth-unauthenticated': 6.1.1 '@octokit/core': 6.1.3 - '@octokit/oauth-app': 7.1.3 - '@octokit/plugin-paginate-rest': 11.3.5(@octokit/core@6.1.3) - '@octokit/types': 13.6.1 - '@octokit/webhooks': 13.4.1 - - '@octokit/auth-app@7.1.3': - dependencies: - '@octokit/auth-oauth-app': 8.1.1 - '@octokit/auth-oauth-user': 5.1.1 - '@octokit/request': 9.1.3 - '@octokit/request-error': 6.1.5 - '@octokit/types': 13.6.1 + '@octokit/oauth-app': 7.1.5 + '@octokit/plugin-paginate-rest': 11.4.0(@octokit/core@6.1.3) + '@octokit/types': 13.7.0 + '@octokit/webhooks': 13.4.2 + + '@octokit/auth-app@7.1.4': + dependencies: + '@octokit/auth-oauth-app': 8.1.2 + '@octokit/auth-oauth-user': 5.1.2 + '@octokit/request': 9.2.0 + '@octokit/request-error': 6.1.6 + '@octokit/types': 13.7.0 toad-cache: 3.7.0 universal-github-app-jwt: 2.2.0 universal-user-agent: 7.0.2 - '@octokit/auth-oauth-app@8.1.1': + '@octokit/auth-oauth-app@8.1.2': dependencies: - '@octokit/auth-oauth-device': 7.1.1 - '@octokit/auth-oauth-user': 5.1.1 - '@octokit/request': 9.1.3 - '@octokit/types': 13.6.1 + '@octokit/auth-oauth-device': 7.1.2 + '@octokit/auth-oauth-user': 5.1.2 + '@octokit/request': 9.2.0 + '@octokit/types': 13.7.0 universal-user-agent: 7.0.2 - '@octokit/auth-oauth-device@7.1.1': + '@octokit/auth-oauth-device@7.1.2': dependencies: - '@octokit/oauth-methods': 5.1.2 - '@octokit/request': 9.1.3 - '@octokit/types': 13.6.1 + '@octokit/oauth-methods': 5.1.3 + '@octokit/request': 9.2.0 + '@octokit/types': 13.7.0 universal-user-agent: 7.0.2 - '@octokit/auth-oauth-user@5.1.1': + '@octokit/auth-oauth-user@5.1.2': dependencies: - '@octokit/auth-oauth-device': 7.1.1 - '@octokit/oauth-methods': 5.1.2 - '@octokit/request': 9.1.3 - '@octokit/types': 13.6.1 + '@octokit/auth-oauth-device': 7.1.2 + '@octokit/oauth-methods': 5.1.3 + '@octokit/request': 9.2.0 + '@octokit/types': 13.7.0 universal-user-agent: 7.0.2 '@octokit/auth-token@5.1.1': {} - '@octokit/auth-unauthenticated@6.1.0': + '@octokit/auth-unauthenticated@6.1.1': dependencies: - '@octokit/request-error': 6.1.5 - '@octokit/types': 13.6.1 + '@octokit/request-error': 6.1.6 + '@octokit/types': 13.7.0 '@octokit/core@6.1.3': dependencies: @@ -15269,44 +15240,36 @@ snapshots: before-after-hook: 3.0.2 universal-user-agent: 7.0.2 - '@octokit/endpoint@10.1.1': + '@octokit/endpoint@10.1.2': dependencies: '@octokit/types': 13.7.0 universal-user-agent: 7.0.2 - '@octokit/graphql@8.1.1': - dependencies: - '@octokit/request': 9.1.3 - '@octokit/types': 13.6.1 - universal-user-agent: 7.0.2 - '@octokit/graphql@8.1.2': dependencies: '@octokit/request': 9.2.0 '@octokit/types': 13.7.0 universal-user-agent: 7.0.2 - '@octokit/oauth-app@7.1.3': + '@octokit/oauth-app@7.1.5': dependencies: - '@octokit/auth-oauth-app': 8.1.1 - '@octokit/auth-oauth-user': 5.1.1 - '@octokit/auth-unauthenticated': 6.1.0 + '@octokit/auth-oauth-app': 8.1.2 + '@octokit/auth-oauth-user': 5.1.2 + '@octokit/auth-unauthenticated': 6.1.1 '@octokit/core': 6.1.3 '@octokit/oauth-authorization-url': 7.1.1 - '@octokit/oauth-methods': 5.1.2 - '@types/aws-lambda': 8.10.145 + '@octokit/oauth-methods': 5.1.3 + '@types/aws-lambda': 8.10.147 universal-user-agent: 7.0.2 '@octokit/oauth-authorization-url@7.1.1': {} - '@octokit/oauth-methods@5.1.2': + '@octokit/oauth-methods@5.1.3': dependencies: '@octokit/oauth-authorization-url': 7.1.1 - '@octokit/request': 9.1.3 - '@octokit/request-error': 6.1.5 - '@octokit/types': 13.6.1 - - '@octokit/openapi-types@22.2.0': {} + '@octokit/request': 9.2.0 + '@octokit/request-error': 6.1.6 + '@octokit/types': 13.7.0 '@octokit/openapi-types@23.0.1': {} @@ -15316,10 +15279,10 @@ snapshots: dependencies: '@octokit/core': 6.1.3 - '@octokit/plugin-paginate-rest@11.3.5(@octokit/core@6.1.3)': + '@octokit/plugin-paginate-rest@11.4.0(@octokit/core@6.1.3)': dependencies: '@octokit/core': 6.1.3 - '@octokit/types': 13.6.1 + '@octokit/types': 13.7.0 '@octokit/plugin-request-log@5.3.1(@octokit/core@6.1.3)': dependencies: @@ -15330,63 +15293,48 @@ snapshots: '@octokit/core': 6.1.3 '@octokit/types': 13.7.0 - '@octokit/plugin-retry@7.1.2(@octokit/core@6.1.3)': + '@octokit/plugin-retry@7.1.3(@octokit/core@6.1.3)': dependencies: '@octokit/core': 6.1.3 - '@octokit/request-error': 6.1.5 - '@octokit/types': 13.6.1 + '@octokit/request-error': 6.1.6 + '@octokit/types': 13.7.0 bottleneck: 2.19.5 - '@octokit/plugin-throttling@9.3.2(@octokit/core@6.1.3)': + '@octokit/plugin-throttling@9.4.0(@octokit/core@6.1.3)': dependencies: '@octokit/core': 6.1.3 - '@octokit/types': 13.6.1 + '@octokit/types': 13.7.0 bottleneck: 2.19.5 - '@octokit/request-error@6.1.5': - dependencies: - '@octokit/types': 13.6.1 - '@octokit/request-error@6.1.6': dependencies: '@octokit/types': 13.7.0 - '@octokit/request@9.1.3': - dependencies: - '@octokit/endpoint': 10.1.1 - '@octokit/request-error': 6.1.5 - '@octokit/types': 13.6.1 - universal-user-agent: 7.0.2 - '@octokit/request@9.2.0': dependencies: - '@octokit/endpoint': 10.1.1 + '@octokit/endpoint': 10.1.2 '@octokit/request-error': 6.1.6 '@octokit/types': 13.7.0 fast-content-type-parse: 2.0.1 universal-user-agent: 7.0.2 - '@octokit/rest@21.0.2': + '@octokit/rest@21.1.0': dependencies: '@octokit/core': 6.1.3 - '@octokit/plugin-paginate-rest': 11.3.5(@octokit/core@6.1.3) + '@octokit/plugin-paginate-rest': 11.4.0(@octokit/core@6.1.3) '@octokit/plugin-request-log': 5.3.1(@octokit/core@6.1.3) '@octokit/plugin-rest-endpoint-methods': 13.3.0(@octokit/core@6.1.3) - '@octokit/types@13.6.1': - dependencies: - '@octokit/openapi-types': 22.2.0 - '@octokit/types@13.7.0': dependencies: '@octokit/openapi-types': 23.0.1 '@octokit/webhooks-methods@5.1.0': {} - '@octokit/webhooks@13.4.1': + '@octokit/webhooks@13.4.2': dependencies: '@octokit/openapi-webhooks-types': 8.5.1 - '@octokit/request-error': 6.1.5 + '@octokit/request-error': 6.1.6 '@octokit/webhooks-methods': 5.1.0 '@oslojs/encoding@1.1.0': {} @@ -15415,24 +15363,24 @@ snapshots: dependencies: playwright-core: 1.49.0 - '@playwright/test@1.49.1': + '@playwright/test@1.50.0': dependencies: - playwright: 1.49.1 + playwright: 1.50.0 '@pnpm/cli-meta@5.0.1': dependencies: '@pnpm/types': 9.1.0 load-json-file: 6.2.0 - '@pnpm/cli-utils@2.0.9(@pnpm/logger@1000.0.0)': + '@pnpm/cli-utils@2.0.9(@pnpm/logger@5.2.0)': dependencies: '@pnpm/cli-meta': 5.0.1 - '@pnpm/config': 18.4.0(@pnpm/logger@1000.0.0) - '@pnpm/default-reporter': 12.2.3(@pnpm/logger@1000.0.0) + '@pnpm/config': 18.4.0(@pnpm/logger@5.2.0) + '@pnpm/default-reporter': 12.2.3(@pnpm/logger@5.2.0) '@pnpm/error': 5.0.1 - '@pnpm/logger': 1000.0.0 - '@pnpm/manifest-utils': 5.0.1(@pnpm/logger@1000.0.0) - '@pnpm/package-is-installable': 8.0.2(@pnpm/logger@1000.0.0) + '@pnpm/logger': 5.2.0 + '@pnpm/manifest-utils': 5.0.1(@pnpm/logger@5.2.0) + '@pnpm/package-is-installable': 8.0.2(@pnpm/logger@5.2.0) '@pnpm/read-project-manifest': 5.0.1 '@pnpm/types': 9.1.0 chalk: 4.1.2 @@ -15440,7 +15388,7 @@ snapshots: '@pnpm/config.env-replace@1.1.0': {} - '@pnpm/config@18.4.0(@pnpm/logger@1000.0.0)': + '@pnpm/config@18.4.0(@pnpm/logger@5.2.0)': dependencies: '@pnpm/config.env-replace': 1.1.0 '@pnpm/constants': 7.1.0 @@ -15448,7 +15396,7 @@ snapshots: '@pnpm/git-utils': 1.0.0 '@pnpm/matcher': 5.0.0 '@pnpm/npm-conf': 2.2.0 - '@pnpm/pnpmfile': 5.0.7(@pnpm/logger@1000.0.0) + '@pnpm/pnpmfile': 5.0.7(@pnpm/logger@5.2.0) '@pnpm/read-project-manifest': 5.0.1 '@pnpm/types': 9.1.0 better-path-resolve: 1.0.0 @@ -15469,9 +15417,9 @@ snapshots: '@pnpm/constants@7.1.0': {} - '@pnpm/core-loggers@9.0.1(@pnpm/logger@1000.0.0)': + '@pnpm/core-loggers@9.0.1(@pnpm/logger@5.2.0)': dependencies: - '@pnpm/logger': 1000.0.0 + '@pnpm/logger': 5.2.0 '@pnpm/types': 9.1.0 '@pnpm/dedupe.issues-renderer@1.0.0': @@ -15482,14 +15430,14 @@ snapshots: '@pnpm/dedupe.types@1.0.0': {} - '@pnpm/default-reporter@12.2.3(@pnpm/logger@1000.0.0)': + '@pnpm/default-reporter@12.2.3(@pnpm/logger@5.2.0)': dependencies: - '@pnpm/config': 18.4.0(@pnpm/logger@1000.0.0) - '@pnpm/core-loggers': 9.0.1(@pnpm/logger@1000.0.0) + '@pnpm/config': 18.4.0(@pnpm/logger@5.2.0) + '@pnpm/core-loggers': 9.0.1(@pnpm/logger@5.2.0) '@pnpm/dedupe.issues-renderer': 1.0.0 '@pnpm/dedupe.types': 1.0.0 '@pnpm/error': 5.0.1 - '@pnpm/logger': 1000.0.0 + '@pnpm/logger': 5.2.0 '@pnpm/render-peer-issues': 4.0.1 '@pnpm/types': 9.1.0 ansi-diff: 1.2.0 @@ -15516,9 +15464,9 @@ snapshots: '@pnpm/types': 9.1.0 '@types/ssri': 7.1.5 - '@pnpm/find-workspace-packages@6.0.9(@pnpm/logger@1000.0.0)': + '@pnpm/find-workspace-packages@6.0.9(@pnpm/logger@5.2.0)': dependencies: - '@pnpm/cli-utils': 2.0.9(@pnpm/logger@1000.0.0) + '@pnpm/cli-utils': 2.0.9(@pnpm/logger@5.2.0) '@pnpm/constants': 7.1.0 '@pnpm/fs.find-packages': 2.0.1 '@pnpm/types': 9.1.0 @@ -15552,14 +15500,14 @@ snapshots: dependencies: '@pnpm/types': 9.1.0 - '@pnpm/logger@1000.0.0': + '@pnpm/logger@5.2.0': dependencies: bole: 5.0.17 ndjson: 2.0.0 - '@pnpm/manifest-utils@5.0.1(@pnpm/logger@1000.0.0)': + '@pnpm/manifest-utils@5.0.1(@pnpm/logger@5.2.0)': dependencies: - '@pnpm/core-loggers': 9.0.1(@pnpm/logger@1000.0.0) + '@pnpm/core-loggers': 9.0.1(@pnpm/logger@5.2.0) '@pnpm/error': 5.0.1 '@pnpm/types': 9.1.0 transitivePeerDependencies: @@ -15579,24 +15527,24 @@ snapshots: '@pnpm/network.ca-file': 1.0.2 config-chain: 1.1.13 - '@pnpm/package-is-installable@8.0.2(@pnpm/logger@1000.0.0)': + '@pnpm/package-is-installable@8.0.2(@pnpm/logger@5.2.0)': dependencies: - '@pnpm/core-loggers': 9.0.1(@pnpm/logger@1000.0.0) + '@pnpm/core-loggers': 9.0.1(@pnpm/logger@5.2.0) '@pnpm/error': 5.0.1 - '@pnpm/logger': 1000.0.0 + '@pnpm/logger': 5.2.0 '@pnpm/types': 9.1.0 detect-libc: 2.0.3 execa: safe-execa@0.1.2 mem: 8.1.1 semver: 7.6.3 - '@pnpm/pnpmfile@5.0.7(@pnpm/logger@1000.0.0)': + '@pnpm/pnpmfile@5.0.7(@pnpm/logger@5.2.0)': dependencies: - '@pnpm/core-loggers': 9.0.1(@pnpm/logger@1000.0.0) + '@pnpm/core-loggers': 9.0.1(@pnpm/logger@5.2.0) '@pnpm/error': 5.0.1 '@pnpm/hooks.types': 1.0.1 '@pnpm/lockfile-types': 5.1.0 - '@pnpm/logger': 1000.0.0 + '@pnpm/logger': 5.2.0 '@pnpm/store-controller-types': 15.0.1 '@pnpm/types': 9.1.0 chalk: 4.1.2 @@ -15722,7 +15670,7 @@ snapshots: '@types/resolve': 1.20.2 deepmerge: 4.3.1 is-module: 1.0.0 - resolve: 1.22.10 + resolve: 1.22.8 optionalDependencies: rollup: 4.31.0 @@ -15733,10 +15681,10 @@ snapshots: optionalDependencies: rollup: 4.31.0 - '@rollup/plugin-typescript@12.1.2(rollup@4.31.0)(tslib@2.8.1)(typescript@5.7.3)': + '@rollup/plugin-typescript@12.1.1(rollup@4.31.0)(tslib@2.8.1)(typescript@5.7.3)': dependencies: - '@rollup/pluginutils': 5.1.4(rollup@4.31.0) - resolve: 1.22.10 + '@rollup/pluginutils': 5.1.3(rollup@4.31.0) + resolve: 1.22.8 typescript: 5.7.3 optionalDependencies: rollup: 4.31.0 @@ -15821,7 +15769,7 @@ snapshots: '@rtsao/scc@1.1.0': {} - '@rushstack/node-core-library@5.10.2(@types/node@22.10.7)': + '@rushstack/node-core-library@5.10.2(@types/node@22.10.10)': dependencies: ajv: 8.13.0 ajv-draft-04: 1.0.0(ajv@8.13.0) @@ -15832,23 +15780,23 @@ snapshots: resolve: 1.22.10 semver: 7.5.4 optionalDependencies: - '@types/node': 22.10.7 + '@types/node': 22.10.10 '@rushstack/rig-package@0.5.3': dependencies: resolve: 1.22.10 strip-json-comments: 3.1.1 - '@rushstack/terminal@0.14.5(@types/node@22.10.7)': + '@rushstack/terminal@0.14.5(@types/node@22.10.10)': dependencies: - '@rushstack/node-core-library': 5.10.2(@types/node@22.10.7) + '@rushstack/node-core-library': 5.10.2(@types/node@22.10.10) supports-color: 8.1.1 optionalDependencies: - '@types/node': 22.10.7 + '@types/node': 22.10.10 - '@rushstack/ts-command-line@4.23.3(@types/node@22.10.7)': + '@rushstack/ts-command-line@4.23.3(@types/node@22.10.10)': dependencies: - '@rushstack/terminal': 0.14.5(@types/node@22.10.7) + '@rushstack/terminal': 0.14.5(@types/node@22.10.10) '@types/argparse': 1.0.38 argparse: 1.0.10 string-argv: 0.3.2 @@ -15894,17 +15842,17 @@ snapshots: '@sigstore/bundle@3.0.0': dependencies: - '@sigstore/protobuf-specs': 0.3.2 + '@sigstore/protobuf-specs': 0.3.3 '@sigstore/core@2.0.0': {} - '@sigstore/protobuf-specs@0.3.2': {} + '@sigstore/protobuf-specs@0.3.3': {} '@sigstore/sign@3.0.0': dependencies: '@sigstore/bundle': 3.0.0 '@sigstore/core': 2.0.0 - '@sigstore/protobuf-specs': 0.3.2 + '@sigstore/protobuf-specs': 0.3.3 make-fetch-happen: 14.0.3 proc-log: 5.0.0 promise-retry: 2.0.1 @@ -15913,7 +15861,7 @@ snapshots: '@sigstore/tuf@3.0.0': dependencies: - '@sigstore/protobuf-specs': 0.3.2 + '@sigstore/protobuf-specs': 0.3.3 tuf-js: 3.0.1 transitivePeerDependencies: - supports-color @@ -15922,35 +15870,35 @@ snapshots: dependencies: '@sigstore/bundle': 3.0.0 '@sigstore/core': 2.0.0 - '@sigstore/protobuf-specs': 0.3.2 + '@sigstore/protobuf-specs': 0.3.3 '@sindresorhus/merge-streams@2.3.0': {} - '@storybook/addon-actions@8.5.0(storybook@8.5.0(prettier@3.4.2))': + '@storybook/addon-actions@8.5.1(storybook@8.5.1(prettier@3.4.2))': dependencies: '@storybook/global': 5.0.0 '@types/uuid': 9.0.8 dequal: 2.0.3 polished: 4.3.1 - storybook: 8.5.0(prettier@3.4.2) + storybook: 8.5.1(prettier@3.4.2) uuid: 9.0.1 - '@storybook/builder-vite@8.5.0(storybook@8.5.0(prettier@3.4.2))(vite@6.0.11(@types/node@22.10.7)(jiti@2.4.2)(tsx@4.19.2)(yaml@2.7.0))': + '@storybook/builder-vite@8.5.1(storybook@8.5.1(prettier@3.4.2))(vite@6.0.11(@types/node@22.10.10)(jiti@1.21.6)(tsx@4.19.2)(yaml@2.7.0))': dependencies: - '@storybook/csf-plugin': 8.5.0(storybook@8.5.0(prettier@3.4.2)) + '@storybook/csf-plugin': 8.5.1(storybook@8.5.1(prettier@3.4.2)) browser-assert: 1.2.1 - storybook: 8.5.0(prettier@3.4.2) + storybook: 8.5.1(prettier@3.4.2) ts-dedent: 2.2.0 - vite: 6.0.11(@types/node@22.10.7)(jiti@2.4.2)(tsx@4.19.2)(yaml@2.7.0) + vite: 6.0.11(@types/node@22.10.10)(jiti@1.21.6)(tsx@4.19.2)(yaml@2.7.0) - '@storybook/cli@8.5.0(@babel/preset-env@7.26.0(@babel/core@7.26.0))(prettier@3.4.2)': + '@storybook/cli@8.5.1(@babel/preset-env@7.26.0(@babel/core@7.26.0))(prettier@3.4.2)': dependencies: '@babel/core': 7.26.0 '@babel/types': 7.26.0 - '@storybook/codemod': 8.5.0 + '@storybook/codemod': 8.5.1 '@types/semver': 7.5.8 commander: 12.1.0 - create-storybook: 8.5.0 + create-storybook: 8.5.1 cross-spawn: 7.0.6 envinfo: 7.14.0 fd-package-json: 1.2.0 @@ -15962,7 +15910,7 @@ snapshots: leven: 3.1.0 prompts: 2.4.2 semver: 7.6.3 - storybook: 8.5.0(prettier@3.4.2) + storybook: 8.5.1(prettier@3.4.2) tiny-invariant: 1.3.3 ts-dedent: 2.2.0 transitivePeerDependencies: @@ -15972,12 +15920,12 @@ snapshots: - supports-color - utf-8-validate - '@storybook/codemod@8.5.0': + '@storybook/codemod@8.5.1': dependencies: '@babel/core': 7.26.0 '@babel/preset-env': 7.26.0(@babel/core@7.26.0) '@babel/types': 7.26.0 - '@storybook/core': 8.5.0(prettier@3.4.2) + '@storybook/core': 8.5.1(prettier@3.4.2) '@storybook/csf': 0.1.12 '@types/cross-spawn': 6.0.6 cross-spawn: 7.0.6 @@ -15992,11 +15940,11 @@ snapshots: - supports-color - utf-8-validate - '@storybook/components@8.5.0(storybook@8.5.0(prettier@3.4.2))': + '@storybook/components@8.5.1(storybook@8.5.1(prettier@3.4.2))': dependencies: - storybook: 8.5.0(prettier@3.4.2) + storybook: 8.5.1(prettier@3.4.2) - '@storybook/core@8.5.0(prettier@3.4.2)': + '@storybook/core@8.5.1(prettier@3.4.2)': dependencies: '@storybook/csf': 0.1.12 better-opn: 3.0.2 @@ -16016,9 +15964,9 @@ snapshots: - supports-color - utf-8-validate - '@storybook/csf-plugin@8.5.0(storybook@8.5.0(prettier@3.4.2))': + '@storybook/csf-plugin@8.5.1(storybook@8.5.1(prettier@3.4.2))': dependencies: - storybook: 8.5.0(prettier@3.4.2) + storybook: 8.5.1(prettier@3.4.2) unplugin: 1.16.0 '@storybook/csf@0.1.12': @@ -16027,82 +15975,82 @@ snapshots: '@storybook/global@5.0.0': {} - '@storybook/instrumenter@8.5.0(storybook@8.5.0(prettier@3.4.2))': + '@storybook/instrumenter@8.5.1(storybook@8.5.1(prettier@3.4.2))': dependencies: '@storybook/global': 5.0.0 '@vitest/utils': 2.1.5 - storybook: 8.5.0(prettier@3.4.2) + storybook: 8.5.1(prettier@3.4.2) - '@storybook/manager-api@8.5.0(storybook@8.5.0(prettier@3.4.2))': + '@storybook/manager-api@8.5.1(storybook@8.5.1(prettier@3.4.2))': dependencies: - storybook: 8.5.0(prettier@3.4.2) + storybook: 8.5.1(prettier@3.4.2) - '@storybook/preview-api@8.5.0(storybook@8.5.0(prettier@3.4.2))': + '@storybook/preview-api@8.5.1(storybook@8.5.1(prettier@3.4.2))': dependencies: - storybook: 8.5.0(prettier@3.4.2) + storybook: 8.5.1(prettier@3.4.2) - '@storybook/react-dom-shim@8.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.5.0(prettier@3.4.2))': + '@storybook/react-dom-shim@8.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.5.1(prettier@3.4.2))': dependencies: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - storybook: 8.5.0(prettier@3.4.2) + storybook: 8.5.1(prettier@3.4.2) - '@storybook/react-vite@8.5.0(@storybook/test@8.5.0(storybook@8.5.0(prettier@3.4.2)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.31.0)(storybook@8.5.0(prettier@3.4.2))(typescript@5.7.3)(vite@6.0.11(@types/node@22.10.7)(jiti@2.4.2)(tsx@4.19.2)(yaml@2.7.0))': + '@storybook/react-vite@8.5.1(@storybook/test@8.5.1(storybook@8.5.1(prettier@3.4.2)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.31.0)(storybook@8.5.1(prettier@3.4.2))(typescript@5.7.3)(vite@6.0.11(@types/node@22.10.10)(jiti@1.21.6)(tsx@4.19.2)(yaml@2.7.0))': dependencies: - '@joshwooding/vite-plugin-react-docgen-typescript': 0.4.2(typescript@5.7.3)(vite@6.0.11(@types/node@22.10.7)(jiti@2.4.2)(tsx@4.19.2)(yaml@2.7.0)) + '@joshwooding/vite-plugin-react-docgen-typescript': 0.4.2(typescript@5.7.3)(vite@6.0.11(@types/node@22.10.10)(jiti@1.21.6)(tsx@4.19.2)(yaml@2.7.0)) '@rollup/pluginutils': 5.1.4(rollup@4.31.0) - '@storybook/builder-vite': 8.5.0(storybook@8.5.0(prettier@3.4.2))(vite@6.0.11(@types/node@22.10.7)(jiti@2.4.2)(tsx@4.19.2)(yaml@2.7.0)) - '@storybook/react': 8.5.0(@storybook/test@8.5.0(storybook@8.5.0(prettier@3.4.2)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.5.0(prettier@3.4.2))(typescript@5.7.3) + '@storybook/builder-vite': 8.5.1(storybook@8.5.1(prettier@3.4.2))(vite@6.0.11(@types/node@22.10.10)(jiti@1.21.6)(tsx@4.19.2)(yaml@2.7.0)) + '@storybook/react': 8.5.1(@storybook/test@8.5.1(storybook@8.5.1(prettier@3.4.2)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.5.1(prettier@3.4.2))(typescript@5.7.3) find-up: 5.0.0 magic-string: 0.30.17 react: 18.3.1 react-docgen: 7.1.0 react-dom: 18.3.1(react@18.3.1) resolve: 1.22.8 - storybook: 8.5.0(prettier@3.4.2) + storybook: 8.5.1(prettier@3.4.2) tsconfig-paths: 4.2.0 - vite: 6.0.11(@types/node@22.10.7)(jiti@2.4.2)(tsx@4.19.2)(yaml@2.7.0) + vite: 6.0.11(@types/node@22.10.10)(jiti@1.21.6)(tsx@4.19.2)(yaml@2.7.0) optionalDependencies: - '@storybook/test': 8.5.0(storybook@8.5.0(prettier@3.4.2)) + '@storybook/test': 8.5.1(storybook@8.5.1(prettier@3.4.2)) transitivePeerDependencies: - rollup - supports-color - typescript - '@storybook/react@8.5.0(@storybook/test@8.5.0(storybook@8.5.0(prettier@3.4.2)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.5.0(prettier@3.4.2))(typescript@5.7.3)': + '@storybook/react@8.5.1(@storybook/test@8.5.1(storybook@8.5.1(prettier@3.4.2)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.5.1(prettier@3.4.2))(typescript@5.7.3)': dependencies: - '@storybook/components': 8.5.0(storybook@8.5.0(prettier@3.4.2)) + '@storybook/components': 8.5.1(storybook@8.5.1(prettier@3.4.2)) '@storybook/global': 5.0.0 - '@storybook/manager-api': 8.5.0(storybook@8.5.0(prettier@3.4.2)) - '@storybook/preview-api': 8.5.0(storybook@8.5.0(prettier@3.4.2)) - '@storybook/react-dom-shim': 8.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.5.0(prettier@3.4.2)) - '@storybook/theming': 8.5.0(storybook@8.5.0(prettier@3.4.2)) + '@storybook/manager-api': 8.5.1(storybook@8.5.1(prettier@3.4.2)) + '@storybook/preview-api': 8.5.1(storybook@8.5.1(prettier@3.4.2)) + '@storybook/react-dom-shim': 8.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.5.1(prettier@3.4.2)) + '@storybook/theming': 8.5.1(storybook@8.5.1(prettier@3.4.2)) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - storybook: 8.5.0(prettier@3.4.2) + storybook: 8.5.1(prettier@3.4.2) optionalDependencies: - '@storybook/test': 8.5.0(storybook@8.5.0(prettier@3.4.2)) + '@storybook/test': 8.5.1(storybook@8.5.1(prettier@3.4.2)) typescript: 5.7.3 - '@storybook/test@8.5.0(storybook@8.5.0(prettier@3.4.2))': + '@storybook/test@8.5.1(storybook@8.5.1(prettier@3.4.2))': dependencies: '@storybook/csf': 0.1.12 '@storybook/global': 5.0.0 - '@storybook/instrumenter': 8.5.0(storybook@8.5.0(prettier@3.4.2)) + '@storybook/instrumenter': 8.5.1(storybook@8.5.1(prettier@3.4.2)) '@testing-library/dom': 10.4.0 '@testing-library/jest-dom': 6.5.0 '@testing-library/user-event': 14.5.2(@testing-library/dom@10.4.0) '@vitest/expect': 2.0.5 '@vitest/spy': 2.0.5 - storybook: 8.5.0(prettier@3.4.2) + storybook: 8.5.1(prettier@3.4.2) - '@storybook/theming@8.5.0(storybook@8.5.0(prettier@3.4.2))': + '@storybook/theming@8.5.1(storybook@8.5.1(prettier@3.4.2))': dependencies: - storybook: 8.5.0(prettier@3.4.2) + storybook: 8.5.1(prettier@3.4.2) - '@storybook/types@8.5.0(storybook@8.5.0(prettier@3.4.2))': + '@storybook/types@8.5.1(storybook@8.5.1(prettier@3.4.2))': dependencies: - storybook: 8.5.0(prettier@3.4.2) + storybook: 8.5.1(prettier@3.4.2) '@swc/helpers@0.5.15': dependencies: @@ -16139,15 +16087,15 @@ snapshots: lodash: 4.17.21 redent: 3.0.0 - '@testing-library/react@16.2.0(@testing-library/dom@10.4.0)(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@testing-library/react@16.2.0(@testing-library/dom@10.4.0)(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.26.0 '@testing-library/dom': 10.4.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 '@testing-library/user-event@14.5.2(@testing-library/dom@10.4.0)': dependencies: @@ -16170,7 +16118,7 @@ snapshots: '@types/aria-query@5.0.4': {} - '@types/aws-lambda@8.10.145': {} + '@types/aws-lambda@8.10.147': {} '@types/babel__code-frame@7.0.6': {} @@ -16184,33 +16132,33 @@ snapshots: '@types/babel__generator@7.6.8': dependencies: - '@babel/types': 7.26.0 + '@babel/types': 7.26.5 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.26.2 - '@babel/types': 7.26.0 + '@babel/parser': 7.26.5 + '@babel/types': 7.26.5 '@types/babel__traverse@7.20.6': dependencies: - '@babel/types': 7.26.0 + '@babel/types': 7.26.5 '@types/body-parser@1.19.5': dependencies: '@types/connect': 3.4.38 - '@types/node': 22.10.7 + '@types/node': 22.10.10 - '@types/braces@3.0.4': {} + '@types/braces@3.0.5': {} '@types/connect@3.4.38': dependencies: - '@types/node': 22.10.7 + '@types/node': 22.10.10 '@types/cookie@0.6.0': {} '@types/cross-spawn@6.0.6': dependencies: - '@types/node': 22.10.7 + '@types/node': 22.10.10 '@types/d3-array@3.2.1': {} @@ -16351,7 +16299,7 @@ snapshots: '@types/express-serve-static-core@5.0.1': dependencies: - '@types/node': 22.10.7 + '@types/node': 22.10.10 '@types/qs': 6.9.17 '@types/range-parser': 1.2.7 '@types/send': 0.17.4 @@ -16387,7 +16335,7 @@ snapshots: '@types/micromatch@4.0.9': dependencies: - '@types/braces': 3.0.4 + '@types/braces': 3.0.5 '@types/mime@1.3.5': {} @@ -16395,7 +16343,7 @@ snapshots: '@types/morgan@1.9.9': dependencies: - '@types/node': 22.10.7 + '@types/node': 22.10.10 '@types/ms@0.7.34': {} @@ -16411,12 +16359,12 @@ snapshots: '@types/node-fetch@2.6.12': dependencies: - '@types/node': 22.10.7 + '@types/node': 22.10.10 form-data: 4.0.1 '@types/node@17.0.45': {} - '@types/node@22.10.7': + '@types/node@22.10.10': dependencies: undici-types: 6.20.0 @@ -16426,29 +16374,29 @@ snapshots: '@types/plist@3.0.5': dependencies: - '@types/node': 22.10.7 + '@types/node': 22.10.10 xmlbuilder: 15.1.1 '@types/prismjs@1.26.5': {} '@types/prompts@2.4.9': dependencies: - '@types/node': 22.10.7 + '@types/node': 22.10.10 kleur: 3.0.3 - '@types/prop-types@15.7.14': {} + '@types/prop-types@15.7.13': {} '@types/qs@6.9.17': {} '@types/range-parser@1.2.7': {} - '@types/react-dom@18.3.5(@types/react@18.3.18)': + '@types/react-dom@18.3.1': dependencies: - '@types/react': 18.3.18 + '@types/react': 18.3.12 - '@types/react@18.3.18': + '@types/react@18.3.12': dependencies: - '@types/prop-types': 15.7.14 + '@types/prop-types': 15.7.13 csstype: 3.1.3 '@types/remark-heading-id@1.0.0': @@ -16461,24 +16409,24 @@ snapshots: '@types/sax@1.2.7': dependencies: - '@types/node': 22.10.7 + '@types/node': 22.10.10 '@types/semver@7.5.8': {} '@types/send@0.17.4': dependencies: '@types/mime': 1.3.5 - '@types/node': 22.10.7 + '@types/node': 22.10.10 '@types/serve-static@1.15.7': dependencies: '@types/http-errors': 2.0.4 - '@types/node': 22.10.7 + '@types/node': 22.10.10 '@types/send': 0.17.4 '@types/ssri@7.1.5': dependencies: - '@types/node': 22.10.7 + '@types/node': 22.10.10 '@types/swagger-ui-dist@3.30.5': {} @@ -16496,7 +16444,7 @@ snapshots: '@types/xml2js@0.4.14': dependencies: - '@types/node': 22.10.7 + '@types/node': 22.10.10 '@types/yargs-parser@21.0.3': {} @@ -16504,15 +16452,15 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@8.21.0(@typescript-eslint/parser@8.21.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3)': + '@typescript-eslint/eslint-plugin@8.21.0(@typescript-eslint/parser@8.21.0(eslint@9.18.0(jiti@1.21.6))(typescript@5.7.3))(eslint@9.18.0(jiti@1.21.6))(typescript@5.7.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.21.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/parser': 8.21.0(eslint@9.18.0(jiti@1.21.6))(typescript@5.7.3) '@typescript-eslint/scope-manager': 8.21.0 - '@typescript-eslint/type-utils': 8.21.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3) - '@typescript-eslint/utils': 8.21.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/type-utils': 8.21.0(eslint@9.18.0(jiti@1.21.6))(typescript@5.7.3) + '@typescript-eslint/utils': 8.21.0(eslint@9.18.0(jiti@1.21.6))(typescript@5.7.3) '@typescript-eslint/visitor-keys': 8.21.0 - eslint: 9.18.0(jiti@2.4.2) + eslint: 9.18.0(jiti@1.21.6) graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 @@ -16521,24 +16469,24 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.21.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3)': + '@typescript-eslint/parser@8.21.0(eslint@9.18.0(jiti@1.21.6))(typescript@5.7.3)': dependencies: '@typescript-eslint/scope-manager': 8.21.0 '@typescript-eslint/types': 8.21.0 '@typescript-eslint/typescript-estree': 8.21.0(typescript@5.7.3) '@typescript-eslint/visitor-keys': 8.21.0 debug: 4.4.0(supports-color@8.1.1) - eslint: 9.18.0(jiti@2.4.2) + eslint: 9.18.0(jiti@1.21.6) typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/rule-tester@8.21.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3)': + '@typescript-eslint/rule-tester@8.21.0(eslint@9.18.0(jiti@1.21.6))(typescript@5.7.3)': dependencies: '@typescript-eslint/typescript-estree': 8.21.0(typescript@5.7.3) - '@typescript-eslint/utils': 8.21.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/utils': 8.21.0(eslint@9.18.0(jiti@1.21.6))(typescript@5.7.3) ajv: 6.12.6 - eslint: 9.18.0(jiti@2.4.2) + eslint: 9.18.0(jiti@1.21.6) json-stable-stringify-without-jsonify: 1.0.1 lodash.merge: 4.6.2 semver: 7.6.3 @@ -16556,12 +16504,12 @@ snapshots: '@typescript-eslint/types': 8.21.0 '@typescript-eslint/visitor-keys': 8.21.0 - '@typescript-eslint/type-utils@8.21.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3)': + '@typescript-eslint/type-utils@8.21.0(eslint@9.18.0(jiti@1.21.6))(typescript@5.7.3)': dependencies: '@typescript-eslint/typescript-estree': 8.21.0(typescript@5.7.3) - '@typescript-eslint/utils': 8.21.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/utils': 8.21.0(eslint@9.18.0(jiti@1.21.6))(typescript@5.7.3) debug: 4.4.0(supports-color@8.1.1) - eslint: 9.18.0(jiti@2.4.2) + eslint: 9.18.0(jiti@1.21.6) ts-api-utils: 2.0.0(typescript@5.7.3) typescript: 5.7.3 transitivePeerDependencies: @@ -16580,7 +16528,7 @@ snapshots: is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.6.3 - ts-api-utils: 1.4.0(typescript@5.7.3) + ts-api-utils: 1.4.3(typescript@5.7.3) optionalDependencies: typescript: 5.7.3 transitivePeerDependencies: @@ -16600,24 +16548,24 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@7.18.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3)': + '@typescript-eslint/utils@7.18.0(eslint@9.18.0(jiti@1.21.6))(typescript@5.7.3)': dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.18.0(jiti@2.4.2)) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.18.0(jiti@1.21.6)) '@typescript-eslint/scope-manager': 7.18.0 '@typescript-eslint/types': 7.18.0 '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.7.3) - eslint: 9.18.0(jiti@2.4.2) + eslint: 9.18.0(jiti@1.21.6) transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/utils@8.21.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3)': + '@typescript-eslint/utils@8.21.0(eslint@9.18.0(jiti@1.21.6))(typescript@5.7.3)': dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.18.0(jiti@2.4.2)) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.18.0(jiti@1.21.6)) '@typescript-eslint/scope-manager': 8.21.0 '@typescript-eslint/types': 8.21.0 '@typescript-eslint/typescript-estree': 8.21.0(typescript@5.7.3) - eslint: 9.18.0(jiti@2.4.2) + eslint: 9.18.0(jiti@1.21.6) typescript: 5.7.3 transitivePeerDependencies: - supports-color @@ -16634,18 +16582,18 @@ snapshots: '@ungap/structured-clone@1.2.0': {} - '@vitejs/plugin-react@4.3.4(vite@6.0.11(@types/node@22.10.7)(jiti@2.4.2)(tsx@4.19.2)(yaml@2.7.0))': + '@vitejs/plugin-react@4.3.4(vite@6.0.11(@types/node@22.10.10)(jiti@1.21.6)(tsx@4.19.2)(yaml@2.7.0))': dependencies: '@babel/core': 7.26.0 '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.0) '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.0) '@types/babel__core': 7.20.5 react-refresh: 0.14.2 - vite: 6.0.11(@types/node@22.10.7)(jiti@2.4.2)(tsx@4.19.2)(yaml@2.7.0) + vite: 6.0.11(@types/node@22.10.10)(jiti@1.21.6)(tsx@4.19.2)(yaml@2.7.0) transitivePeerDependencies: - supports-color - '@vitest/coverage-v8@3.0.3(vitest@3.0.3(@types/node@22.10.7)(@vitest/ui@3.0.3)(happy-dom@16.7.2)(jiti@2.4.2)(jsdom@26.0.0)(tsx@4.19.2)(yaml@2.7.0))': + '@vitest/coverage-v8@3.0.4(vitest@3.0.4(@types/debug@4.1.12)(@types/node@22.10.10)(@vitest/ui@3.0.4)(happy-dom@16.7.2)(jiti@1.21.6)(jsdom@19.0.0)(tsx@4.19.2)(yaml@2.7.0))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 1.0.2 @@ -16659,7 +16607,7 @@ snapshots: std-env: 3.8.0 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.0.3(@types/node@22.10.7)(@vitest/ui@3.0.3)(happy-dom@16.7.2)(jiti@2.4.2)(jsdom@26.0.0)(tsx@4.19.2)(yaml@2.7.0) + vitest: 3.0.4(@types/debug@4.1.12)(@types/node@22.10.10)(@vitest/ui@3.0.4)(happy-dom@16.7.2)(jiti@1.21.6)(jsdom@19.0.0)(tsx@4.19.2)(yaml@2.7.0) transitivePeerDependencies: - supports-color @@ -16670,20 +16618,20 @@ snapshots: chai: 5.1.2 tinyrainbow: 1.2.0 - '@vitest/expect@3.0.3': + '@vitest/expect@3.0.4': dependencies: - '@vitest/spy': 3.0.3 - '@vitest/utils': 3.0.3 + '@vitest/spy': 3.0.4 + '@vitest/utils': 3.0.4 chai: 5.1.2 tinyrainbow: 2.0.0 - '@vitest/mocker@3.0.3(vite@6.0.11(@types/node@22.10.7)(jiti@2.4.2)(tsx@4.19.2)(yaml@2.7.0))': + '@vitest/mocker@3.0.4(vite@6.0.11(@types/node@22.10.10)(jiti@1.21.6)(tsx@4.19.2)(yaml@2.7.0))': dependencies: - '@vitest/spy': 3.0.3 + '@vitest/spy': 3.0.4 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 6.0.11(@types/node@22.10.7)(jiti@2.4.2)(tsx@4.19.2)(yaml@2.7.0) + vite: 6.0.11(@types/node@22.10.10)(jiti@1.21.6)(tsx@4.19.2)(yaml@2.7.0) '@vitest/pretty-format@2.0.5': dependencies: @@ -16693,18 +16641,18 @@ snapshots: dependencies: tinyrainbow: 1.2.0 - '@vitest/pretty-format@3.0.3': + '@vitest/pretty-format@3.0.4': dependencies: tinyrainbow: 2.0.0 - '@vitest/runner@3.0.3': + '@vitest/runner@3.0.4': dependencies: - '@vitest/utils': 3.0.3 + '@vitest/utils': 3.0.4 pathe: 2.0.2 - '@vitest/snapshot@3.0.3': + '@vitest/snapshot@3.0.4': dependencies: - '@vitest/pretty-format': 3.0.3 + '@vitest/pretty-format': 3.0.4 magic-string: 0.30.17 pathe: 2.0.2 @@ -16712,20 +16660,20 @@ snapshots: dependencies: tinyspy: 3.0.2 - '@vitest/spy@3.0.3': + '@vitest/spy@3.0.4': dependencies: tinyspy: 3.0.2 - '@vitest/ui@3.0.3(vitest@3.0.3)': + '@vitest/ui@3.0.4(vitest@3.0.4)': dependencies: - '@vitest/utils': 3.0.3 + '@vitest/utils': 3.0.4 fflate: 0.8.2 flatted: 3.3.2 pathe: 2.0.2 sirv: 3.0.0 tinyglobby: 0.2.10 tinyrainbow: 2.0.0 - vitest: 3.0.3(@types/node@22.10.7)(@vitest/ui@3.0.3)(happy-dom@16.7.2)(jiti@2.4.2)(jsdom@26.0.0)(tsx@4.19.2)(yaml@2.7.0) + vitest: 3.0.4(@types/debug@4.1.12)(@types/node@22.10.10)(@vitest/ui@3.0.4)(happy-dom@16.7.2)(jiti@1.21.6)(jsdom@19.0.0)(tsx@4.19.2)(yaml@2.7.0) '@vitest/utils@2.0.5': dependencies: @@ -16740,9 +16688,9 @@ snapshots: loupe: 3.1.2 tinyrainbow: 1.2.0 - '@vitest/utils@3.0.3': + '@vitest/utils@3.0.4': dependencies: - '@vitest/pretty-format': 3.0.3 + '@vitest/pretty-format': 3.0.4 loupe: 3.1.2 tinyrainbow: 2.0.0 @@ -16808,12 +16756,12 @@ snapshots: '@vscode/l10n@0.0.18': {} - '@vscode/test-web@0.0.62': + '@vscode/test-web@0.0.65': dependencies: '@koa/cors': 5.0.0 '@koa/router': 13.1.0 '@playwright/browser-chromium': 1.49.0 - glob: 11.0.0 + glob: 11.0.1 gunzip-maybe: 1.4.2 http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 @@ -16822,7 +16770,7 @@ snapshots: koa-mount: 4.0.0 koa-static: 5.0.0 minimist: 1.2.8 - playwright: 1.49.1 + playwright: 1.50.0 tar-fs: 3.0.6 vscode-uri: 3.0.8 transitivePeerDependencies: @@ -16900,7 +16848,7 @@ snapshots: '@vue/compiler-core@3.5.13': dependencies: - '@babel/parser': 7.26.2 + '@babel/parser': 7.26.5 '@vue/shared': 3.5.13 entities: 4.5.0 estree-walker: 2.0.2 @@ -16971,12 +16919,6 @@ snapshots: transitivePeerDependencies: - supports-color - agent-base@7.1.1: - dependencies: - debug: 4.4.0(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - agent-base@7.1.3: {} ajv-draft-04@1.0.0(ajv@8.13.0): @@ -17023,21 +16965,21 @@ snapshots: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 - algoliasearch@5.20.0: - dependencies: - '@algolia/client-abtesting': 5.20.0 - '@algolia/client-analytics': 5.20.0 - '@algolia/client-common': 5.20.0 - '@algolia/client-insights': 5.20.0 - '@algolia/client-personalization': 5.20.0 - '@algolia/client-query-suggestions': 5.20.0 - '@algolia/client-search': 5.20.0 - '@algolia/ingestion': 1.20.0 - '@algolia/monitoring': 1.20.0 - '@algolia/recommend': 5.20.0 - '@algolia/requester-browser-xhr': 5.20.0 - '@algolia/requester-fetch': 5.20.0 - '@algolia/requester-node-http': 5.20.0 + algoliasearch@5.15.0: + dependencies: + '@algolia/client-abtesting': 5.15.0 + '@algolia/client-analytics': 5.15.0 + '@algolia/client-common': 5.15.0 + '@algolia/client-insights': 5.15.0 + '@algolia/client-personalization': 5.15.0 + '@algolia/client-query-suggestions': 5.15.0 + '@algolia/client-search': 5.15.0 + '@algolia/ingestion': 1.15.0 + '@algolia/monitoring': 1.15.0 + '@algolia/recommend': 5.15.0 + '@algolia/requester-browser-xhr': 5.15.0 + '@algolia/requester-fetch': 5.15.0 + '@algolia/requester-node-http': 5.15.0 alien-signals@0.4.14: {} @@ -17112,16 +17054,21 @@ snapshots: call-bind: 1.0.7 is-array-buffer: 3.0.4 + array-buffer-byte-length@1.0.2: + dependencies: + call-bound: 1.0.3 + is-array-buffer: 3.0.5 + array-flatten@1.1.1: {} array-includes@3.1.8: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.5 - es-object-atoms: 1.0.0 - get-intrinsic: 1.2.4 - is-string: 1.0.7 + es-abstract: 1.23.9 + es-object-atoms: 1.1.1 + get-intrinsic: 1.2.7 + is-string: 1.1.1 array-iterate@2.0.1: {} @@ -17131,37 +17078,36 @@ snapshots: array.prototype.findlastindex@1.2.5: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.5 + es-abstract: 1.23.9 es-errors: 1.3.0 - es-object-atoms: 1.0.0 + es-object-atoms: 1.1.1 es-shim-unscopables: 1.0.2 - array.prototype.flat@1.3.2: + array.prototype.flat@1.3.3: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.5 + es-abstract: 1.23.9 es-shim-unscopables: 1.0.2 - array.prototype.flatmap@1.3.2: + array.prototype.flatmap@1.3.3: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.5 + es-abstract: 1.23.9 es-shim-unscopables: 1.0.2 - arraybuffer.prototype.slice@1.0.3: + arraybuffer.prototype.slice@1.0.4: dependencies: - array-buffer-byte-length: 1.0.1 - call-bind: 1.0.7 + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.5 + es-abstract: 1.23.9 es-errors: 1.3.0 - get-intrinsic: 1.2.4 - is-array-buffer: 3.0.4 - is-shared-array-buffer: 1.0.3 + get-intrinsic: 1.2.7 + is-array-buffer: 3.0.5 as-table@1.0.55: dependencies: @@ -17175,26 +17121,26 @@ snapshots: astring@1.9.0: {} - astro-expressive-code@0.40.1(astro@5.1.8(@azure/identity@4.6.0)(@azure/storage-blob@12.26.0)(@types/node@22.10.7)(jiti@2.4.2)(rollup@4.31.0)(tsx@4.19.2)(typescript@5.7.3)(yaml@2.7.0)): + astro-expressive-code@0.40.1(astro@5.1.8(@azure/identity@4.6.0)(@azure/storage-blob@12.26.0)(@types/node@22.10.10)(jiti@1.21.6)(rollup@4.31.0)(tsx@4.19.2)(typescript@5.7.3)(yaml@2.7.0)): dependencies: - astro: 5.1.8(@azure/identity@4.6.0)(@azure/storage-blob@12.26.0)(@types/node@22.10.7)(jiti@2.4.2)(rollup@4.31.0)(tsx@4.19.2)(typescript@5.7.3)(yaml@2.7.0) + astro: 5.1.8(@azure/identity@4.6.0)(@azure/storage-blob@12.26.0)(@types/node@22.10.10)(jiti@1.21.6)(rollup@4.31.0)(tsx@4.19.2)(typescript@5.7.3)(yaml@2.7.0) rehype-expressive-code: 0.40.1 - astro-rehype-relative-markdown-links@0.15.0(astro@5.1.8(@azure/identity@4.6.0)(@azure/storage-blob@12.26.0)(@types/node@22.10.7)(jiti@2.4.2)(rollup@4.31.0)(tsx@4.19.2)(typescript@5.7.3)(yaml@2.7.0)): + astro-rehype-relative-markdown-links@0.15.0(astro@5.1.8(@azure/identity@4.6.0)(@azure/storage-blob@12.26.0)(@types/node@22.10.10)(jiti@1.21.6)(rollup@4.31.0)(tsx@4.19.2)(typescript@5.7.3)(yaml@2.7.0)): dependencies: - astro: 5.1.8(@azure/identity@4.6.0)(@azure/storage-blob@12.26.0)(@types/node@22.10.7)(jiti@2.4.2)(rollup@4.31.0)(tsx@4.19.2)(typescript@5.7.3)(yaml@2.7.0) + astro: 5.1.8(@azure/identity@4.6.0)(@azure/storage-blob@12.26.0)(@types/node@22.10.10)(jiti@1.21.6)(rollup@4.31.0)(tsx@4.19.2)(typescript@5.7.3)(yaml@2.7.0) catch-unknown: 2.0.0 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.3.7 github-slugger: 2.0.0 gray-matter: 4.0.3 is-absolute-url: 4.0.1 unified: 11.0.5 unist-util-visit: 5.0.0 - zod: 3.24.1 + zod: 3.23.8 transitivePeerDependencies: - supports-color - astro@5.1.8(@azure/identity@4.6.0)(@azure/storage-blob@12.26.0)(@types/node@22.10.7)(jiti@2.4.2)(rollup@4.31.0)(tsx@4.19.2)(typescript@5.7.3)(yaml@2.7.0): + astro@5.1.8(@azure/identity@4.6.0)(@azure/storage-blob@12.26.0)(@types/node@22.10.10)(jiti@1.21.6)(rollup@4.31.0)(tsx@4.19.2)(typescript@5.7.3)(yaml@2.7.0): dependencies: '@astrojs/compiler': 2.10.3 '@astrojs/internal-helpers': 0.4.2 @@ -17246,8 +17192,8 @@ snapshots: unist-util-visit: 5.0.0 unstorage: 1.14.4(@azure/identity@4.6.0)(@azure/storage-blob@12.26.0) vfile: 6.0.3 - vite: 6.0.11(@types/node@22.10.7)(jiti@2.4.2)(tsx@4.19.2)(yaml@2.7.0) - vitefu: 1.0.5(vite@6.0.11(@types/node@22.10.7)(jiti@2.4.2)(tsx@4.19.2)(yaml@2.7.0)) + vite: 6.0.11(@types/node@22.10.10)(jiti@1.21.6)(tsx@4.19.2)(yaml@2.7.0) + vitefu: 1.0.5(vite@6.0.11(@types/node@22.10.10)(jiti@1.21.6)(tsx@4.19.2)(yaml@2.7.0)) which-pm: 3.0.0 xxhash-wasm: 1.1.0 yargs-parser: 21.1.1 @@ -17291,6 +17237,8 @@ snapshots: - uploadthing - yaml + async-function@1.0.0: {} + async@3.2.6: {} asynckit@0.4.0: {} @@ -17351,7 +17299,7 @@ snapshots: dependencies: '@babel/core': 7.26.0 '@babel/helper-define-polyfill-provider': 0.6.3(@babel/core@7.26.0) - core-js-compat: 3.39.0 + core-js-compat: 3.40.0 transitivePeerDependencies: - supports-color @@ -17501,6 +17449,13 @@ snapshots: node-releases: 2.0.18 update-browserslist-db: 1.1.1(browserslist@4.24.2) + browserslist@4.24.4: + dependencies: + caniuse-lite: 1.0.30001695 + electron-to-chromium: 1.5.87 + node-releases: 2.0.19 + update-browserslist-db: 1.1.2(browserslist@4.24.4) + buffer-crc32@0.2.13: {} buffer-equal-constant-time@1.0.1: {} @@ -17561,6 +17516,11 @@ snapshots: mime-types: 2.1.35 ylru: 1.4.0 + call-bind-apply-helpers@1.0.1: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + call-bind@1.0.7: dependencies: es-define-property: 1.0.0 @@ -17569,6 +17529,18 @@ snapshots: get-intrinsic: 1.2.4 set-function-length: 1.2.2 + call-bind@1.0.8: + dependencies: + call-bind-apply-helpers: 1.0.1 + es-define-property: 1.0.1 + get-intrinsic: 1.2.7 + set-function-length: 1.2.2 + + call-bound@1.0.3: + dependencies: + call-bind-apply-helpers: 1.0.1 + get-intrinsic: 1.2.7 + call-me-maybe@1.0.2: {} callsites@3.1.0: {} @@ -17593,6 +17565,8 @@ snapshots: caniuse-lite@1.0.30001682: {} + caniuse-lite@1.0.30001695: {} + catch-unknown@2.0.0: {} ccount@2.0.1: {} @@ -17607,7 +17581,7 @@ snapshots: chalk-template@1.1.0: dependencies: - chalk: 5.3.0 + chalk: 5.4.1 chalk@2.4.2: dependencies: @@ -17894,9 +17868,9 @@ snapshots: depd: 2.0.0 keygrip: 1.1.0 - core-js-compat@3.39.0: + core-js-compat@3.40.0: dependencies: - browserslist: 4.24.2 + browserslist: 4.24.4 core-util-is@1.0.3: {} @@ -17925,7 +17899,7 @@ snapshots: optionalDependencies: typescript: 5.7.3 - create-storybook@8.5.0: + create-storybook@8.5.1: dependencies: '@types/semver': 7.5.8 commander: 12.1.0 @@ -17936,7 +17910,7 @@ snapshots: prettier: 3.4.2 prompts: 2.4.2 semver: 7.6.3 - storybook: 8.5.0(prettier@3.4.2) + storybook: 8.5.1(prettier@3.4.2) tiny-invariant: 1.3.3 ts-dedent: 2.2.0 transitivePeerDependencies: @@ -18073,12 +18047,6 @@ snapshots: dependencies: cssom: 0.3.8 - cssstyle@4.2.1: - dependencies: - '@asamuzakjp/css-color': 2.8.3 - rrweb-cssom: 0.8.0 - optional: true - csstype@3.1.3: {} cytoscape-cose-bilkent@4.1.0(cytoscape@3.30.3): @@ -18275,29 +18243,23 @@ snapshots: whatwg-mimetype: 3.0.0 whatwg-url: 11.0.0 - data-urls@5.0.0: - dependencies: - whatwg-mimetype: 4.0.0 - whatwg-url: 14.1.0 - optional: true - - data-view-buffer@1.0.1: + data-view-buffer@1.0.2: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.3 es-errors: 1.3.0 - is-data-view: 1.0.1 + is-data-view: 1.0.2 - data-view-byte-length@1.0.1: + data-view-byte-length@1.0.2: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.3 es-errors: 1.3.0 - is-data-view: 1.0.1 + is-data-view: 1.0.2 - data-view-byte-offset@1.0.0: + data-view-byte-offset@1.0.1: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.3 es-errors: 1.3.0 - is-data-view: 1.0.1 + is-data-view: 1.0.2 date-fns@4.1.0: {} @@ -18315,6 +18277,10 @@ snapshots: dependencies: ms: 2.1.3 + debug@4.3.7: + dependencies: + ms: 2.1.3 + debug@4.4.0(supports-color@8.1.1): dependencies: ms: 2.1.3 @@ -18373,9 +18339,9 @@ snapshots: define-data-property@1.1.4: dependencies: - es-define-property: 1.0.0 + es-define-property: 1.0.1 es-errors: 1.3.0 - gopd: 1.0.1 + gopd: 1.2.0 define-lazy-prop@2.0.0: {} @@ -18467,6 +18433,12 @@ snapshots: dset@3.1.4: {} + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + duplexify@3.7.1: dependencies: end-of-stream: 1.4.4 @@ -18514,15 +18486,17 @@ snapshots: electron-to-chromium@1.5.63: {} - embla-carousel-autoplay@8.5.2(embla-carousel@8.5.2): + electron-to-chromium@1.5.87: {} + + embla-carousel-autoplay@8.5.1(embla-carousel@8.5.1): dependencies: - embla-carousel: 8.5.2 + embla-carousel: 8.5.1 - embla-carousel-fade@8.5.2(embla-carousel@8.5.2): + embla-carousel-fade@8.5.1(embla-carousel@8.5.1): dependencies: - embla-carousel: 8.5.2 + embla-carousel: 8.5.1 - embla-carousel@8.5.2: {} + embla-carousel@8.5.1: {} emmet@2.4.11: dependencies: @@ -18576,58 +18550,65 @@ snapshots: dependencies: is-arrayish: 0.2.1 - es-abstract@1.23.5: + es-abstract@1.23.9: dependencies: - array-buffer-byte-length: 1.0.1 - arraybuffer.prototype.slice: 1.0.3 + array-buffer-byte-length: 1.0.2 + arraybuffer.prototype.slice: 1.0.4 available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - data-view-buffer: 1.0.1 - data-view-byte-length: 1.0.1 - data-view-byte-offset: 1.0.0 - es-define-property: 1.0.0 + call-bind: 1.0.8 + call-bound: 1.0.3 + data-view-buffer: 1.0.2 + data-view-byte-length: 1.0.2 + data-view-byte-offset: 1.0.1 + es-define-property: 1.0.1 es-errors: 1.3.0 - es-object-atoms: 1.0.0 - es-set-tostringtag: 2.0.3 - es-to-primitive: 1.2.1 - function.prototype.name: 1.1.6 - get-intrinsic: 1.2.4 - get-symbol-description: 1.0.2 + es-object-atoms: 1.1.1 + es-set-tostringtag: 2.1.0 + es-to-primitive: 1.3.0 + function.prototype.name: 1.1.8 + get-intrinsic: 1.2.7 + get-proto: 1.0.1 + get-symbol-description: 1.1.0 globalthis: 1.0.4 - gopd: 1.0.1 + gopd: 1.2.0 has-property-descriptors: 1.0.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 + has-proto: 1.2.0 + has-symbols: 1.1.0 hasown: 2.0.2 - internal-slot: 1.0.7 - is-array-buffer: 3.0.4 + internal-slot: 1.1.0 + is-array-buffer: 3.0.5 is-callable: 1.2.7 - is-data-view: 1.0.1 - is-negative-zero: 2.0.3 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.3 - is-string: 1.0.7 - is-typed-array: 1.1.13 - is-weakref: 1.0.2 + is-data-view: 1.0.2 + is-regex: 1.2.1 + is-shared-array-buffer: 1.0.4 + is-string: 1.1.1 + is-typed-array: 1.1.15 + is-weakref: 1.1.0 + math-intrinsics: 1.1.0 object-inspect: 1.13.3 object-keys: 1.1.1 - object.assign: 4.1.5 - regexp.prototype.flags: 1.5.3 - safe-array-concat: 1.1.2 - safe-regex-test: 1.0.3 - string.prototype.trim: 1.2.9 - string.prototype.trimend: 1.0.8 + object.assign: 4.1.7 + own-keys: 1.0.1 + regexp.prototype.flags: 1.5.4 + safe-array-concat: 1.1.3 + safe-push-apply: 1.0.0 + safe-regex-test: 1.1.0 + set-proto: 1.0.0 + string.prototype.trim: 1.2.10 + string.prototype.trimend: 1.0.9 string.prototype.trimstart: 1.0.8 - typed-array-buffer: 1.0.2 - typed-array-byte-length: 1.0.1 - typed-array-byte-offset: 1.0.2 - typed-array-length: 1.0.6 - unbox-primitive: 1.0.2 - which-typed-array: 1.1.15 + typed-array-buffer: 1.0.3 + typed-array-byte-length: 1.0.3 + typed-array-byte-offset: 1.0.4 + typed-array-length: 1.0.7 + unbox-primitive: 1.1.0 + which-typed-array: 1.1.18 es-define-property@1.0.0: dependencies: - get-intrinsic: 1.2.4 + get-intrinsic: 1.2.7 + + es-define-property@1.0.1: {} es-errors@1.3.0: {} @@ -18647,13 +18628,14 @@ snapshots: es-module-shims@2.0.5: {} - es-object-atoms@1.0.0: + es-object-atoms@1.1.1: dependencies: es-errors: 1.3.0 - es-set-tostringtag@2.0.3: + es-set-tostringtag@2.1.0: dependencies: - get-intrinsic: 1.2.4 + es-errors: 1.3.0 + get-intrinsic: 1.2.7 has-tostringtag: 1.0.2 hasown: 2.0.2 @@ -18661,11 +18643,11 @@ snapshots: dependencies: hasown: 2.0.2 - es-to-primitive@1.2.1: + es-to-primitive@1.3.0: dependencies: is-callable: 1.2.7 - is-date-object: 1.0.5 - is-symbol: 1.0.4 + is-date-object: 1.1.0 + is-symbol: 1.1.1 es-toolkit@1.27.0: {} @@ -18776,72 +18758,72 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@8.21.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint@9.18.0(jiti@2.4.2)): + eslint-module-utils@2.12.0(@typescript-eslint/parser@8.21.0(eslint@9.18.0(jiti@1.21.6))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint@9.18.0(jiti@1.21.6)): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.21.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3) - eslint: 9.18.0(jiti@2.4.2) + '@typescript-eslint/parser': 8.21.0(eslint@9.18.0(jiti@1.21.6))(typescript@5.7.3) + eslint: 9.18.0(jiti@1.21.6) eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - eslint-plugin-deprecation@3.0.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3): + eslint-plugin-deprecation@3.0.0(eslint@9.18.0(jiti@1.21.6))(typescript@5.7.3): dependencies: - '@typescript-eslint/utils': 7.18.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3) - eslint: 9.18.0(jiti@2.4.2) - ts-api-utils: 1.4.0(typescript@5.7.3) + '@typescript-eslint/utils': 7.18.0(eslint@9.18.0(jiti@1.21.6))(typescript@5.7.3) + eslint: 9.18.0(jiti@1.21.6) + ts-api-utils: 1.4.3(typescript@5.7.3) tslib: 2.8.1 typescript: 5.7.3 transitivePeerDependencies: - supports-color - eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.21.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.18.0(jiti@2.4.2)): + eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.21.0(eslint@9.18.0(jiti@1.21.6))(typescript@5.7.3))(eslint@9.18.0(jiti@1.21.6)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 array.prototype.findlastindex: 1.2.5 - array.prototype.flat: 1.3.2 - array.prototype.flatmap: 1.3.2 + array.prototype.flat: 1.3.3 + array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 9.18.0(jiti@2.4.2) + eslint: 9.18.0(jiti@1.21.6) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.21.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint@9.18.0(jiti@2.4.2)) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.21.0(eslint@9.18.0(jiti@1.21.6))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint@9.18.0(jiti@1.21.6)) hasown: 2.0.2 - is-core-module: 2.15.1 + is-core-module: 2.16.1 is-glob: 4.0.3 minimatch: 3.1.2 object.fromentries: 2.0.8 object.groupby: 1.0.3 - object.values: 1.2.0 + object.values: 1.2.1 semver: 6.3.1 - string.prototype.trimend: 1.0.8 + string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.21.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/parser': 8.21.0(eslint@9.18.0(jiti@1.21.6))(typescript@5.7.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-react-hooks@5.1.0(eslint@9.18.0(jiti@2.4.2)): + eslint-plugin-react-hooks@5.1.0(eslint@9.18.0(jiti@1.21.6)): dependencies: - eslint: 9.18.0(jiti@2.4.2) + eslint: 9.18.0(jiti@1.21.6) - eslint-plugin-unicorn@56.0.1(eslint@9.18.0(jiti@2.4.2)): + eslint-plugin-unicorn@56.0.1(eslint@9.18.0(jiti@1.21.6)): dependencies: '@babel/helper-validator-identifier': 7.25.9 - '@eslint-community/eslint-utils': 4.4.1(eslint@9.18.0(jiti@2.4.2)) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.18.0(jiti@1.21.6)) ci-info: 4.1.0 clean-regexp: 1.0.0 - core-js-compat: 3.39.0 - eslint: 9.18.0(jiti@2.4.2) + core-js-compat: 3.40.0 + eslint: 9.18.0(jiti@1.21.6) esquery: 1.6.0 - globals: 15.12.0 + globals: 15.14.0 indent-string: 4.0.0 is-builtin-module: 3.2.1 - jsesc: 3.0.2 + jsesc: 3.1.0 pluralize: 8.0.0 read-pkg-up: 7.0.1 regexp-tree: 0.1.27 @@ -18849,12 +18831,12 @@ snapshots: semver: 7.6.3 strip-indent: 3.0.0 - eslint-plugin-vitest@0.5.4(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3)(vitest@3.0.3(@types/node@22.10.7)(@vitest/ui@3.0.3)(happy-dom@16.7.2)(jiti@2.4.2)(jsdom@26.0.0)(tsx@4.19.2)(yaml@2.7.0)): + eslint-plugin-vitest@0.5.4(eslint@9.18.0(jiti@1.21.6))(typescript@5.7.3)(vitest@3.0.4(@types/debug@4.1.12)(@types/node@22.10.10)(@vitest/ui@3.0.4)(happy-dom@16.7.2)(jiti@1.21.6)(jsdom@19.0.0)(tsx@4.19.2)(yaml@2.7.0)): dependencies: - '@typescript-eslint/utils': 7.18.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3) - eslint: 9.18.0(jiti@2.4.2) + '@typescript-eslint/utils': 7.18.0(eslint@9.18.0(jiti@1.21.6))(typescript@5.7.3) + eslint: 9.18.0(jiti@1.21.6) optionalDependencies: - vitest: 3.0.3(@types/node@22.10.7)(@vitest/ui@3.0.3)(happy-dom@16.7.2)(jiti@2.4.2)(jsdom@26.0.0)(tsx@4.19.2)(yaml@2.7.0) + vitest: 3.0.4(@types/debug@4.1.12)(@types/node@22.10.10)(@vitest/ui@3.0.4)(happy-dom@16.7.2)(jiti@1.21.6)(jsdom@19.0.0)(tsx@4.19.2)(yaml@2.7.0) transitivePeerDependencies: - supports-color - typescript @@ -18868,11 +18850,11 @@ snapshots: eslint-visitor-keys@4.2.0: {} - eslint@9.18.0(jiti@2.4.2): + eslint@9.18.0(jiti@1.21.6): dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.18.0(jiti@2.4.2)) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.18.0(jiti@1.21.6)) '@eslint-community/regexpp': 4.12.1 - '@eslint/config-array': 0.19.0 + '@eslint/config-array': 0.19.1 '@eslint/core': 0.10.0 '@eslint/eslintrc': 3.2.0 '@eslint/js': 9.18.0 @@ -18905,7 +18887,7 @@ snapshots: natural-compare: 1.4.0 optionator: 0.9.4 optionalDependencies: - jiti: 2.4.2 + jiti: 1.21.6 transitivePeerDependencies: - supports-color @@ -19117,6 +19099,10 @@ snapshots: optionalDependencies: picomatch: 4.0.2 + fdir@6.4.3(picomatch@4.0.2): + optionalDependencies: + picomatch: 4.0.2 + fecha@4.2.3: {} fetch-blob@3.2.0: @@ -19263,12 +19249,14 @@ snapshots: function-bind@1.1.2: {} - function.prototype.name@1.1.6: + function.prototype.name@1.1.8: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.3 define-properties: 1.2.1 - es-abstract: 1.23.5 functions-have-names: 1.2.3 + hasown: 2.0.2 + is-callable: 1.2.7 functions-have-names@1.2.3: {} @@ -19288,6 +19276,24 @@ snapshots: has-symbols: 1.0.3 hasown: 2.0.2 + get-intrinsic@1.2.7: + dependencies: + call-bind-apply-helpers: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + get-source@2.0.12: dependencies: data-uri-to-buffer: 2.0.2 @@ -19299,13 +19305,13 @@ snapshots: get-stream@8.0.1: {} - get-symbol-description@1.0.2: + get-symbol-description@1.1.0: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.3 es-errors: 1.3.0 - get-intrinsic: 1.2.4 + get-intrinsic: 1.2.7 - get-tsconfig@4.8.1: + get-tsconfig@4.10.0: dependencies: resolve-pkg-maps: 1.0.0 @@ -19351,6 +19357,15 @@ snapshots: package-json-from-dist: 1.0.1 path-scurry: 2.0.0 + glob@11.0.1: + dependencies: + foreground-child: 3.3.0 + jackspeak: 4.0.2 + minimatch: 10.0.1 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 2.0.0 + glob@7.2.3: dependencies: fs.realpath: 1.0.0 @@ -19368,12 +19383,12 @@ snapshots: globals@14.0.0: {} - globals@15.12.0: {} + globals@15.14.0: {} globalthis@1.0.4: dependencies: define-properties: 1.2.1 - gopd: 1.0.1 + gopd: 1.2.0 globby@11.1.0: dependencies: @@ -19395,7 +19410,9 @@ snapshots: gopd@1.0.1: dependencies: - get-intrinsic: 1.2.4 + get-intrinsic: 1.2.7 + + gopd@1.2.0: {} graceful-fs@4.2.10: {} @@ -19449,6 +19466,8 @@ snapshots: has-bigints@1.0.2: {} + has-bigints@1.1.0: {} + has-flag@3.0.0: {} has-flag@4.0.0: {} @@ -19457,15 +19476,21 @@ snapshots: has-property-descriptors@1.0.2: dependencies: - es-define-property: 1.0.0 + es-define-property: 1.0.1 has-proto@1.0.3: {} + has-proto@1.2.0: + dependencies: + dunder-proto: 1.0.1 + has-symbols@1.0.3: {} + has-symbols@1.1.0: {} + has-tostringtag@1.0.2: dependencies: - has-symbols: 1.0.3 + has-symbols: 1.1.0 hasown@2.0.2: dependencies: @@ -19699,11 +19724,6 @@ snapshots: dependencies: whatwg-encoding: 2.0.0 - html-encoding-sniffer@4.0.0: - dependencies: - whatwg-encoding: 3.1.1 - optional: true - html-escape@1.0.2: {} html-escaper@2.0.2: {} @@ -19763,7 +19783,7 @@ snapshots: http-proxy-agent@7.0.2: dependencies: - agent-base: 7.1.1 + agent-base: 7.1.3 debug: 4.4.0(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -19777,7 +19797,7 @@ snapshots: https-proxy-agent@7.0.5: dependencies: - agent-base: 7.1.1 + agent-base: 7.1.3 debug: 4.4.0(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -19855,6 +19875,12 @@ snapshots: hasown: 2.0.2 side-channel: 1.0.6 + internal-slot@1.1.0: + dependencies: + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.1.0 + internmap@1.0.1: {} internmap@2.0.3: {} @@ -19887,14 +19913,32 @@ snapshots: call-bind: 1.0.7 get-intrinsic: 1.2.4 + is-array-buffer@3.0.5: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + get-intrinsic: 1.2.7 + is-arrayish@0.2.1: {} is-arrayish@0.3.2: {} + is-async-function@2.1.1: + dependencies: + async-function: 1.0.0 + call-bound: 1.0.3 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + is-bigint@1.0.4: dependencies: has-bigints: 1.0.2 + is-bigint@1.1.0: + dependencies: + has-bigints: 1.1.0 + is-binary-path@2.1.0: dependencies: binary-extensions: 2.3.0 @@ -19904,28 +19948,36 @@ snapshots: call-bind: 1.0.7 has-tostringtag: 1.0.2 + is-boolean-object@1.2.1: + dependencies: + call-bound: 1.0.3 + has-tostringtag: 1.0.2 + is-builtin-module@3.2.1: dependencies: builtin-modules: 3.3.0 is-callable@1.2.7: {} - is-core-module@2.15.1: - dependencies: - hasown: 2.0.2 - is-core-module@2.16.1: dependencies: hasown: 2.0.2 - is-data-view@1.0.1: + is-data-view@1.0.2: dependencies: - is-typed-array: 1.1.13 + call-bound: 1.0.3 + get-intrinsic: 1.2.7 + is-typed-array: 1.1.15 is-date-object@1.0.5: dependencies: has-tostringtag: 1.0.2 + is-date-object@1.1.0: + dependencies: + call-bound: 1.0.3 + has-tostringtag: 1.0.2 + is-decimal@2.0.1: {} is-deflate@1.0.0: {} @@ -19938,11 +19990,18 @@ snapshots: is-extglob@2.1.1: {} + is-finalizationregistry@1.1.1: + dependencies: + call-bound: 1.0.3 + is-fullwidth-code-point@3.0.0: {} - is-generator-function@1.0.10: + is-generator-function@1.1.0: dependencies: + call-bound: 1.0.3 + get-proto: 1.0.1 has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 is-glob@4.0.3: dependencies: @@ -19964,12 +20023,15 @@ snapshots: is-module@1.0.0: {} - is-negative-zero@2.0.3: {} - is-number-object@1.0.7: dependencies: has-tostringtag: 1.0.2 + is-number-object@1.1.1: + dependencies: + call-bound: 1.0.3 + has-tostringtag: 1.0.2 + is-number@7.0.0: {} is-plain-obj@2.1.0: {} @@ -19993,12 +20055,23 @@ snapshots: call-bind: 1.0.7 has-tostringtag: 1.0.2 + is-regex@1.2.1: + dependencies: + call-bound: 1.0.3 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + is-set@2.0.3: {} is-shared-array-buffer@1.0.3: dependencies: call-bind: 1.0.7 + is-shared-array-buffer@1.0.4: + dependencies: + call-bound: 1.0.3 + is-stream@2.0.1: {} is-stream@3.0.0: {} @@ -20007,17 +20080,28 @@ snapshots: dependencies: has-tostringtag: 1.0.2 + is-string@1.1.1: + dependencies: + call-bound: 1.0.3 + has-tostringtag: 1.0.2 + is-subdir@1.2.0: dependencies: better-path-resolve: 1.0.0 is-symbol@1.0.4: dependencies: - has-symbols: 1.0.3 + has-symbols: 1.1.0 - is-typed-array@1.1.13: + is-symbol@1.1.1: dependencies: - which-typed-array: 1.1.15 + call-bound: 1.0.3 + has-symbols: 1.1.0 + safe-regex-test: 1.1.0 + + is-typed-array@1.1.15: + dependencies: + which-typed-array: 1.1.18 is-unicode-supported@0.1.0: {} @@ -20027,14 +20111,14 @@ snapshots: is-weakmap@2.0.2: {} - is-weakref@1.0.2: + is-weakref@1.1.0: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.3 is-weakset@2.0.3: dependencies: call-bind: 1.0.7 - get-intrinsic: 1.2.4 + get-intrinsic: 1.2.7 is-windows@1.0.2: {} @@ -20089,9 +20173,6 @@ snapshots: jiti@1.21.6: {} - jiti@2.4.2: - optional: true - jju@1.4.0: {} js-tokens@4.0.0: {} @@ -20170,39 +20251,12 @@ snapshots: - supports-color - utf-8-validate - jsdom@26.0.0: - dependencies: - cssstyle: 4.2.1 - data-urls: 5.0.0 - decimal.js: 10.4.3 - form-data: 4.0.1 - html-encoding-sniffer: 4.0.0 - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.6 - is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.16 - parse5: 7.2.1 - rrweb-cssom: 0.8.0 - saxes: 6.0.0 - symbol-tree: 3.2.4 - tough-cookie: 5.1.0 - w3c-xmlserializer: 5.0.0 - webidl-conversions: 7.0.0 - whatwg-encoding: 3.1.1 - whatwg-mimetype: 4.0.0 - whatwg-url: 14.1.0 - ws: 8.18.0 - xml-name-validator: 5.0.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - optional: true - jsesc@0.5.0: {} jsesc@3.0.2: {} + jsesc@3.1.0: {} + json-buffer@3.0.1: {} json-parse-even-better-errors@2.3.1: {} @@ -20360,7 +20414,7 @@ snapshots: fresh: 0.5.2 http-assert: 1.5.0 http-errors: 1.8.1 - is-generator-function: 1.0.10 + is-generator-function: 1.1.0 koa-compose: 4.1.0 koa-convert: 2.0.0 on-finished: 2.4.1 @@ -20395,9 +20449,9 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 - lilconfig@3.1.2: {} + lilconfig@2.1.0: {} - lilconfig@3.1.3: {} + lilconfig@3.1.2: {} lines-and-columns@1.2.4: {} @@ -20470,7 +20524,7 @@ snapshots: log-symbols@6.0.0: dependencies: - chalk: 5.4.1 + chalk: 5.3.0 is-unicode-supported: 1.3.0 logform@2.7.0: @@ -20520,8 +20574,8 @@ snapshots: magicast@0.3.5: dependencies: - '@babel/parser': 7.26.2 - '@babel/types': 7.26.0 + '@babel/parser': 7.26.5 + '@babel/types': 7.26.5 source-map-js: 1.2.1 make-dir@2.1.0: @@ -20575,6 +20629,8 @@ snapshots: glob: 7.2.3 picomatch: 2.3.1 + math-intrinsics@1.1.0: {} + mdast-util-definitions@6.0.0: dependencies: '@types/mdast': 4.0.4 @@ -20772,12 +20828,12 @@ snapshots: merge2@1.4.1: {} - mermaid-isomorphic@3.0.0(playwright@1.49.1): + mermaid-isomorphic@3.0.0(playwright@1.50.0): dependencies: '@fortawesome/fontawesome-free': 6.7.1 mermaid: 11.4.0 optionalDependencies: - playwright: 1.49.1 + playwright: 1.50.0 transitivePeerDependencies: - supports-color @@ -21328,6 +21384,8 @@ snapshots: node-releases@2.0.18: {} + node-releases@2.0.19: {} + nopt@8.1.0: dependencies: abbrev: 3.0.0 @@ -21407,9 +21465,6 @@ snapshots: nwsapi@2.2.0: {} - nwsapi@2.2.16: - optional: true - nypm@0.3.12: dependencies: citty: 0.1.6 @@ -21439,37 +21494,47 @@ snapshots: has-symbols: 1.0.3 object-keys: 1.1.1 + object.assign@4.1.7: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + has-symbols: 1.1.0 + object-keys: 1.1.1 + object.fromentries@2.0.8: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.5 - es-object-atoms: 1.0.0 + es-abstract: 1.23.9 + es-object-atoms: 1.1.1 object.groupby@1.0.3: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.5 + es-abstract: 1.23.9 - object.values@1.2.0: + object.values@1.2.1: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.3 define-properties: 1.2.1 - es-object-atoms: 1.0.0 + es-object-atoms: 1.1.1 - octokit@4.0.2: + octokit@4.1.0: dependencies: - '@octokit/app': 15.1.1 + '@octokit/app': 15.1.2 '@octokit/core': 6.1.3 - '@octokit/oauth-app': 7.1.3 + '@octokit/oauth-app': 7.1.5 '@octokit/plugin-paginate-graphql': 5.2.4(@octokit/core@6.1.3) - '@octokit/plugin-paginate-rest': 11.3.5(@octokit/core@6.1.3) + '@octokit/plugin-paginate-rest': 11.4.0(@octokit/core@6.1.3) '@octokit/plugin-rest-endpoint-methods': 13.3.0(@octokit/core@6.1.3) - '@octokit/plugin-retry': 7.1.2(@octokit/core@6.1.3) - '@octokit/plugin-throttling': 9.3.2(@octokit/core@6.1.3) - '@octokit/request-error': 6.1.5 - '@octokit/types': 13.6.1 + '@octokit/plugin-retry': 7.1.3(@octokit/core@6.1.3) + '@octokit/plugin-throttling': 9.4.0(@octokit/core@6.1.3) + '@octokit/request-error': 6.1.6 + '@octokit/types': 13.7.0 ofetch@1.4.1: dependencies: @@ -21548,7 +21613,7 @@ snapshots: ora@8.0.1: dependencies: - chalk: 5.4.1 + chalk: 5.3.0 cli-cursor: 4.0.0 cli-spinners: 2.9.2 is-interactive: 2.0.0 @@ -21558,6 +21623,12 @@ snapshots: string-width: 7.2.0 strip-ansi: 7.1.0 + own-keys@1.0.1: + dependencies: + get-intrinsic: 1.2.7 + object-keys: 1.1.1 + safe-push-apply: 1.0.0 + p-defer@1.0.0: {} p-filter@2.1.0: @@ -21780,11 +21851,11 @@ snapshots: playwright-core@1.49.0: {} - playwright-core@1.49.1: {} + playwright-core@1.50.0: {} - playwright@1.49.1: + playwright@1.50.0: dependencies: - playwright-core: 1.49.1 + playwright-core: 1.50.0 optionalDependencies: fsevents: 2.3.2 @@ -21814,7 +21885,7 @@ snapshots: postcss: 8.4.49 postcss-value-parser: 4.2.0 read-cache: 1.0.0 - resolve: 1.22.10 + resolve: 1.22.8 postcss-js@4.0.1(postcss@8.4.49): dependencies: @@ -21925,7 +21996,7 @@ snapshots: printable-characters@1.0.42: {} - prism-react-renderer@2.4.1(react@18.3.1): + prism-react-renderer@2.4.0(react@18.3.1): dependencies: '@types/prismjs': 1.26.5 clsx: 2.1.1 @@ -22045,7 +22116,7 @@ snapshots: '@types/doctrine': 0.0.9 '@types/resolve': 1.20.6 doctrine: 3.0.0 - resolve: 1.22.10 + resolve: 1.22.8 strip-indent: 4.0.0 transitivePeerDependencies: - supports-color @@ -22070,10 +22141,10 @@ snapshots: react-is@17.0.2: {} - react-markdown@9.0.3(@types/react@18.3.18)(react@18.3.1): + react-markdown@9.0.3(@types/react@18.3.12)(react@18.3.1): dependencies: '@types/hast': 3.0.4 - '@types/react': 18.3.18 + '@types/react': 18.3.12 devlop: 1.1.0 hast-util-to-jsx-runtime: 2.3.2 html-url-attributes: 3.0.1 @@ -22201,6 +22272,17 @@ snapshots: reduce-flatten@2.0.0: {} + reflect.getprototypeof@1.0.10: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.2.7 + get-proto: 1.0.1 + which-builtin-type: 1.2.1 + regenerate-unicode-properties@10.2.0: dependencies: regenerate: 1.4.2 @@ -22233,6 +22315,15 @@ snapshots: es-errors: 1.3.0 set-function-name: 2.0.2 + regexp.prototype.flags@1.5.4: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-errors: 1.3.0 + get-proto: 1.0.1 + gopd: 1.2.0 + set-function-name: 2.0.2 + regexpu-core@6.1.1: dependencies: regenerate: 1.4.2 @@ -22261,19 +22352,19 @@ snapshots: '@types/hast': 3.0.4 hast-util-format: 1.1.0 - rehype-mermaid@3.0.0(playwright@1.49.1): + rehype-mermaid@3.0.0(playwright@1.50.0): dependencies: '@types/hast': 3.0.4 hast-util-from-html-isomorphic: 2.0.0 hast-util-to-text: 4.0.2 - mermaid-isomorphic: 3.0.0(playwright@1.49.1) + mermaid-isomorphic: 3.0.0(playwright@1.50.0) mini-svg-data-uri: 1.4.4 space-separated-tokens: 2.0.2 unified: 11.0.5 unist-util-visit-parents: 6.0.1 vfile: 6.0.3 optionalDependencies: - playwright: 1.49.1 + playwright: 1.50.0 transitivePeerDependencies: - supports-color @@ -22458,7 +22549,7 @@ snapshots: rimraf@6.0.1: dependencies: - glob: 11.0.0 + glob: 11.0.1 package-json-from-dist: 1.0.1 robust-predicates@3.0.2: {} @@ -22504,9 +22595,6 @@ snapshots: points-on-curve: 0.2.0 points-on-path: 0.2.1 - rrweb-cssom@0.8.0: - optional: true - rtl-css-js@1.16.1: dependencies: '@babel/runtime': 7.26.0 @@ -22523,11 +22611,12 @@ snapshots: s.color@0.0.15: {} - safe-array-concat@1.1.2: + safe-array-concat@1.1.3: dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - has-symbols: 1.0.3 + call-bind: 1.0.8 + call-bound: 1.0.3 + get-intrinsic: 1.2.7 + has-symbols: 1.1.0 isarray: 2.0.5 safe-buffer@5.1.2: {} @@ -22540,11 +22629,16 @@ snapshots: execa: 5.1.1 path-name: 1.0.0 - safe-regex-test@1.0.3: + safe-push-apply@1.0.0: dependencies: - call-bind: 1.0.7 es-errors: 1.3.0 - is-regex: 1.1.4 + isarray: 2.0.5 + + safe-regex-test@1.1.0: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + is-regex: 1.2.1 safe-stable-stringify@2.5.0: {} @@ -22560,17 +22654,10 @@ snapshots: dependencies: xmlchars: 2.2.0 - saxes@6.0.0: - dependencies: - xmlchars: 2.2.0 - optional: true - scheduler@0.23.2: dependencies: loose-envify: 1.4.0 - scheduler@0.25.0: {} - search-insights@2.17.3: {} section-matter@1.0.0: @@ -22624,8 +22711,8 @@ snapshots: define-data-property: 1.1.4 es-errors: 1.3.0 function-bind: 1.1.2 - get-intrinsic: 1.2.4 - gopd: 1.0.1 + get-intrinsic: 1.2.7 + gopd: 1.2.0 has-property-descriptors: 1.0.2 set-function-name@2.0.2: @@ -22635,6 +22722,12 @@ snapshots: functions-have-names: 1.2.3 has-property-descriptors: 1.0.2 + set-proto@1.0.0: + dependencies: + dunder-proto: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + setprototypeof@1.1.0: {} setprototypeof@1.2.0: {} @@ -22688,6 +22781,26 @@ snapshots: '@shikijs/vscode-textmate': 10.0.1 '@types/hast': 3.0.4 + side-channel-list@1.0.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.3 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.7 + object-inspect: 1.13.3 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.7 + object-inspect: 1.13.3 + side-channel-map: 1.0.1 + side-channel@1.0.6: dependencies: call-bind: 1.0.7 @@ -22695,6 +22808,14 @@ snapshots: get-intrinsic: 1.2.4 object-inspect: 1.13.3 + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.3 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + siginfo@2.0.0: {} signal-exit@3.0.7: {} @@ -22705,7 +22826,7 @@ snapshots: dependencies: '@sigstore/bundle': 3.0.0 '@sigstore/core': 2.0.0 - '@sigstore/protobuf-specs': 0.3.2 + '@sigstore/protobuf-specs': 0.3.3 '@sigstore/sign': 3.0.0 '@sigstore/tuf': 3.0.0 '@sigstore/verify': 2.0.0 @@ -22747,9 +22868,9 @@ snapshots: smart-buffer@4.2.0: {} - socks-proxy-agent@8.0.4: + socks-proxy-agent@8.0.5: dependencies: - agent-base: 7.1.1 + agent-base: 7.1.3 debug: 4.4.0(supports-color@8.1.1) socks: 2.8.3 transitivePeerDependencies: @@ -22782,16 +22903,16 @@ snapshots: spdx-correct@3.2.0: dependencies: spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.20 + spdx-license-ids: 3.0.21 spdx-exceptions@2.5.0: {} spdx-expression-parse@3.0.1: dependencies: spdx-exceptions: 2.5.0 - spdx-license-ids: 3.0.20 + spdx-license-ids: 3.0.21 - spdx-license-ids@3.0.20: {} + spdx-license-ids@3.0.21: {} split2@3.2.2: dependencies: @@ -22828,9 +22949,9 @@ snapshots: stoppable@1.1.0: {} - storybook@8.5.0(prettier@3.4.2): + storybook@8.5.1(prettier@3.4.2): dependencies: - '@storybook/core': 8.5.0(prettier@3.4.2) + '@storybook/core': 8.5.1(prettier@3.4.2) optionalDependencies: prettier: 3.4.2 transitivePeerDependencies: @@ -22877,24 +22998,28 @@ snapshots: get-east-asian-width: 1.3.0 strip-ansi: 7.1.0 - string.prototype.trim@1.2.9: + string.prototype.trim@1.2.10: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.3 + define-data-property: 1.1.4 define-properties: 1.2.1 - es-abstract: 1.23.5 - es-object-atoms: 1.0.0 + es-abstract: 1.23.9 + es-object-atoms: 1.1.1 + has-property-descriptors: 1.0.2 - string.prototype.trimend@1.0.8: + string.prototype.trimend@1.0.9: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.3 define-properties: 1.2.1 - es-object-atoms: 1.0.0 + es-object-atoms: 1.1.1 string.prototype.trimstart@1.0.8: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-object-atoms: 1.0.0 + es-object-atoms: 1.1.1 string_decoder@1.1.1: dependencies: @@ -22958,8 +23083,6 @@ snapshots: stylis@4.3.4: {} - stylis@4.3.5: {} - sucrase@3.35.0: dependencies: '@jridgewell/gen-mapping': 0.3.5 @@ -23029,7 +23152,7 @@ snapshots: keyborg: 2.6.0 tslib: 2.8.1 - tailwindcss@3.4.17: + tailwindcss@3.4.15: dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -23040,7 +23163,7 @@ snapshots: glob-parent: 6.0.2 is-glob: 4.0.3 jiti: 1.21.6 - lilconfig: 3.1.3 + lilconfig: 2.1.0 micromatch: 4.0.8 normalize-path: 3.0.0 object-hash: 3.0.0 @@ -23152,7 +23275,7 @@ snapshots: tinyglobby@0.2.10: dependencies: - fdir: 6.4.2(picomatch@4.0.2) + fdir: 6.4.3(picomatch@4.0.2) picomatch: 4.0.2 tinypool@1.0.2: {} @@ -23163,14 +23286,6 @@ snapshots: tinyspy@3.0.2: {} - tldts-core@6.1.74: - optional: true - - tldts@6.1.74: - dependencies: - tldts-core: 6.1.74 - optional: true - tmp@0.2.3: {} to-regex-range@5.0.1: @@ -23190,20 +23305,10 @@ snapshots: universalify: 0.2.0 url-parse: 1.5.10 - tough-cookie@5.1.0: - dependencies: - tldts: 6.1.74 - optional: true - tr46@3.0.0: dependencies: punycode: 2.3.1 - tr46@5.0.0: - dependencies: - punycode: 2.3.1 - optional: true - tree-kill@1.2.2: {} trim-lines@3.0.1: {} @@ -23212,7 +23317,7 @@ snapshots: trough@2.2.0: {} - ts-api-utils@1.4.0(typescript@5.7.3): + ts-api-utils@1.4.3(typescript@5.7.3): dependencies: typescript: 5.7.3 @@ -23250,7 +23355,7 @@ snapshots: tsx@4.19.2: dependencies: esbuild: 0.23.1 - get-tsconfig: 4.8.1 + get-tsconfig: 4.10.0 optionalDependencies: fsevents: 2.3.3 @@ -23290,37 +23395,38 @@ snapshots: media-typer: 0.3.0 mime-types: 2.1.35 - typed-array-buffer@1.0.2: + typed-array-buffer@1.0.3: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.3 es-errors: 1.3.0 - is-typed-array: 1.1.13 + is-typed-array: 1.1.15 - typed-array-byte-length@1.0.1: + typed-array-byte-length@1.0.3: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 - typed-array-byte-offset@1.0.2: + typed-array-byte-offset@1.0.4: dependencies: available-typed-arrays: 1.0.7 - call-bind: 1.0.7 + call-bind: 1.0.8 for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + reflect.getprototypeof: 1.0.10 - typed-array-length@1.0.6: + typed-array-length@1.0.7: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 + gopd: 1.2.0 + is-typed-array: 1.1.15 possible-typed-array-names: 1.0.0 + reflect.getprototypeof: 1.0.10 typed-rest-client@1.8.11: dependencies: @@ -23349,12 +23455,12 @@ snapshots: dependencies: semver: 7.6.3 - typescript-eslint@8.21.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3): + typescript-eslint@8.21.0(eslint@9.18.0(jiti@1.21.6))(typescript@5.7.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.21.0(@typescript-eslint/parser@8.21.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3) - '@typescript-eslint/parser': 8.21.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3) - '@typescript-eslint/utils': 8.21.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3) - eslint: 9.18.0(jiti@2.4.2) + '@typescript-eslint/eslint-plugin': 8.21.0(@typescript-eslint/parser@8.21.0(eslint@9.18.0(jiti@1.21.6))(typescript@5.7.3))(eslint@9.18.0(jiti@1.21.6))(typescript@5.7.3) + '@typescript-eslint/parser': 8.21.0(eslint@9.18.0(jiti@1.21.6))(typescript@5.7.3) + '@typescript-eslint/utils': 8.21.0(eslint@9.18.0(jiti@1.21.6))(typescript@5.7.3) + eslint: 9.18.0(jiti@1.21.6) typescript: 5.7.3 transitivePeerDependencies: - supports-color @@ -23373,12 +23479,12 @@ snapshots: ultrahtml@1.5.3: {} - unbox-primitive@1.0.2: + unbox-primitive@1.1.0: dependencies: - call-bind: 1.0.7 - has-bigints: 1.0.2 - has-symbols: 1.0.3 - which-boxed-primitive: 1.0.2 + call-bound: 1.0.3 + has-bigints: 1.1.0 + has-symbols: 1.1.0 + which-boxed-primitive: 1.1.1 uncrypto@0.1.3: {} @@ -23524,6 +23630,12 @@ snapshots: escalade: 3.2.0 picocolors: 1.1.1 + update-browserslist-db@1.1.2(browserslist@4.24.4): + dependencies: + browserslist: 4.24.4 + escalade: 3.2.0 + picocolors: 1.1.1 + uri-js@4.4.1: dependencies: punycode: 2.3.1 @@ -23535,14 +23647,14 @@ snapshots: querystringify: 2.2.0 requires-port: 1.0.0 - use-disposable@1.0.4(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + use-disposable@1.0.4(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - use-sync-external-store@1.4.0(react@18.3.1): + use-sync-external-store@1.2.2(react@18.3.1): dependencies: react: 18.3.1 @@ -23552,9 +23664,9 @@ snapshots: dependencies: inherits: 2.0.4 is-arguments: 1.1.1 - is-generator-function: 1.0.10 - is-typed-array: 1.1.13 - which-typed-array: 1.1.15 + is-generator-function: 1.1.0 + is-typed-array: 1.1.15 + which-typed-array: 1.1.18 utils-merge@1.0.1: {} @@ -23594,13 +23706,13 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vite-node@3.0.3(@types/node@22.10.7)(jiti@2.4.2)(tsx@4.19.2)(yaml@2.7.0): + vite-node@3.0.4(@types/node@22.10.10)(jiti@1.21.6)(tsx@4.19.2)(yaml@2.7.0): dependencies: cac: 6.7.14 debug: 4.4.0(supports-color@8.1.1) es-module-lexer: 1.6.0 pathe: 2.0.2 - vite: 6.0.11(@types/node@22.10.7)(jiti@2.4.2)(tsx@4.19.2)(yaml@2.7.0) + vite: 6.0.11(@types/node@22.10.10)(jiti@1.21.6)(tsx@4.19.2)(yaml@2.7.0) transitivePeerDependencies: - '@types/node' - jiti @@ -23615,7 +23727,7 @@ snapshots: - tsx - yaml - vite-plugin-checker@0.8.0(eslint@9.18.0(jiti@2.4.2))(optionator@0.9.4)(typescript@5.7.3)(vite@6.0.11(@types/node@22.10.7)(jiti@2.4.2)(tsx@4.19.2)(yaml@2.7.0)): + vite-plugin-checker@0.8.0(eslint@9.18.0(jiti@1.21.6))(optionator@0.9.4)(typescript@5.7.3)(vite@6.0.11(@types/node@22.10.10)(jiti@1.21.6)(tsx@4.19.2)(yaml@2.7.0)): dependencies: '@babel/code-frame': 7.26.2 ansi-escapes: 4.3.2 @@ -23627,19 +23739,19 @@ snapshots: npm-run-path: 4.0.1 strip-ansi: 6.0.1 tiny-invariant: 1.3.3 - vite: 6.0.11(@types/node@22.10.7)(jiti@2.4.2)(tsx@4.19.2)(yaml@2.7.0) + vite: 6.0.11(@types/node@22.10.10)(jiti@1.21.6)(tsx@4.19.2)(yaml@2.7.0) vscode-languageclient: 7.0.0 vscode-languageserver: 7.0.0 vscode-languageserver-textdocument: 1.0.12 vscode-uri: 3.0.8 optionalDependencies: - eslint: 9.18.0(jiti@2.4.2) + eslint: 9.18.0(jiti@1.21.6) optionator: 0.9.4 typescript: 5.7.3 - vite-plugin-dts@4.5.0(@types/node@22.10.7)(rollup@4.31.0)(typescript@5.7.3)(vite@6.0.11(@types/node@22.10.7)(jiti@2.4.2)(tsx@4.19.2)(yaml@2.7.0)): + vite-plugin-dts@4.5.0(@types/node@22.10.10)(rollup@4.31.0)(typescript@5.7.3)(vite@6.0.11(@types/node@22.10.10)(jiti@1.21.6)(tsx@4.19.2)(yaml@2.7.0)): dependencies: - '@microsoft/api-extractor': 7.49.1(@types/node@22.10.7) + '@microsoft/api-extractor': 7.49.1(@types/node@22.10.10) '@rollup/pluginutils': 5.1.4(rollup@4.31.0) '@volar/typescript': 2.4.11 '@vue/language-core': 2.2.0(typescript@5.7.3) @@ -23650,37 +23762,37 @@ snapshots: magic-string: 0.30.17 typescript: 5.7.3 optionalDependencies: - vite: 6.0.11(@types/node@22.10.7)(jiti@2.4.2)(tsx@4.19.2)(yaml@2.7.0) + vite: 6.0.11(@types/node@22.10.10)(jiti@1.21.6)(tsx@4.19.2)(yaml@2.7.0) transitivePeerDependencies: - '@types/node' - rollup - supports-color - vite@6.0.11(@types/node@22.10.7)(jiti@2.4.2)(tsx@4.19.2)(yaml@2.7.0): + vite@6.0.11(@types/node@22.10.10)(jiti@1.21.6)(tsx@4.19.2)(yaml@2.7.0): dependencies: esbuild: 0.24.2 postcss: 8.5.1 rollup: 4.31.0 optionalDependencies: - '@types/node': 22.10.7 + '@types/node': 22.10.10 fsevents: 2.3.3 - jiti: 2.4.2 + jiti: 1.21.6 tsx: 4.19.2 yaml: 2.7.0 - vitefu@1.0.5(vite@6.0.11(@types/node@22.10.7)(jiti@2.4.2)(tsx@4.19.2)(yaml@2.7.0)): + vitefu@1.0.5(vite@6.0.11(@types/node@22.10.10)(jiti@1.21.6)(tsx@4.19.2)(yaml@2.7.0)): optionalDependencies: - vite: 6.0.11(@types/node@22.10.7)(jiti@2.4.2)(tsx@4.19.2)(yaml@2.7.0) + vite: 6.0.11(@types/node@22.10.10)(jiti@1.21.6)(tsx@4.19.2)(yaml@2.7.0) - vitest@3.0.3(@types/node@22.10.7)(@vitest/ui@3.0.3)(happy-dom@16.7.2)(jiti@2.4.2)(jsdom@26.0.0)(tsx@4.19.2)(yaml@2.7.0): + vitest@3.0.4(@types/debug@4.1.12)(@types/node@22.10.10)(@vitest/ui@3.0.4)(happy-dom@16.7.2)(jiti@1.21.6)(jsdom@19.0.0)(tsx@4.19.2)(yaml@2.7.0): dependencies: - '@vitest/expect': 3.0.3 - '@vitest/mocker': 3.0.3(vite@6.0.11(@types/node@22.10.7)(jiti@2.4.2)(tsx@4.19.2)(yaml@2.7.0)) - '@vitest/pretty-format': 3.0.3 - '@vitest/runner': 3.0.3 - '@vitest/snapshot': 3.0.3 - '@vitest/spy': 3.0.3 - '@vitest/utils': 3.0.3 + '@vitest/expect': 3.0.4 + '@vitest/mocker': 3.0.4(vite@6.0.11(@types/node@22.10.10)(jiti@1.21.6)(tsx@4.19.2)(yaml@2.7.0)) + '@vitest/pretty-format': 3.0.4 + '@vitest/runner': 3.0.4 + '@vitest/snapshot': 3.0.4 + '@vitest/spy': 3.0.4 + '@vitest/utils': 3.0.4 chai: 5.1.2 debug: 4.4.0(supports-color@8.1.1) expect-type: 1.1.0 @@ -23691,14 +23803,15 @@ snapshots: tinyexec: 0.3.2 tinypool: 1.0.2 tinyrainbow: 2.0.0 - vite: 6.0.11(@types/node@22.10.7)(jiti@2.4.2)(tsx@4.19.2)(yaml@2.7.0) - vite-node: 3.0.3(@types/node@22.10.7)(jiti@2.4.2)(tsx@4.19.2)(yaml@2.7.0) + vite: 6.0.11(@types/node@22.10.10)(jiti@1.21.6)(tsx@4.19.2)(yaml@2.7.0) + vite-node: 3.0.4(@types/node@22.10.10)(jiti@1.21.6)(tsx@4.19.2)(yaml@2.7.0) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 22.10.7 - '@vitest/ui': 3.0.3(vitest@3.0.3) + '@types/debug': 4.1.12 + '@types/node': 22.10.10 + '@vitest/ui': 3.0.4(vitest@3.0.4) happy-dom: 16.7.2 - jsdom: 26.0.0 + jsdom: 19.0.0 transitivePeerDependencies: - jiti - less @@ -23847,11 +23960,6 @@ snapshots: dependencies: xml-name-validator: 4.0.0 - w3c-xmlserializer@5.0.0: - dependencies: - xml-name-validator: 5.0.0 - optional: true - walk-up-path@3.0.1: {} wcwidth@1.0.1: @@ -23888,12 +23996,6 @@ snapshots: tr46: 3.0.0 webidl-conversions: 7.0.0 - whatwg-url@14.1.0: - dependencies: - tr46: 5.0.0 - webidl-conversions: 7.0.0 - optional: true - which-boxed-primitive@1.0.2: dependencies: is-bigint: 1.0.4 @@ -23902,6 +24004,30 @@ snapshots: is-string: 1.0.7 is-symbol: 1.0.4 + which-boxed-primitive@1.1.1: + dependencies: + is-bigint: 1.1.0 + is-boolean-object: 1.2.1 + is-number-object: 1.1.1 + is-string: 1.1.1 + is-symbol: 1.1.1 + + which-builtin-type@1.2.1: + dependencies: + call-bound: 1.0.3 + function.prototype.name: 1.1.8 + has-tostringtag: 1.0.2 + is-async-function: 2.1.1 + is-date-object: 1.1.0 + is-finalizationregistry: 1.1.1 + is-generator-function: 1.1.0 + is-regex: 1.2.1 + is-weakref: 1.1.0 + isarray: 2.0.5 + which-boxed-primitive: 1.1.1 + which-collection: 1.0.2 + which-typed-array: 1.1.18 + which-collection@1.0.2: dependencies: is-map: 2.0.3 @@ -23923,6 +24049,15 @@ snapshots: gopd: 1.0.1 has-tostringtag: 1.0.2 + which-typed-array@1.1.18: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.3 + for-each: 0.3.3 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + which@2.0.2: dependencies: isexe: 2.0.0 @@ -24019,9 +24154,6 @@ snapshots: xml-name-validator@4.0.0: {} - xml-name-validator@5.0.0: - optional: true - xml2js@0.5.0: dependencies: sax: 1.4.1 diff --git a/website/package.json b/website/package.json index 74cf75832c..0ed9d2416f 100644 --- a/website/package.json +++ b/website/package.json @@ -56,6 +56,7 @@ "@typespec/protobuf": "workspace:~", "@typespec/rest": "workspace:~", "@typespec/spec": "workspace:*", + "@typespec/spec-dashboard": "workspace:~", "@typespec/sse": "workspace:~", "@typespec/streams": "workspace:~", "@typespec/tspd": "workspace:~", diff --git a/website/src/components/fluent/fluent-layout.tsx b/website/src/components/fluent/fluent-layout.tsx new file mode 100644 index 0000000000..769a11f529 --- /dev/null +++ b/website/src/components/fluent/fluent-layout.tsx @@ -0,0 +1,18 @@ +import { FluentProvider, webDarkTheme, webLightTheme } from "@fluentui/react-components"; +import { useTheme } from "@typespec/astro-utils/utils/theme-react"; +import type { CSSProperties, ReactNode } from "react"; + +export const FluentLayout = ({ + children, + style, +}: { + children: ReactNode; + style?: CSSProperties; +}) => { + const theme = useTheme(); + return ( + + {children} + + ); +}; diff --git a/website/src/components/react-pages/playground.tsx b/website/src/components/react-pages/playground.tsx index 3f4cd3f84c..10e9d9bed0 100644 --- a/website/src/components/react-pages/playground.tsx +++ b/website/src/components/react-pages/playground.tsx @@ -1,7 +1,6 @@ -import { FluentProvider, webDarkTheme, webLightTheme } from "@fluentui/react-components"; -import { useTheme } from "@typespec/astro-utils/utils/theme-react"; import "@typespec/playground/styles.css"; import { useEffect, useState, type ReactNode } from "react"; +import { FluentLayout } from "../fluent/fluent-layout"; import { loadImportMap, type VersionData } from "../playground-component/import-map"; export const AsyncPlayground = ({ @@ -30,12 +29,3 @@ export const AsyncPlayground = ({ ); }; - -const FluentLayout = ({ children, style }) => { - const theme = useTheme(); - return ( - - {children} - - ); -}; diff --git a/website/src/pages/can-i-use/http.astro b/website/src/pages/can-i-use/http.astro new file mode 100644 index 0000000000..25cdbb5819 --- /dev/null +++ b/website/src/pages/can-i-use/http.astro @@ -0,0 +1,27 @@ +--- +import { FluentLayout } from "../../components/fluent/fluent-layout"; +import BaseLayout from "../../layouts/base-layout.astro"; +import { + DashboardFromAzureStorage, + type CoverageFromAzureStorageOptions, +} from "@typespec/spec-dashboard"; + +const options: CoverageFromAzureStorageOptions = { + storageAccountName: "typespec", + containerName: "coverage", + manifestContainerName: "manifests-typespec", + emitterNames: [ + "@typespec/http-client-python", + "@typespec/http-client-csharp", + "@azure-tools/typespec-ts-rlc", + "@azure-tools/typespec-ts-modular", + "@typespec/http-client-java", + ], +}; +--- + + + + + +