From 8a3d1c1459ebf511352b2cfe827b21534ff9566f Mon Sep 17 00:00:00 2001 From: Wes Haggard Date: Mon, 11 Dec 2023 14:06:27 -0800 Subject: [PATCH] Intiial commit for typespec azure libraries --- .editorconfig | 16 + .gitattributes | 19 + .github/CODEOWNERS | 5 + .github/ISSUE_TEMPLATE/0_general.md | 4 + .../ISSUE_TEMPLATE/breaking-change-form.md | 31 + .github/ISSUE_TEMPLATE/bug-report.md | 19 + .github/ISSUE_TEMPLATE/feature-request.md | 18 + .github/ISSUE_TEMPLATE/onboarding-request.md | 40 + .github/dependabot.yml | 17 + .github/policies/issues.add-labels.yml | 47 + .github/workflows/codeql.yml | 69 + .github/workflows/merge-release-in-main.yml | 48 + .github/workflows/website-gh-pages.yml | 61 + .gitignore | 204 + .gitmodules | 4 + .prettierignore | 58 + .prettierrc.json | 22 + .vscode/extensions.json | 8 + .vscode/launch.json | 246 + .vscode/settings.json | 83 + .vscode/tasks.json | 106 + CONTRIBUTING.md | 247 + LICENSE | 21 + README.md | 60 + SECURITY.md | 41 + .../removeproviderhub_2023-11-22-18-53.json | 10 + common/config/rush/.npmrc | 15 + common/config/rush/.npmrc-publish | 25 + common/config/rush/.pnpmfile.cjs | 37 + common/config/rush/command-line.json | 188 + common/config/rush/common-versions.json | 44 + common/config/rush/pnpm-config.json | 208 + common/config/rush/pnpm-lock.yaml | 19437 ++++++++++++++++ common/config/rush/repo-state.json | 4 + common/config/rush/version-policies.json | 100 + common/scripts/install-run-rush-pnpm.js | 28 + common/scripts/install-run-rush.js | 215 + common/scripts/install-run-rushx.js | 28 + common/scripts/install-run.js | 716 + core | 1 + cspell.yaml | 48 + design/unions.md | 294 + docs/emitters/typespec-autorest/index.md | 198 + .../typespec-autorest/reference/decorators.md | 50 + .../typespec-autorest/reference/emitter.md | 115 + .../typespec-autorest/reference/index.mdx | 43 + docs/emitters/typespec-csharp/index.md | 6 + .../reference/emitter.md | 30 + .../reference/index.mdx | 36 + docs/getstarted/azure-core/step01.md | 23 + docs/getstarted/azure-core/step02.md | 12 + docs/getstarted/azure-core/step03.md | 15 + docs/getstarted/azure-core/step04.md | 28 + docs/getstarted/azure-core/step05.md | 121 + docs/getstarted/azure-core/step06.md | 45 + docs/getstarted/azure-core/step07.md | 48 + docs/getstarted/azure-core/step08.md | 56 + docs/getstarted/azure-core/step09.md | 251 + docs/getstarted/azure-core/step10.md | 104 + docs/getstarted/azure-core/step11.md | 5 + docs/getstarted/azure-core/step12.md | 48 + .../azure-resource-manager/step00.md | 5 + .../azure-resource-manager/step01.md | 44 + .../azure-resource-manager/step02.md | 109 + .../azure-resource-manager/step03.md | 39 + .../azure-resource-manager/step04.md | 103 + .../azure-resource-manager/step05.md | 130 + docs/getstarted/createproject.md | 43 + docs/getstarted/installation.md | 22 + docs/howtos/ARM/arm-rules.md | 50 + docs/howtos/ARM/resource-operations.md | 268 + docs/howtos/ARM/resource-type.md | 533 + docs/howtos/Azure Core/content-negotiation.md | 50 + .../Azure Core/long-running-operations.md | 529 + .../DataPlane Generation - DPG/00howtogen.mdx | 55 + .../DataPlane Generation - DPG/01setup.mdx | 40 + .../DataPlane Generation - DPG/02client.mdx | 590 + .../03convenient.mdx | 244 + .../DataPlane Generation - DPG/04renaming.mdx | 209 + .../DataPlane Generation - DPG/05union.mdx | 199 + .../howtos/TypeSpec/emitter-configurations.md | 3 + docs/howtos/migrate-swagger/_category_.json | 6 + docs/howtos/migrate-swagger/get-started.md | 22 + docs/howtos/rest-api-publish/_category_.json | 6 + .../howtos/rest-api-publish/buildpipelines.md | 65 + .../checking-in-api-specs-guide.md | 3 + docs/intro.md | 59 + .../azure-core/reference/data-types.md | 762 + .../azure-core/reference/decorators.md | 439 + docs/libraries/azure-core/reference/index.mdx | 174 + .../azure-core/reference/interfaces.md | 765 + docs/libraries/azure-core/reference/linter.md | 61 + .../rules/no-closed-literal-union.md | 41 + docs/libraries/azure-core/rules/no-enum.md | 29 + .../reference/data-types.md | 1105 + .../reference/decorators.md | 405 + .../reference/index.mdx | 204 + .../reference/interfaces.md | 957 + .../reference/linter.md | 51 + .../rules/unsupported-type.md | 34 + .../reference/decorators.md | 307 + .../reference/index.mdx | 51 + docs/reference/arm/index.md | 143 + docs/reference/azure-style-guide.md | 164 + docs/reference/azure.core/index.md | 93 + docs/release-notes/cadl-typespec-migration.md | 84 + docs/release-notes/release-2022-07-08.md | 69 + docs/release-notes/release-2022-08-10.md | 339 + docs/release-notes/release-2022-09-07.md | 63 + docs/release-notes/release-2022-10-12.md | 29 + docs/release-notes/release-2022-11-11.md | 75 + docs/release-notes/release-2022-12-07.md | 52 + docs/release-notes/release-2023-01-12.md | 79 + docs/release-notes/release-2023-02-07.md | 81 + docs/release-notes/release-2023-03-13.md | 47 + docs/release-notes/release-2023-04-11.md | 67 + docs/release-notes/release-2023-05-10.md | 59 + docs/release-notes/release-2023-06-06.md | 131 + docs/release-notes/release-2023-07-11.md | 62 + docs/release-notes/release-2023-08-08.md | 55 + docs/release-notes/release-2023-09-12.md | 106 + docs/release-notes/release-2023-10-11.md | 59 + docs/release-notes/release-2023-11-07.md | 96 + docs/release-notes/release-2023-12-06.md | 68 + .../arm-proxy-operations-error.md | 37 + docs/troubleshoot/sdl.md | 15 + docs/troubleshoot/suppresswarnings.md | 23 + docs/troubleshoot/troubleshoot_template | 9 + docs/typespec-getting-started.md | 82 + eng/MSSharedLibKey.snk | Bin 0 -> 160 bytes .../examples/Employees_CreateOrUpdate.json | 77 + eng/feeds/arm/examples/Employees_Delete.json | 19 + eng/feeds/arm/examples/Employees_Get.json | 37 + .../Employees_ListByResourceGroup.json | 41 + .../Employees_ListBySubscription.json | 40 + eng/feeds/arm/examples/Employees_Update.json | 47 + eng/feeds/arm/examples/Operations_List.json | 28 + eng/feeds/arm/main.tsp | 69 + eng/feeds/arm/tspconfig.yaml | 9 + eng/feeds/azure-scaffolding.json | 104 + eng/feeds/data-plane/client.tsp | 5 + .../Widgets_CreateOrUpdateWidgetSample.json | 37 + .../Widgets_DeleteWidgetSample.json | 29 + ...idgets_GetWidgetOperationStatusSample.json | 45 + .../Widgets_GetWidgetSample.json | 25 + .../Widgets_ListWidgetsSample.json | 27 + eng/feeds/data-plane/main.tsp | 67 + eng/feeds/data-plane/tspconfig.yaml | 33 + eng/feeds/scratch/.gitignore | 3 + eng/pipelines/ci.yml | 95 + eng/pipelines/e2e-job.yml | 22 + eng/pipelines/jobs/build-and-test.yml | 80 + eng/pipelines/jobs/publish-artifacts.yml | 34 + .../jobs/pull-request-consistency.yml | 16 + eng/pipelines/nuget-release.yml | 90 + eng/pipelines/pr-tryit.yml | 54 + eng/pipelines/pr.yml | 67 + eng/pipelines/templates/build.yml | 5 + eng/pipelines/templates/install-browsers.yml | 5 + eng/pipelines/templates/install.yml | 31 + eng/pipelines/templates/swagger-checks.yml | 23 + eng/pipelines/templates/upload-coverage.yml | 9 + eng/pipelines/templates/variables/globals.yml | 3 + eng/scripts/check-for-changed-files.js | 22 + eng/scripts/check-format.js | 16 + eng/scripts/compare_swagger.py | 33 + eng/scripts/cspell.js | 22 + eng/scripts/dogfood.js | 4 + eng/scripts/download-common-types.js | 27 + eng/scripts/format.js | 5 + eng/scripts/gen-sdk.js | 77 + eng/scripts/generate-third-party-notices.js | 136 + eng/scripts/helpers.js | 279 + eng/scripts/lint-resourcemanager.js | 135 + eng/scripts/new_service_adoption.py | 178 + eng/scripts/npm-run-for-deps.js | 5 + eng/scripts/npm-run.js | 4 + eng/scripts/package.json | 7 + eng/scripts/prepare-publish.js | 286 + eng/scripts/upload-bundler-packages.js | 26 + eng/scripts/validate-core-submodule.js | 16 + eng/scripts/watch.js | 2 + packages/Directory.Build.props | 8 + .../e2e-tests/cadl-ranch-specs/package.json | 8 + packages/e2e-tests/e2e-tests.mjs | 193 + packages/e2e-tests/package.json | 32 + .../src/SubscriptionLifecycle/AccountOwner.cs | 37 + .../AdditionalProperties.cs | 37 + .../AdditionalStateInformation.cs | 37 + .../AvailabilityZones.cs | 38 + .../SubscriptionLifecycle/BillingAccount.cs | 29 + .../BillingProperties.cs | 85 + .../Enums/BillingType.cs | 27 + .../Enums/ChannelType.cs | 27 + .../Enums/CostCategory.cs | 27 + .../Enums/PaymentType.cs | 27 + .../Enums/RegistrationState.cs | 27 + .../Enums/SpendingLimit.cs | 27 + .../src/SubscriptionLifecycle/Enums/Tier.cs | 27 + .../Enums/WorkloadType.cs | 27 + .../SubscriptionLifecycle/ManagedByTenant.cs | 29 + .../RegisteredFeature.cs | 37 + .../RegistrationStatePayload.cs | 47 + .../RegistrationStateProperties.cs | 98 + .../SubscriptionLifecycle/ResourceStatus.cs | 38 + .../src/SubscriptionLifecycle/ZoneMapping.cs | 37 + .../test/SubscriptionLifecycleTests.cs | 293 + packages/samples/.eslintrc.cjs | 7 + packages/samples/.mocharc.yaml | 7 + packages/samples/LICENSE | 21 + packages/samples/README.md | 11 + packages/samples/mocha.reporter.config.json | 4 + packages/samples/package.json | 64 + packages/samples/scratch/.gitignore | 3 + .../data-plane/api-path-parameter/main.tsp | 127 + .../data-plane/azure-core-scalars/main.tsp | 63 + .../confidentialledger/confidentialledger.tsp | 269 + .../confidentialledger/identityservice.tsp | 38 + .../data-plane/confidentialledger/main.tsp | 2 + .../data-plane/custom-error-type/main.tsp | 81 + .../specs/data-plane/formrecognizer/main.tsp | 822 + .../language/authoring/authoring.tsp | 365 + .../data-plane/language/authoring/main.tsp | 1 + .../languageqna/Interface/common.tsp | 130 + .../data-plane/languageqna/Interface/main.tsp | 80 + .../questionanswering-authoring_models.tsp | 233 + .../data-plane/languageqna/Raw/common.tsp | 102 + .../specs/data-plane/languageqna/Raw/main.tsp | 521 + .../specs/data-plane/searchindex/main.tsp | 1067 + .../specs/data-plane/searchservice/common.tsp | 92 + .../searchservice/dataIdentity.model.tsp | 8 + .../searchservice/dataPolicy.model.tsp | 13 + .../data-plane/searchservice/languages.tsp | 213 + .../specs/data-plane/searchservice/main.tsp | 4 + .../searchservice/search-datasource.ops.tsp | 89 + .../searchservice/search-index.models.tsp | 1630 ++ .../searchservice/search-index.ops.tsp | 108 + .../searchservice/search-indexer.ops.tsp | 153 + .../searchservice/searchservice.models.tsp | 538 + .../searchservice/skills.models.tsp | 588 + .../data-plane/searchservice/skills.ops.tsp | 88 + .../data-plane/trait-versioning/main.tsp | 121 + .../specs/data-plane/widget-manager/main.tsp | 274 + .../samples/specs/misc/appconfig/api.json | 1313 ++ .../samples/specs/misc/appconfig/keys.tsp | 37 + .../specs/misc/appconfig/keyvalues.tsp | 174 + .../samples/specs/misc/appconfig/labels.tsp | 45 + .../samples/specs/misc/appconfig/locks.tsp | 35 + .../samples/specs/misc/appconfig/main.tsp | 10 + .../samples/specs/misc/appconfig/models.tsp | 97 + .../specs/misc/appconfig/revisions.tsp | 52 + .../samples/specs/misc/overloads/main.tsp | 1 + .../specs/misc/overloads/overloads.tsp | 39 + .../specs/misc/overloads/tspconfig.yaml | 5 + .../samples/specs/resource-manager/README.md | 1 + .../resource-manager/arm-library/main.tsp | 75 + .../arm-library/ref-library/int-templates.tsp | 117 + .../arm-library/ref-library/op-templates.tsp | 43 + .../arm-scenarios/extension-resource/main.tsp | 77 + .../arm-scenarios/nobody-action/main.tsp | 96 + .../arm-scenarios/proxy/main.tsp | 132 + .../arm-scenarios/singleton/main.tsp | 99 + .../arm-scenarios/tenant/main.tsp | 101 + .../arm-scenarios/tracked/main.tsp | 101 + .../arm-scenarios/tspconfig.yaml | 6 + .../codesigning/codesigning.tsp | 200 + .../resource-manager/codesigning/main.tsp | 1 + .../codesigning/tspconfig.yaml | 6 + .../common-types/v3/types.json | 667 + .../common-types/v4/managedidentity.json | 101 + .../common-types/v4/privatelinks.json | 190 + .../common-types/v4/types.json | 611 + .../common-types/v5/customermanagedkeys.json | 65 + .../common-types/v5/managedidenity.json | 102 + .../common-types/v5/privatelinks.json | 179 + .../common-types/v5/types.json | 663 + .../resource-manager/contoso/contoso.tsp | 69 + .../specs/resource-manager/contoso/main.tsp | 1 + .../csharpattributetest/main.tsp | 54 + .../customer-managed-keys/main.tsp | 51 + .../discriminatortest/common.tsp | 13 + .../discriminatortest/main.tsp | 98 + .../specs/resource-manager/dynatrace/main.tsp | 131 + .../resource-manager/dynatrace/models.tsp | 416 + .../resource-manager/envelopetest/main.tsp | 77 + .../confluent.rest.typespec-example | 165 + .../liftr.confluent/confluent.tsp | 170 + .../resource-manager/liftr.confluent/main.tsp | 1 + .../resource-manager/liftr.frs/fluidrelay.tsp | 115 + .../specs/resource-manager/liftr.frs/main.tsp | 1 + .../specs/resource-manager/liftr.frs/notes.md | 220 + .../resource-manager/liftr.playfab/main.tsp | 1 + .../liftr.playfab/playfab.tsp | 83 + .../specs/resource-manager/logz/logz.tsp | 105 + .../specs/resource-manager/logz/main.tsp | 2 + .../specs/resource-manager/logz/models.tsp | 234 + .../resource-manager/logz/tspconfig.yaml | 6 + .../resource-manager/operationsTest/main.tsp | 166 + .../operationsTest/opTemplates.tsp | 283 + .../resource-manager/private-links/main.tsp | 93 + .../resource-manager/servicelinker/main.tsp | 1 + .../servicelinker/servicelinker.tsp | 173 + .../servicelinker/tspconfig.yaml | 6 + .../resource-manager/tagsUpdateTest/main.tsp | 165 + .../resource-manager/tenantResource/main.tsp | 198 + .../specs/resource-manager/tspconfig.yaml | 6 + .../typespec-autorest/2022-08-31/openapi.json | 1314 ++ .../openapi3/openapi.2022-08-31.yaml | 891 + .../typespec-autorest/2022-08-31/openapi.json | 233 + .../openapi3/openapi.2022-08-31.yaml | 171 + .../typespec-autorest/openapi.json | 859 + .../@typespec/openapi3/openapi.yaml | 614 + .../typespec-autorest/2022-08-31/openapi.json | 760 + .../openapi3/openapi.2022-08-31.yaml | 502 + .../typespec-autorest/openapi.json | 2136 ++ .../@typespec/openapi3/openapi.yaml | 1441 ++ .../typespec-autorest/openapi.json | 1589 ++ .../authoring/@typespec/openapi3/openapi.yaml | 1161 + .../typespec-autorest/openapi.json | 1291 + .../Interface/@typespec/openapi3/openapi.yaml | 933 + .../typespec-autorest/openapi.json | 2212 ++ .../Raw/@typespec/openapi3/openapi.yaml | 1558 ++ .../typespec-autorest/openapi.json | 2644 +++ .../@typespec/openapi3/openapi.yaml | 1173 + .../typespec-autorest/openapi.json | 8209 +++++++ .../@typespec/openapi3/openapi.yaml | 4395 ++++ .../typespec-autorest/2022-08-31/openapi.json | 1187 + .../typespec-autorest/2023-02-07/openapi.json | 1321 ++ .../openapi3/openapi.2022-08-31.yaml | 809 + .../openapi3/openapi.2023-02-07.yaml | 893 + .../typespec-autorest/2022-08-31/openapi.json | 2471 ++ .../openapi3/openapi.2022-08-31.yaml | 1674 ++ .../typespec-autorest/openapi.json | 1216 + .../appconfig/@typespec/openapi3/openapi.yaml | 833 + .../typespec-autorest/openapi.json | 136 + .../typespec-autorest/openapi.json | 2196 ++ .../2021-10-01-preview/openapi.json | 465 + .../2021-10-01-preview/openapi.json | 718 + .../2021-10-01-preview/openapi.json | 973 + .../2021-10-01-preview/openapi.json | 505 + .../2021-10-01-preview/openapi.json | 541 + .../2021-10-01-preview/openapi.json | 611 + .../typespec-autorest/openapi.json | 932 + .../typespec-autorest/openapi.json | 529 + .../typespec-autorest/openapi.json | 506 + .../typespec-autorest/openapi.json | 443 + .../typespec-autorest/openapi.json | 679 + .../2021-06-13-preview/openapi.json | 2122 ++ .../2022-04-30-preview/openapi.json | 2137 ++ .../typespec-autorest/openapi.json | 914 + .../typespec-autorest/openapi.json | 853 + .../typespec-autorest/openapi.json | 661 + .../typespec-autorest/openapi.json | 902 + .../typespec-autorest/openapi.json | 2321 ++ .../typespec-autorest/openapi.json | 4790 ++++ .../2023-08-01-preview/openapi.json | 822 + .../2023-11-01-preview/openapi.json | 822 + .../typespec-autorest/openapi.json | 852 + .../typespec-autorest/openapi.json | 1409 ++ .../typespec-autorest/openapi.json | 1928 ++ .../typespec-autorest/openapi.json | 153 + .../typespec-autorest/openapi.json | 192 + .../typespec-autorest/openapi.json | 149 + .../typespec-autorest/openapi.json | 526 + .../typespec-autorest/openapi.json | 569 + .../typespec-autorest/openapi.json | 143 + .../typespec-autorest/openapi.json | 143 + .../typespec-autorest/openapi.json | 115 + .../typespec-autorest/openapi.json | 116 + .../typespec-autorest/openapi.json | 110 + .../typespec-autorest/openapi.json | 270 + .../typespec-autorest/openapi.json | 97 + .../typespec-autorest/openapi.json | 78 + .../AnotherService/openapi.json | 130 + .../UserService/v1/openapi.json | 131 + .../UserService/v2/openapi.json | 141 + .../typespec-autorest/openapi.json | 1086 + .../typespec-autorest/openapi.json | 182 + .../typespec-autorest/openapi.json | 68 + .../typespec-autorest/openapi.json | 66 + .../typespec-autorest/openapi.json | 79 + .../typespec-autorest/openapi.json | 177 + .../typespec-autorest/openapi.json | 193 + .../typespec-autorest/openapi.json | 897 + .../typespec-autorest/openapi.json | 464 + .../typespec-autorest/openapi.json | 92 + .../typespec-autorest/openapi.json | 101 + .../typespec-autorest/openapi.json | 363 + .../typespec-autorest/openapi.json | 52 + .../typespec-autorest/v1/openapi.json | 146 + .../typespec-autorest/v2/openapi.json | 174 + .../typespec-autorest/openapi.json | 455 + packages/samples/test/samples.test.ts | 47 + packages/samples/tsconfig.json | 11 + packages/samples/tspconfig.yaml | 3 + packages/typespec-autorest/.c8rc.json | 3 + packages/typespec-autorest/.eslintrc.cjs | 7 + packages/typespec-autorest/.mocharc.yaml | 7 + .../.scripts/schema-json-to-js.js | 21 + packages/typespec-autorest/CHANGELOG.json | 1421 ++ packages/typespec-autorest/CHANGELOG.md | 648 + packages/typespec-autorest/LICENSE | 21 + packages/typespec-autorest/README.md | 167 + packages/typespec-autorest/lib/autorest.tsp | 2 + packages/typespec-autorest/lib/decorators.tsp | 22 + .../mocha.reporter.config.json | 4 + packages/typespec-autorest/package.json | 85 + packages/typespec-autorest/schema/.gitignore | 1 + .../schema/autorest-openapi-schema.tsp | 327 + .../typespec-autorest/schema/tspconfig.yaml | 8 + .../src/autorest-openapi-schema.ts | 5 + packages/typespec-autorest/src/decorators.ts | 107 + packages/typespec-autorest/src/index.ts | 3 + .../src/json-schema-sorter/sorter.ts | 220 + packages/typespec-autorest/src/lib.ts | 326 + packages/typespec-autorest/src/openapi.ts | 2271 ++ .../typespec-autorest/src/testing/index.ts | 25 + packages/typespec-autorest/src/types.ts | 591 + packages/typespec-autorest/src/utils.ts | 108 + .../test/additional-properties.test.ts | 79 + packages/typespec-autorest/test/array.test.ts | 120 + .../test/azure-core-operations.test.ts | 158 + .../typespec-autorest/test/decorators.test.ts | 320 + .../test/discriminator.test.ts | 373 + .../test/documentation.test.ts | 40 + .../typespec-autorest/test/formats.test.ts | 73 + packages/typespec-autorest/test/host.test.ts | 190 + packages/typespec-autorest/test/info.test.ts | 99 + packages/typespec-autorest/test/lro.test.ts | 71 + .../typespec-autorest/test/metadata.test.ts | 669 + .../typespec-autorest/test/models.test.ts | 727 + .../typespec-autorest/test/multipart.test.ts | 57 + .../test/openapi-output.test.ts | 963 + .../typespec-autorest/test/options.test.ts | 259 + .../typespec-autorest/test/paging.test.ts | 48 + .../typespec-autorest/test/parameters.test.ts | 317 + .../test/primitive-types.test.ts | 290 + .../test/produces-consumes.test.ts | 143 + .../test/property-schema.test.ts | 108 + .../test/return-types.test.ts | 528 + .../typespec-autorest/test/security.test.ts | 134 + .../test/shared-routes.test.ts | 233 + .../typespec-autorest/test/sorting.test.ts | 74 + .../test/status-codes.test.ts | 60 + .../test/string-templates.test.ts | 66 + packages/typespec-autorest/test/test-host.ts | 149 + .../test/union-schema.test.ts | 141 + .../typespec-autorest/test/versioning.test.ts | 211 + packages/typespec-autorest/tsconfig.json | 17 + packages/typespec-azure-core/.c8rc.json | 3 + packages/typespec-azure-core/.eslintrc.cjs | 7 + packages/typespec-azure-core/.mocharc.yaml | 7 + packages/typespec-azure-core/CHANGELOG.json | 882 + packages/typespec-azure-core/CHANGELOG.md | 431 + packages/typespec-azure-core/LICENSE | 21 + packages/typespec-azure-core/README.md | 526 + packages/typespec-azure-core/lib/auth.tsp | 46 + .../typespec-azure-core/lib/azure-core.tsp | 27 + .../typespec-azure-core/lib/decorators.tsp | 200 + .../typespec-azure-core/lib/foundations.tsp | 443 + packages/typespec-azure-core/lib/models.tsp | 285 + .../typespec-azure-core/lib/operations.tsp | 772 + packages/typespec-azure-core/lib/traits.tsp | 338 + .../mocha.reporter.config.json | 4 + packages/typespec-azure-core/package.json | 77 + .../typespec-azure-core/src/decorators.ts | 1037 + .../src/helpers/union-enums.ts | 202 + packages/typespec-azure-core/src/index.ts | 10 + packages/typespec-azure-core/src/lib.ts | 337 + .../typespec-azure-core/src/lro-helpers.ts | 1061 + packages/typespec-azure-core/src/lro-info.ts | 450 + .../src/rules/api-version-parameter.ts | 46 + .../src/rules/auth-required.ts | 31 + .../typespec-azure-core/src/rules/byos.ts | 39 + .../typespec-azure-core/src/rules/casing.ts | 77 + .../src/rules/composition-over-inheritance.ts | 42 + .../src/rules/extensible-enums.ts | 22 + .../src/rules/friendly-name.ts | 104 + .../src/rules/known-encoding.ts | 43 + .../src/rules/lro-polling-operation.ts | 60 + .../src/rules/no-closed-literal-union.ts | 27 + .../typespec-azure-core/src/rules/no-enum.ts | 21 + .../src/rules/no-error-status-codes.ts | 33 + .../rules/no-explicit-routes-resource-ops.ts | 32 + .../src/rules/no-fixed-enum-discriminator.ts | 33 + .../src/rules/no-nullable.ts | 25 + .../src/rules/no-offsetdatetime.ts | 54 + .../src/rules/no-operation-id.ts | 29 + .../src/rules/no-order-by.ts | 28 + .../src/rules/no-response-body.ts | 39 + .../src/rules/no-rpc-path-params.ts | 49 + .../src/rules/prefer-csv-collection-format.ts | 30 + .../src/rules/prevent-format.ts | 39 + .../rules/prevent-multiple-discriminator.ts | 40 + .../src/rules/prevent-rest-library.ts | 45 + .../src/rules/prevent-unknown.ts | 21 + .../src/rules/property-naming.ts | 40 + .../src/rules/record-types.ts | 101 + .../src/rules/request-body-array.ts | 30 + .../src/rules/require-docs.ts | 86 + .../src/rules/require-key-visibility.ts | 32 + .../response-schema-multi-status-code.ts | 60 + .../src/rules/rpc-operation-request-body.ts | 38 + .../src/rules/spread-discriminated-model.ts | 49 + .../src/rules/use-standard-names.ts | 121 + .../src/rules/use-standard-ops.ts | 97 + .../typespec-azure-core/src/rules/utils.ts | 135 + .../typespec-azure-core/src/testing/index.ts | 25 + packages/typespec-azure-core/src/traits.ts | 478 + packages/typespec-azure-core/src/utils.ts | 155 + packages/typespec-azure-core/src/validate.ts | 7 + .../test/decorators.test.ts | 753 + .../test/helpers/union-enums.test.ts | 127 + .../test/operations.test.ts | 2329 ++ .../test/rules/api-version-parameter.test.ts | 91 + .../test/rules/auth-required.test.ts | 35 + .../test/rules/byos.test.ts | 45 + .../test/rules/casing.test.ts | 123 + .../composition-over-inheritance.test.ts | 101 + .../test/rules/friendly-name.test.ts | 96 + .../test/rules/known-encoding.test.ts | 55 + .../test/rules/lro-polling-operation.test.ts | 80 + .../rules/no-closed-literal-union.test.ts | 44 + .../test/rules/no-enum.test.ts | 33 + .../test/rules/no-error-status-codes.test.ts | 65 + .../no-explicit-routes-resource-ops.test.ts | 48 + .../rules/no-fixed-enum-discriminator.test.ts | 87 + .../test/rules/no-nullable.test.ts | 24 + .../test/rules/no-offsetdatetime.test.ts | 48 + .../test/rules/no-operation-id.test.ts | 36 + .../test/rules/no-order-by.test.ts | 69 + .../test/rules/no-response-body.test.ts | 99 + .../test/rules/no-rpc-path-params.test.ts | 99 + .../prefer-csv-collection-format.test.ts | 46 + .../test/rules/prevent-format.test.ts | 55 + .../prevent-multiple-discriminator.test.ts | 67 + .../prevent-property-name-conflict.test.ts | 128 + .../test/rules/prevent-rest-library.test.ts | 48 + .../test/rules/prevent-unknown.test.ts | 33 + .../test/rules/record-types.test.ts | 104 + .../test/rules/request-body-array.test.ts | 31 + .../test/rules/require-docs.test.ts | 77 + .../test/rules/require-key-visibility.test.ts | 55 + .../response-schema-multi-status-code.test.ts | 83 + .../rules/rpc-operation-request-body.test.ts | 61 + .../rules/spread-discriminated-model.test.ts | 72 + .../test/rules/use-extensible-enums.test.ts | 47 + .../test/rules/use-standard-names.test.ts | 148 + .../test/rules/use-standard-ops.test.ts | 82 + .../typespec-azure-core/test/test-host.ts | 130 + .../typespec-azure-core/test/traits.test.ts | 329 + packages/typespec-azure-core/tsconfig.json | 17 + .../typespec-azure-playground-website/.env | 2 + .../.eslintrc.cjs | 6 + .../README.md | 20 + .../e2e/playwright.config.ts | 21 + .../e2e/smoke.e2e.ts | 15 + .../index.html | 26 + .../package.json | 83 + .../samples/arm.tsp | 78 + .../samples/azure-core.tsp | 286 + .../samples/build.js | 24 + .../src/index.ts | 18 + .../src/main.tsx | 56 + .../src/style.css | 4 + .../tsconfig.json | 30 + .../vite.config.ts | 16 + .../.c8rc.json | 3 + .../.eslintrc.cjs | 7 + .../.mocharc.yaml | 7 + .../CHANGELOG.json | 840 + .../CHANGELOG.md | 376 + .../typespec-azure-resource-manager/LICENSE | 21 + .../typespec-azure-resource-manager/README.md | 476 + .../lib/arm.foundations.tsp | 743 + .../lib/arm.tsp | 39 + .../lib/common-types.tsp | 18 + .../lib/customer-managed-keys.tsp | 77 + .../lib/decorators.tsp | 188 + .../lib/interfaces.tsp | 437 + .../lib/models.tsp | 289 + .../lib/operations.tsp | 475 + .../lib/parameters.tsp | 142 + .../lib/private-links.tsp | 201 + .../lib/private.decorators.tsp | 84 + .../lib/responses.tsp | 118 + .../mocha.reporter.config.json | 4 + .../package.json | 83 + .../scaffolding.json | 13 + .../src/common-types.ts | 64 + .../src/index.ts | 8 + .../src/lib.ts | 184 + .../src/namespace.ts | 223 + .../src/operations.ts | 304 + .../src/private.decorators.ts | 540 + .../src/resource.ts | 314 + .../src/rules/arm-common-types-version.ts | 49 + .../rules/arm-resource-action-no-segment.ts | 34 + .../rules/arm-resource-duplicate-property.ts | 44 + .../src/rules/arm-resource-interfaces.ts | 31 + .../rules/arm-resource-invalid-action-verb.ts | 29 + .../arm-resource-invalid-envelope-property.ts | 49 + .../arm-resource-invalid-version-format.ts | 56 + .../rules/arm-resource-key-invalid-chars.ts | 33 + .../rules/arm-resource-operation-response.ts | 93 + .../src/rules/arm-resource-patch.ts | 132 + .../rules/arm-resource-path-invalid-chars.ts | 40 + .../arm-resource-provisioning-state-rule.ts | 65 + .../src/rules/beyond-nesting-levels.ts | 41 + .../src/rules/core-operations.ts | 103 + .../src/rules/delete-operation.ts | 34 + .../src/rules/envelope-properties.ts | 49 + .../src/rules/list-operation.ts | 38 + .../src/rules/no-response-body.ts | 33 + .../src/rules/operations-interface-missing.ts | 41 + .../src/rules/patch-envelope-properties.ts | 56 + .../src/rules/resource-name.ts | 63 + .../src/rules/retry-after.ts | 38 + .../src/rules/unsupported-type.ts | 44 + .../src/rules/utils.ts | 126 + .../src/state.ts | 27 + .../src/testing/index.ts | 25 + .../test/openapi-output.test.ts | 431 + .../test/resource.test.ts | 1023 + .../rules/arm-common-types-version.test.ts | 97 + .../arm-resource-action-no-segment.test.ts | 65 + .../arm-resource-duplicate-properties.test.ts | 65 + .../arm-resource-envelope-properties.test.ts | 56 + .../test/rules/arm-resource-interface.test.ts | 78 + .../rules/arm-resource-invalid-chars.test.ts | 60 + ...rm-resource-invalid-version-format.test.ts | 84 + .../arm-resource-key-invalid-chars.test.ts | 60 + .../rules/arm-resource-operations.test.ts | 118 + .../arm-resource-provisioning-state.test.ts | 143 + .../test/rules/beyond-nesting-levels.test.ts | 89 + .../test/rules/core-operations.test.ts | 210 + .../test/rules/delete-operation.test.ts | 71 + .../test/rules/envelope-properties.test.ts | 53 + .../test/rules/no-response-body.test.ts | 53 + .../test/rules/operation-usage.test.ts | 215 + .../operations-interface-missing.test.ts | 48 + .../test/rules/patch-envelope.test.ts | 171 + .../test/rules/patch-operations.test.ts | 238 + .../test/rules/resource-name.test.ts | 92 + .../test/rules/retry-after.test.ts | 79 + .../test/rules/unsupported-types.test.ts | 44 + .../test/test-host.ts | 89 + .../tsconfig.json | 19 + .../typespec-client-generator-core/.c8rc.json | 3 + .../.eslintrc.cjs | 7 + .../.mocharc.yaml | 7 + .../CHANGELOG.json | 513 + .../CHANGELOG.md | 264 + .../typespec-client-generator-core/LICENSE | 21 + .../typespec-client-generator-core/README.md | 322 + .../doc/types.tsp | 573 + .../lib/decorators.tsp | 196 + .../lib/main.tsp | 2 + .../mocha.reporter.config.json | 4 + .../package.json | 85 + .../src/decorators.ts | 773 + .../src/index.ts | 5 + .../src/interfaces.ts | 362 + .../src/internal-utils.ts | 11 + .../typespec-client-generator-core/src/lib.ts | 93 + .../src/public-utils.ts | 534 + .../src/testing/index.ts | 8 + .../src/types.ts | 1080 + .../test/decorators.test.ts | 2199 ++ .../test/public-utils.test.ts | 1343 ++ .../test/test-host.ts | 175 + .../test/types.test.ts | 1909 ++ .../tsconfig.json | 15 + packages/typespec-diff/.eslintrc.cjs | 7 + packages/typespec-diff/.mocharc.yaml | 7 + packages/typespec-diff/CHANGELOG.json | 164 + packages/typespec-diff/CHANGELOG.md | 97 + packages/typespec-diff/LICENSE | 21 + .../typespec-diff/mocha.reporter.config.json | 4 + packages/typespec-diff/package.json | 86 + packages/typespec-diff/readme.md | 176 + packages/typespec-diff/src/array-diff.ts | 66 + packages/typespec-diff/src/config.ts | 61 + packages/typespec-diff/src/constraint-diff.ts | 135 + packages/typespec-diff/src/decorator-diff.ts | 99 + packages/typespec-diff/src/diff.ts | 287 + packages/typespec-diff/src/enum-diff.ts | 55 + packages/typespec-diff/src/index.ts | 85 + packages/typespec-diff/src/interface-diff.ts | 39 + packages/typespec-diff/src/model-diff.ts | 131 + .../typespec-diff/src/model-property-diff.ts | 88 + packages/typespec-diff/src/namespace-diff.ts | 197 + packages/typespec-diff/src/operation-diff.ts | 184 + packages/typespec-diff/src/parameter-diff.ts | 105 + packages/typespec-diff/src/reporter.ts | 53 + packages/typespec-diff/src/return-diff.ts | 10 + packages/typespec-diff/src/rules.ts | 575 + packages/typespec-diff/src/scalar-diff.ts | 10 + packages/typespec-diff/src/type-diff.ts | 144 + packages/typespec-diff/src/union-diff.ts | 43 + packages/typespec-diff/src/utils.ts | 117 + packages/typespec-diff/test/diff.test.ts | 244 + packages/typespec-diff/test/test-host.ts | 96 + packages/typespec-diff/tsconfig.json | 14 + packages/typespec-service-csharp/.c8rc.json | 3 + .../typespec-service-csharp/.eslintrc.cjs | 7 + .../typespec-service-csharp/.mocharc.yaml | 7 + .../typespec-service-csharp/CHANGELOG.json | 4 + packages/typespec-service-csharp/CHANGELOG.md | 2 + packages/typespec-service-csharp/LICENSE | 21 + packages/typespec-service-csharp/README.md | 34 + .../typespec-service-csharp/lib/service.tsp | 0 .../mocha.reporter.config.json | 4 + packages/typespec-service-csharp/package.json | 77 + .../typespec-service-csharp/src/attributes.ts | 169 + .../src/boilerplate.ts | 115 + packages/typespec-service-csharp/src/index.ts | 2 + .../typespec-service-csharp/src/interfaces.ts | 69 + packages/typespec-service-csharp/src/lib.ts | 55 + .../typespec-service-csharp/src/service.ts | 832 + .../src/testing/index.ts | 20 + packages/typespec-service-csharp/src/utils.ts | 393 + .../test/diagnostic.test.ts | 123 + .../test/generation.test.ts | 442 + .../typespec-service-csharp/test/test-host.ts | 54 + .../typespec-service-csharp/tsconfig.json | 16 + packages/website/.gitignore | 20 + .../website/.scripts/docusaurus-build.mjs | 24 + .../.scripts/update-playground-versions.mjs | 31 + packages/website/README.md | 41 + packages/website/babel.config.js | 6 + packages/website/docusaurus.config.ts | 247 + packages/website/package.json | 73 + packages/website/playground-versions.json | 5 + packages/website/sidebars.ts | 138 + .../src/components/HomepageFeatures/index.js | 63 + .../HomepageFeatures/styles.module.css | 11 + .../fluent-layout/fluent-layout.tsx | 21 + .../playground-component/import-map.ts | 37 + .../loading-spinner.module.css | 8 + .../playground-component/loading-spinner.tsx | 14 + .../playground-component/playground.tsx | 89 + packages/website/src/css/custom.css | 30 + packages/website/src/pages/index.js | 48 + packages/website/src/pages/index.module.css | 23 + packages/website/src/pages/markdown-page.md | 7 + packages/website/src/pages/playground.tsx | 43 + .../src/theme/prism-include-languages.ts | 18 + packages/website/static/.nojekyll | 0 packages/website/static/img/azure.svg | 23 + packages/website/static/img/logo.svg | 1 + .../static/img/undraw_docusaurus_mountain.svg | 171 + .../static/img/undraw_docusaurus_react.svg | 170 + .../static/img/undraw_docusaurus_tree.svg | 40 + packages/website/tsconfig.json | 9 + .../emitters/typespec-autorest/index.md | 198 + .../typespec-autorest/reference/decorators.md | 50 + .../typespec-autorest/reference/emitter.md | 115 + .../typespec-autorest/reference/index.mdx | 43 + .../emitters/typespec-csharp/index.md | 6 + .../reference/emitter.md | 30 + .../reference/index.mdx | 36 + .../reference/js-api/_category_.json | 1 + .../reference/js-api/functions/$onEmit.md | 18 + .../reference/js-api/functions/getTracer.md | 21 + .../js-api/functions/reportDiagnostic.md | 26 + .../reference/js-api/index.md | 20 + .../interfaces/CSharpServiceEmitterOptions.md | 10 + .../reference/js-api/variables/$lib.md | 8 + .../getstarted/azure-core/step01.md | 23 + .../getstarted/azure-core/step02.md | 12 + .../getstarted/azure-core/step03.md | 15 + .../getstarted/azure-core/step04.md | 28 + .../getstarted/azure-core/step05.md | 121 + .../getstarted/azure-core/step06.md | 45 + .../getstarted/azure-core/step07.md | 48 + .../getstarted/azure-core/step08.md | 56 + .../getstarted/azure-core/step09.md | 251 + .../getstarted/azure-core/step10.md | 104 + .../getstarted/azure-core/step11.md | 5 + .../getstarted/azure-core/step12.md | 48 + .../azure-resource-manager/step00.md | 28 + .../azure-resource-manager/step01.md | 44 + .../azure-resource-manager/step02.md | 109 + .../azure-resource-manager/step03.md | 39 + .../azure-resource-manager/step04.md | 103 + .../azure-resource-manager/step05.md | 131 + .../getstarted/createproject.md | 44 + .../version-latest/getstarted/installation.md | 22 + .../step01-create-userrp-project.md | 50 + .../providerhub/step02-debug-onebox.md | 148 + .../providerhub/step03-api-testing.md | 65 + .../providerhub/step04-deploy-cloud.md | 201 + .../version-latest/howtos/ARM/arm-rules.md | 50 + .../howtos/ARM/resource-operations.md | 268 + .../howtos/ARM/resource-type.md | 533 + .../howtos/Azure Core/content-negotiation.md | 50 + .../Azure Core/long-running-operations.md | 529 + .../DataPlane Generation - DPG/00howtogen.mdx | 55 + .../DataPlane Generation - DPG/01setup.mdx | 40 + .../DataPlane Generation - DPG/02client.mdx | 590 + .../03convenient.mdx | 244 + .../DataPlane Generation - DPG/04renaming.mdx | 209 + .../DataPlane Generation - DPG/05union.mdx | 199 + .../howtos/TypeSpec/emitter-configurations.md | 3 + .../howtos/rest-api-publish/_category_.json | 6 + .../howtos/rest-api-publish/buildpipelines.md | 65 + .../checking-in-api-specs-guide.md | 3 + .../versioned_docs/version-latest/intro.md | 67 + .../azure-core/reference/data-types.md | 754 + .../azure-core/reference/decorators.md | 439 + .../libraries/azure-core/reference/index.mdx | 174 + .../azure-core/reference/interfaces.md | 765 + .../reference/js-api/_category_.json | 1 + .../js-api/enumerations/FinalStateValue.md | 19 + .../js-api/functions/$addTraitProperties.md | 27 + .../js-api/functions/$applyTraitOverride.md | 23 + .../functions/$ensureAllHeaderParams.md | 23 + .../js-api/functions/$ensureAllQueryParams.md | 23 + .../js-api/functions/$ensureResourceType.md | 23 + .../js-api/functions/$ensureTraitsPresent.md | 25 + .../reference/js-api/functions/$ensureVerb.md | 25 + .../js-api/functions/$finalLocation.md | 19 + .../js-api/functions/$finalOperation.md | 25 + .../reference/js-api/functions/$fixed.md | 19 + .../reference/js-api/functions/$items.md | 19 + .../js-api/functions/$lroCanceled.md | 19 + .../js-api/functions/$lroErrorResult.md | 22 + .../reference/js-api/functions/$lroFailed.md | 19 + .../reference/js-api/functions/$lroResult.md | 22 + .../reference/js-api/functions/$lroStatus.md | 19 + .../js-api/functions/$lroSucceeded.md | 19 + .../reference/js-api/functions/$needsRoute.md | 19 + .../reference/js-api/functions/$nextLink.md | 19 + .../js-api/functions/$nextPageOperation.md | 25 + .../js-api/functions/$omitKeyProperties.md | 19 + .../reference/js-api/functions/$onValidate.md | 18 + .../js-api/functions/$operationLink.md | 27 + .../js-api/functions/$pagedResult.md | 19 + .../js-api/functions/$pollingLocation.md | 19 + .../js-api/functions/$pollingOperation.md | 25 + .../functions/$pollingOperationParameter.md | 23 + .../js-api/functions/$requestParameter.md | 23 + .../js-api/functions/$responseProperty.md | 23 + .../functions/$spreadCustomParameters.md | 23 + .../$spreadCustomResponseProperties.md | 23 + .../reference/js-api/functions/$trait.md | 23 + .../reference/js-api/functions/$traitAdded.md | 23 + .../js-api/functions/$traitContext.md | 23 + .../js-api/functions/$traitLocation.md | 23 + .../js-api/functions/$traitSource.md | 23 + .../js-api/functions/checkEnsureVerb.md | 18 + .../js-api/functions/checkRpcRoutes.md | 18 + .../js-api/functions/extractLroStates.md | 19 + .../js-api/functions/filterModelProperties.md | 28 + .../js-api/functions/filterResponseModels.md | 23 + .../js-api/functions/getAllProperties.md | 21 + .../js-api/functions/getAsEmbeddingVector.md | 24 + .../js-api/functions/getHttpMetadata.md | 23 + .../reference/js-api/functions/getItems.md | 21 + .../js-api/functions/getLongRunningStates.md | 21 + .../js-api/functions/getLroErrorResult.md | 25 + .../js-api/functions/getLroMetadata.md | 23 + .../js-api/functions/getLroResult.md | 25 + .../js-api/functions/getLroStatusProperty.md | 21 + .../reference/js-api/functions/getNextLink.md | 21 + .../js-api/functions/getOperationLink.md | 25 + .../js-api/functions/getOperationLinks.md | 21 + .../js-api/functions/getOperationResponse.md | 23 + .../js-api/functions/getPagedResult.md | 23 + .../functions/getPollingOperationParameter.md | 19 + .../js-api/functions/getRequestParameter.md | 19 + .../js-api/functions/getResponseProperty.md | 19 + .../functions/getResultModelWithProperty.md | 27 + .../js-api/functions/getSourceTraitName.md | 21 + .../js-api/functions/getSuccessResponse.md | 23 + .../js-api/functions/getTraitContexts.md | 19 + .../js-api/functions/getTraitLocation.md | 19 + .../js-api/functions/getTraitName.md | 19 + .../js-api/functions/getUnionAsEnum.md | 62 + .../js-api/functions/isFinalLocation.md | 21 + .../reference/js-api/functions/isFixed.md | 19 + .../js-api/functions/isLroCanceledState.md | 21 + .../js-api/functions/isLroFailedState.md | 21 + .../js-api/functions/isLroSucceededState.md | 21 + .../js-api/functions/isPollingLocation.md | 21 + .../js-api/functions/isResourceOperation.md | 19 + .../js-api/functions/isTraitModel.md | 19 + ...upported_enable_checkStandardOperations.md | 18 + .../azure-core/reference/js-api/index.md | 125 + .../interfaces/EmbeddingVectorMetadata.md | 10 + .../js-api/interfaces/FinalOperationLink.md | 18 + .../interfaces/FinalOperationReference.md | 18 + .../interfaces/HttpTerminationStatus.md | 12 + .../js-api/interfaces/LogicalOperationStep.md | 23 + .../js-api/interfaces/LongRunningStates.md | 16 + .../js-api/interfaces/LroMetadata.md | 23 + .../ModelPropertyTerminationStatus.md | 16 + .../js-api/interfaces/NextOperationLink.md | 18 + .../interfaces/NextOperationReference.md | 18 + .../js-api/interfaces/OperationLink.md | 15 + .../interfaces/OperationLinkMetadata.md | 15 + .../js-api/interfaces/OperationReference.md | 17 + .../js-api/interfaces/PagedResultMetadata.md | 17 + .../js-api/interfaces/ParameterSource.md | 14 + .../js-api/interfaces/PollingOperationStep.md | 21 + .../interfaces/PollingSuccessNoResult.md | 19 + .../interfaces/PollingSuccessProperty.md | 20 + .../js-api/type-aliases/FinalOperationStep.md | 11 + .../js-api/type-aliases/OperationStep.md | 16 + .../js-api/type-aliases/TerminationStatus.md | 11 + .../js-api/type-aliases/UnionEnum.md | 8 + .../js-api/type-aliases/nextOperationStep.md | 8 + .../reference/js-api/variables/$lib.md | 8 + .../js-api/variables/FinalOperationKey.md | 8 + .../js-api/variables/PollingOperationKey.md | 8 + .../reference/js-api/variables/namespace.md | 8 + .../variables/preventRestLibraryInterfaces.md | 8 + .../js-api/variables/useStandardOperations.md | 8 + .../libraries/azure-core/reference/linter.md | 61 + .../rules/no-closed-literal-union.md | 41 + .../libraries/azure-core/rules/no-enum.md | 29 + .../reference/data-types.md | 1105 + .../reference/decorators.md | 405 + .../reference/index.mdx | 204 + .../reference/interfaces.md | 957 + .../reference/js-api/_category_.json | 1 + .../js-api/enumerations/ResourceBaseType.md | 14 + .../functions/$armCommonTypesVersion.md | 25 + .../js-api/functions/$armLibraryNamespace.md | 21 + .../js-api/functions/$armProviderNameValue.md | 19 + .../js-api/functions/$armProviderNamespace.md | 25 + .../functions/$armRenameListByOperation.md | 27 + .../js-api/functions/$armResourceAction.md | 23 + .../functions/$armResourceCollectionAction.md | 19 + .../functions/$armResourceCreateOrUpdate.md | 23 + .../js-api/functions/$armResourceDelete.md | 23 + .../js-api/functions/$armResourceList.md | 23 + .../functions/$armResourceOperations.md | 28 + .../js-api/functions/$armResourceRead.md | 23 + .../js-api/functions/$armResourceUpdate.md | 23 + .../js-api/functions/$extensionResource.md | 19 + .../js-api/functions/$locationResource.md | 19 + .../functions/$resourceGroupResource.md | 19 + .../reference/js-api/functions/$singleton.md | 28 + .../js-api/functions/$subscriptionResource.md | 19 + .../js-api/functions/$tenantResource.md | 19 + .../js-api/functions/$useLibraryNamespace.md | 25 + .../functions/getArmCommonTypesVersion.md | 21 + .../functions/getArmCommonTypesVersions.md | 18 + .../functions/getArmProviderNamespace.md | 23 + .../js-api/functions/getArmResource.md | 19 + .../js-api/functions/getArmResourceInfo.md | 19 + .../js-api/functions/getArmResourceKind.md | 18 + .../js-api/functions/getArmResources.md | 24 + .../js-api/functions/getResourceBaseType.md | 19 + .../functions/getSingletonResourceKey.md | 19 + .../functions/getUsedLibraryNamespaces.md | 21 + .../js-api/functions/isArmCollectionAction.md | 19 + .../js-api/functions/isArmCommonType.md | 22 + .../js-api/functions/isArmLibraryNamespace.md | 23 + .../js-api/functions/isSingletonResource.md | 19 + .../functions/resolveResourceBaseType.md | 18 + .../functions/resolveResourceOperations.md | 19 + .../reference/js-api/index.md | 69 + .../interfaces/ArmCommonTypeVersions.md | 11 + .../interfaces/ArmLifecycleOperations.md | 13 + .../js-api/interfaces/ArmResourceDetails.md | 23 + .../interfaces/ArmResourceDetailsBase.md | 21 + .../js-api/interfaces/ArmResourceOperation.md | 19 + .../interfaces/ArmResourceOperations.md | 12 + .../type-aliases/ArmLifecycleOperationKind.md | 8 + .../js-api/type-aliases/ArmOperationKind.md | 8 + .../js-api/type-aliases/ArmResourceKind.md | 8 + .../reference/js-api/variables/$lib.md | 8 + .../reference/js-api/variables/namespace.md | 8 + .../reference/linter.md | 51 + .../rules/unsupported-type.md | 34 + .../reference/decorators.md | 307 + .../reference/index.mdx | 51 + .../reference/js-api/_category_.json | 1 + .../reference/js-api/functions/$access.md | 25 + .../reference/js-api/functions/$client.md | 25 + .../js-api/functions/$clientFormat.md | 29 + .../js-api/functions/$convenientAPI.md | 25 + .../reference/js-api/functions/$exclude.md | 27 + .../reference/js-api/functions/$include.md | 27 + .../reference/js-api/functions/$internal.md | 30 + .../js-api/functions/$operationGroup.md | 23 + .../js-api/functions/$protocolAPI.md | 25 + .../reference/js-api/functions/$usage.md | 25 + .../reference/js-api/functions/capitalize.md | 18 + .../js-api/functions/createDiagnostic.md | 37 + .../js-api/functions/createSdkContext.md | 25 + .../js-api/functions/createStateSymbol.md | 20 + .../reference/js-api/functions/getAccess.md | 19 + .../js-api/functions/getAccessOverride.md | 19 + .../js-api/functions/getAllModels.md | 19 + .../reference/js-api/functions/getClient.md | 19 + .../js-api/functions/getClientFormat.md | 28 + .../functions/getClientNamespaceString.md | 21 + .../js-api/functions/getClientType.md | 23 + .../functions/getCrossLanguageDefinitionId.md | 20 + .../js-api/functions/getDefaultApiVersion.md | 21 + .../js-api/functions/getDocHelper.md | 19 + .../functions/getEffectivePayloadType.md | 23 + .../js-api/functions/getEmitterTargetName.md | 22 + .../js-api/functions/getGeneratedName.md | 25 + .../js-api/functions/getLibraryName.md | 29 + .../js-api/functions/getOperationGroup.md | 23 + .../js-api/functions/getPropertyNames.md | 27 + .../js-api/functions/getSdkArrayOrDict.md | 23 + .../js-api/functions/getSdkBuiltInType.md | 23 + .../js-api/functions/getSdkConstant.md | 19 + .../js-api/functions/getSdkDatetimeType.md | 19 + .../js-api/functions/getSdkDurationType.md | 19 + .../reference/js-api/functions/getSdkEnum.md | 23 + .../js-api/functions/getSdkEnumValue.md | 23 + .../reference/js-api/functions/getSdkModel.md | 23 + .../reference/js-api/functions/getSdkTuple.md | 23 + .../js-api/functions/getSdkTypeBaseHelper.md | 31 + .../reference/js-api/functions/getSdkUnion.md | 23 + .../reference/js-api/functions/getUsage.md | 19 + .../js-api/functions/getUsageOverride.md | 19 + .../reference/js-api/functions/getWireName.md | 19 + .../reference/js-api/functions/intOrFloat.md | 18 + .../js-api/functions/isApiVersion.md | 21 + .../js-api/functions/isAzureCoreModel.md | 20 + .../reference/js-api/functions/isExclude.md | 23 + .../js-api/functions/isInOperationGroup.md | 23 + .../reference/js-api/functions/isInclude.md | 23 + .../reference/js-api/functions/isInternal.md | 28 + .../js-api/functions/isOperationGroup.md | 23 + .../reference/js-api/functions/isReadOnly.md | 18 + .../functions/isSdkDatetimeEncodings.md | 18 + .../reference/js-api/functions/listClients.md | 18 + .../js-api/functions/listOperationGroups.md | 21 + .../listOperationsInOperationGroup.md | 21 + .../js-api/functions/reportDiagnostic.md | 38 + .../functions/reportUnionUnsupported.md | 19 + .../functions/shouldGenerateConvenient.md | 19 + .../functions/shouldGenerateProtocol.md | 19 + .../reference/js-api/index.md | 107 + .../js-api/interfaces/SdkArrayType.md | 18 + .../interfaces/SdkBodyModelPropertyType.md | 24 + .../js-api/interfaces/SdkBuiltInType.md | 18 + .../reference/js-api/interfaces/SdkClient.md | 15 + .../js-api/interfaces/SdkConstantType.md | 19 + .../reference/js-api/interfaces/SdkContext.md | 29 + .../js-api/interfaces/SdkDatetimeType.md | 19 + .../js-api/interfaces/SdkDictionaryType.md | 19 + .../js-api/interfaces/SdkDurationType.md | 19 + .../js-api/interfaces/SdkEmitterOptions.md | 13 + .../js-api/interfaces/SdkEnumType.md | 27 + .../js-api/interfaces/SdkEnumValueType.md | 23 + .../interfaces/SdkModelPropertyTypeBase.md | 20 + .../js-api/interfaces/SdkModelType.md | 29 + .../js-api/interfaces/SdkOperationGroup.md | 11 + .../js-api/interfaces/SdkTupleType.md | 18 + .../js-api/interfaces/SdkUnionType.md | 20 + .../js-api/type-aliases/AccessFlags.md | 8 + .../js-api/type-aliases/ClientFormat.md | 8 + .../js-api/type-aliases/SdkBuiltInKinds.md | 28 + .../type-aliases/SdkModelPropertyType.md | 13 + .../js-api/type-aliases/SdkOperation.md | 8 + .../SdkParameterImplementation.md | 8 + .../type-aliases/SdkParameterLocation.md | 14 + .../reference/js-api/type-aliases/SdkType.md | 19 + .../js-api/type-aliases/SdkValidation.md | 13 + .../reference/js-api/variables/$lib.md | 8 + .../reference/js-api/variables/namespace.md | 8 + .../version-latest/reference/arm/index.md | 143 + .../reference/azure-style-guide.md | 164 + .../reference/azure.core/index.md | 93 + .../release-notes/cadl-typespec-migration.md | 84 + .../release-notes/release-2022-07-08.md | 190 + .../release-notes/release-2022-08-10.md | 339 + .../release-notes/release-2022-09-07.md | 63 + .../release-notes/release-2022-10-12.md | 48 + .../release-notes/release-2022-11-11.md | 75 + .../release-notes/release-2022-12-07.md | 76 + .../release-notes/release-2023-01-12.md | 79 + .../release-notes/release-2023-02-07.md | 94 + .../release-notes/release-2023-03-13.md | 58 + .../release-notes/release-2023-04-11.md | 71 + .../release-notes/release-2023-05-10.md | 69 + .../release-notes/release-2023-06-06.md | 131 + .../release-notes/release-2023-07-11.md | 82 + .../release-notes/release-2023-08-08.md | 63 + .../release-notes/release-2023-09-12.md | 106 + .../release-notes/release-2023-10-11.md | 74 + .../release-notes/release-2023-11-07.md | 96 + .../release-notes/release-2023-12-06.md | 68 + .../arm-proxy-operations-error.md | 37 + .../version-latest/troubleshoot/sdl.md | 15 + .../troubleshoot/suppresswarnings.md | 23 + .../troubleshoot/troubleshoot_template | 9 + ...c-providerhub-controller-warning-nu1605.md | 19 + .../typespec-getting-started.md | 94 + .../version-latest-sidebars.json | 152 + packages/website/versions.json | 3 + rush.json | 274 + tsconfig.json | 11 + 1103 files changed, 214817 insertions(+) create mode 100644 .editorconfig create mode 100644 .gitattributes create mode 100644 .github/CODEOWNERS create mode 100644 .github/ISSUE_TEMPLATE/0_general.md create mode 100644 .github/ISSUE_TEMPLATE/breaking-change-form.md create mode 100644 .github/ISSUE_TEMPLATE/bug-report.md create mode 100644 .github/ISSUE_TEMPLATE/feature-request.md create mode 100644 .github/ISSUE_TEMPLATE/onboarding-request.md create mode 100644 .github/dependabot.yml create mode 100644 .github/policies/issues.add-labels.yml create mode 100644 .github/workflows/codeql.yml create mode 100644 .github/workflows/merge-release-in-main.yml create mode 100644 .github/workflows/website-gh-pages.yml create mode 100644 .gitignore create mode 100644 .gitmodules create mode 100644 .prettierignore create mode 100644 .prettierrc.json create mode 100644 .vscode/extensions.json create mode 100644 .vscode/launch.json create mode 100644 .vscode/settings.json create mode 100644 .vscode/tasks.json create mode 100644 CONTRIBUTING.md create mode 100644 LICENSE create mode 100644 README.md create mode 100644 SECURITY.md create mode 100644 common/changes/@azure-tools/typespec-diff/removeproviderhub_2023-11-22-18-53.json create mode 100644 common/config/rush/.npmrc create mode 100644 common/config/rush/.npmrc-publish create mode 100644 common/config/rush/.pnpmfile.cjs create mode 100644 common/config/rush/command-line.json create mode 100644 common/config/rush/common-versions.json create mode 100644 common/config/rush/pnpm-config.json create mode 100644 common/config/rush/pnpm-lock.yaml create mode 100644 common/config/rush/repo-state.json create mode 100644 common/config/rush/version-policies.json create mode 100644 common/scripts/install-run-rush-pnpm.js create mode 100644 common/scripts/install-run-rush.js create mode 100644 common/scripts/install-run-rushx.js create mode 100644 common/scripts/install-run.js create mode 160000 core create mode 100644 cspell.yaml create mode 100644 design/unions.md create mode 100644 docs/emitters/typespec-autorest/index.md create mode 100644 docs/emitters/typespec-autorest/reference/decorators.md create mode 100644 docs/emitters/typespec-autorest/reference/emitter.md create mode 100644 docs/emitters/typespec-autorest/reference/index.mdx create mode 100644 docs/emitters/typespec-csharp/index.md create mode 100644 docs/emitters/typespec-service-csharp/reference/emitter.md create mode 100644 docs/emitters/typespec-service-csharp/reference/index.mdx create mode 100644 docs/getstarted/azure-core/step01.md create mode 100644 docs/getstarted/azure-core/step02.md create mode 100644 docs/getstarted/azure-core/step03.md create mode 100644 docs/getstarted/azure-core/step04.md create mode 100644 docs/getstarted/azure-core/step05.md create mode 100644 docs/getstarted/azure-core/step06.md create mode 100644 docs/getstarted/azure-core/step07.md create mode 100644 docs/getstarted/azure-core/step08.md create mode 100644 docs/getstarted/azure-core/step09.md create mode 100644 docs/getstarted/azure-core/step10.md create mode 100644 docs/getstarted/azure-core/step11.md create mode 100644 docs/getstarted/azure-core/step12.md create mode 100644 docs/getstarted/azure-resource-manager/step00.md create mode 100644 docs/getstarted/azure-resource-manager/step01.md create mode 100644 docs/getstarted/azure-resource-manager/step02.md create mode 100644 docs/getstarted/azure-resource-manager/step03.md create mode 100644 docs/getstarted/azure-resource-manager/step04.md create mode 100644 docs/getstarted/azure-resource-manager/step05.md create mode 100644 docs/getstarted/createproject.md create mode 100644 docs/getstarted/installation.md create mode 100644 docs/howtos/ARM/arm-rules.md create mode 100644 docs/howtos/ARM/resource-operations.md create mode 100644 docs/howtos/ARM/resource-type.md create mode 100644 docs/howtos/Azure Core/content-negotiation.md create mode 100644 docs/howtos/Azure Core/long-running-operations.md create mode 100644 docs/howtos/DataPlane Generation - DPG/00howtogen.mdx create mode 100644 docs/howtos/DataPlane Generation - DPG/01setup.mdx create mode 100644 docs/howtos/DataPlane Generation - DPG/02client.mdx create mode 100644 docs/howtos/DataPlane Generation - DPG/03convenient.mdx create mode 100644 docs/howtos/DataPlane Generation - DPG/04renaming.mdx create mode 100644 docs/howtos/DataPlane Generation - DPG/05union.mdx create mode 100644 docs/howtos/TypeSpec/emitter-configurations.md create mode 100644 docs/howtos/migrate-swagger/_category_.json create mode 100644 docs/howtos/migrate-swagger/get-started.md create mode 100644 docs/howtos/rest-api-publish/_category_.json create mode 100644 docs/howtos/rest-api-publish/buildpipelines.md create mode 100644 docs/howtos/rest-api-publish/checking-in-api-specs-guide.md create mode 100644 docs/intro.md create mode 100644 docs/libraries/azure-core/reference/data-types.md create mode 100644 docs/libraries/azure-core/reference/decorators.md create mode 100644 docs/libraries/azure-core/reference/index.mdx create mode 100644 docs/libraries/azure-core/reference/interfaces.md create mode 100644 docs/libraries/azure-core/reference/linter.md create mode 100644 docs/libraries/azure-core/rules/no-closed-literal-union.md create mode 100644 docs/libraries/azure-core/rules/no-enum.md create mode 100644 docs/libraries/azure-resource-manager/reference/data-types.md create mode 100644 docs/libraries/azure-resource-manager/reference/decorators.md create mode 100644 docs/libraries/azure-resource-manager/reference/index.mdx create mode 100644 docs/libraries/azure-resource-manager/reference/interfaces.md create mode 100644 docs/libraries/azure-resource-manager/reference/linter.md create mode 100644 docs/libraries/azure-resource-manager/rules/unsupported-type.md create mode 100644 docs/libraries/typespec-client-generator-core/reference/decorators.md create mode 100644 docs/libraries/typespec-client-generator-core/reference/index.mdx create mode 100644 docs/reference/arm/index.md create mode 100644 docs/reference/azure-style-guide.md create mode 100644 docs/reference/azure.core/index.md create mode 100644 docs/release-notes/cadl-typespec-migration.md create mode 100644 docs/release-notes/release-2022-07-08.md create mode 100644 docs/release-notes/release-2022-08-10.md create mode 100644 docs/release-notes/release-2022-09-07.md create mode 100644 docs/release-notes/release-2022-10-12.md create mode 100644 docs/release-notes/release-2022-11-11.md create mode 100644 docs/release-notes/release-2022-12-07.md create mode 100644 docs/release-notes/release-2023-01-12.md create mode 100644 docs/release-notes/release-2023-02-07.md create mode 100644 docs/release-notes/release-2023-03-13.md create mode 100644 docs/release-notes/release-2023-04-11.md create mode 100644 docs/release-notes/release-2023-05-10.md create mode 100644 docs/release-notes/release-2023-06-06.md create mode 100644 docs/release-notes/release-2023-07-11.md create mode 100644 docs/release-notes/release-2023-08-08.md create mode 100644 docs/release-notes/release-2023-09-12.md create mode 100644 docs/release-notes/release-2023-10-11.md create mode 100644 docs/release-notes/release-2023-11-07.md create mode 100644 docs/release-notes/release-2023-12-06.md create mode 100644 docs/troubleshoot/arm-proxy-operations-error.md create mode 100644 docs/troubleshoot/sdl.md create mode 100644 docs/troubleshoot/suppresswarnings.md create mode 100644 docs/troubleshoot/troubleshoot_template create mode 100644 docs/typespec-getting-started.md create mode 100644 eng/MSSharedLibKey.snk create mode 100644 eng/feeds/arm/examples/Employees_CreateOrUpdate.json create mode 100644 eng/feeds/arm/examples/Employees_Delete.json create mode 100644 eng/feeds/arm/examples/Employees_Get.json create mode 100644 eng/feeds/arm/examples/Employees_ListByResourceGroup.json create mode 100644 eng/feeds/arm/examples/Employees_ListBySubscription.json create mode 100644 eng/feeds/arm/examples/Employees_Update.json create mode 100644 eng/feeds/arm/examples/Operations_List.json create mode 100644 eng/feeds/arm/main.tsp create mode 100644 eng/feeds/arm/tspconfig.yaml create mode 100644 eng/feeds/azure-scaffolding.json create mode 100644 eng/feeds/data-plane/client.tsp create mode 100644 eng/feeds/data-plane/examples/2022-11-01-preview/Widgets_CreateOrUpdateWidgetSample.json create mode 100644 eng/feeds/data-plane/examples/2022-11-01-preview/Widgets_DeleteWidgetSample.json create mode 100644 eng/feeds/data-plane/examples/2022-11-01-preview/Widgets_GetWidgetOperationStatusSample.json create mode 100644 eng/feeds/data-plane/examples/2022-11-01-preview/Widgets_GetWidgetSample.json create mode 100644 eng/feeds/data-plane/examples/2022-11-01-preview/Widgets_ListWidgetsSample.json create mode 100644 eng/feeds/data-plane/main.tsp create mode 100644 eng/feeds/data-plane/tspconfig.yaml create mode 100644 eng/feeds/scratch/.gitignore create mode 100644 eng/pipelines/ci.yml create mode 100644 eng/pipelines/e2e-job.yml create mode 100644 eng/pipelines/jobs/build-and-test.yml create mode 100644 eng/pipelines/jobs/publish-artifacts.yml create mode 100644 eng/pipelines/jobs/pull-request-consistency.yml create mode 100644 eng/pipelines/nuget-release.yml create mode 100644 eng/pipelines/pr-tryit.yml create mode 100644 eng/pipelines/pr.yml create mode 100644 eng/pipelines/templates/build.yml create mode 100644 eng/pipelines/templates/install-browsers.yml create mode 100644 eng/pipelines/templates/install.yml create mode 100644 eng/pipelines/templates/swagger-checks.yml create mode 100644 eng/pipelines/templates/upload-coverage.yml create mode 100644 eng/pipelines/templates/variables/globals.yml create mode 100644 eng/scripts/check-for-changed-files.js create mode 100644 eng/scripts/check-format.js create mode 100644 eng/scripts/compare_swagger.py create mode 100644 eng/scripts/cspell.js create mode 100644 eng/scripts/dogfood.js create mode 100644 eng/scripts/download-common-types.js create mode 100644 eng/scripts/format.js create mode 100644 eng/scripts/gen-sdk.js create mode 100644 eng/scripts/generate-third-party-notices.js create mode 100644 eng/scripts/helpers.js create mode 100644 eng/scripts/lint-resourcemanager.js create mode 100755 eng/scripts/new_service_adoption.py create mode 100644 eng/scripts/npm-run-for-deps.js create mode 100644 eng/scripts/npm-run.js create mode 100644 eng/scripts/package.json create mode 100644 eng/scripts/prepare-publish.js create mode 100644 eng/scripts/upload-bundler-packages.js create mode 100644 eng/scripts/validate-core-submodule.js create mode 100644 eng/scripts/watch.js create mode 100644 packages/Directory.Build.props create mode 100644 packages/e2e-tests/cadl-ranch-specs/package.json create mode 100644 packages/e2e-tests/e2e-tests.mjs create mode 100644 packages/e2e-tests/package.json create mode 100644 packages/microsoft.typespec.providerhub.controller/src/SubscriptionLifecycle/AccountOwner.cs create mode 100644 packages/microsoft.typespec.providerhub.controller/src/SubscriptionLifecycle/AdditionalProperties.cs create mode 100644 packages/microsoft.typespec.providerhub.controller/src/SubscriptionLifecycle/AdditionalStateInformation.cs create mode 100644 packages/microsoft.typespec.providerhub.controller/src/SubscriptionLifecycle/AvailabilityZones.cs create mode 100644 packages/microsoft.typespec.providerhub.controller/src/SubscriptionLifecycle/BillingAccount.cs create mode 100644 packages/microsoft.typespec.providerhub.controller/src/SubscriptionLifecycle/BillingProperties.cs create mode 100644 packages/microsoft.typespec.providerhub.controller/src/SubscriptionLifecycle/Enums/BillingType.cs create mode 100644 packages/microsoft.typespec.providerhub.controller/src/SubscriptionLifecycle/Enums/ChannelType.cs create mode 100644 packages/microsoft.typespec.providerhub.controller/src/SubscriptionLifecycle/Enums/CostCategory.cs create mode 100644 packages/microsoft.typespec.providerhub.controller/src/SubscriptionLifecycle/Enums/PaymentType.cs create mode 100644 packages/microsoft.typespec.providerhub.controller/src/SubscriptionLifecycle/Enums/RegistrationState.cs create mode 100644 packages/microsoft.typespec.providerhub.controller/src/SubscriptionLifecycle/Enums/SpendingLimit.cs create mode 100644 packages/microsoft.typespec.providerhub.controller/src/SubscriptionLifecycle/Enums/Tier.cs create mode 100644 packages/microsoft.typespec.providerhub.controller/src/SubscriptionLifecycle/Enums/WorkloadType.cs create mode 100644 packages/microsoft.typespec.providerhub.controller/src/SubscriptionLifecycle/ManagedByTenant.cs create mode 100644 packages/microsoft.typespec.providerhub.controller/src/SubscriptionLifecycle/RegisteredFeature.cs create mode 100644 packages/microsoft.typespec.providerhub.controller/src/SubscriptionLifecycle/RegistrationStatePayload.cs create mode 100644 packages/microsoft.typespec.providerhub.controller/src/SubscriptionLifecycle/RegistrationStateProperties.cs create mode 100644 packages/microsoft.typespec.providerhub.controller/src/SubscriptionLifecycle/ResourceStatus.cs create mode 100644 packages/microsoft.typespec.providerhub.controller/src/SubscriptionLifecycle/ZoneMapping.cs create mode 100644 packages/microsoft.typespec.providerhub.controller/test/SubscriptionLifecycleTests.cs create mode 100644 packages/samples/.eslintrc.cjs create mode 100644 packages/samples/.mocharc.yaml create mode 100644 packages/samples/LICENSE create mode 100644 packages/samples/README.md create mode 100644 packages/samples/mocha.reporter.config.json create mode 100644 packages/samples/package.json create mode 100644 packages/samples/scratch/.gitignore create mode 100644 packages/samples/specs/data-plane/api-path-parameter/main.tsp create mode 100644 packages/samples/specs/data-plane/azure-core-scalars/main.tsp create mode 100644 packages/samples/specs/data-plane/confidentialledger/confidentialledger.tsp create mode 100644 packages/samples/specs/data-plane/confidentialledger/identityservice.tsp create mode 100644 packages/samples/specs/data-plane/confidentialledger/main.tsp create mode 100644 packages/samples/specs/data-plane/custom-error-type/main.tsp create mode 100644 packages/samples/specs/data-plane/formrecognizer/main.tsp create mode 100644 packages/samples/specs/data-plane/language/authoring/authoring.tsp create mode 100644 packages/samples/specs/data-plane/language/authoring/main.tsp create mode 100644 packages/samples/specs/data-plane/languageqna/Interface/common.tsp create mode 100644 packages/samples/specs/data-plane/languageqna/Interface/main.tsp create mode 100644 packages/samples/specs/data-plane/languageqna/Interface/questionanswering-authoring_models.tsp create mode 100644 packages/samples/specs/data-plane/languageqna/Raw/common.tsp create mode 100644 packages/samples/specs/data-plane/languageqna/Raw/main.tsp create mode 100644 packages/samples/specs/data-plane/searchindex/main.tsp create mode 100644 packages/samples/specs/data-plane/searchservice/common.tsp create mode 100644 packages/samples/specs/data-plane/searchservice/dataIdentity.model.tsp create mode 100644 packages/samples/specs/data-plane/searchservice/dataPolicy.model.tsp create mode 100644 packages/samples/specs/data-plane/searchservice/languages.tsp create mode 100644 packages/samples/specs/data-plane/searchservice/main.tsp create mode 100644 packages/samples/specs/data-plane/searchservice/search-datasource.ops.tsp create mode 100644 packages/samples/specs/data-plane/searchservice/search-index.models.tsp create mode 100644 packages/samples/specs/data-plane/searchservice/search-index.ops.tsp create mode 100644 packages/samples/specs/data-plane/searchservice/search-indexer.ops.tsp create mode 100644 packages/samples/specs/data-plane/searchservice/searchservice.models.tsp create mode 100644 packages/samples/specs/data-plane/searchservice/skills.models.tsp create mode 100644 packages/samples/specs/data-plane/searchservice/skills.ops.tsp create mode 100644 packages/samples/specs/data-plane/trait-versioning/main.tsp create mode 100644 packages/samples/specs/data-plane/widget-manager/main.tsp create mode 100644 packages/samples/specs/misc/appconfig/api.json create mode 100644 packages/samples/specs/misc/appconfig/keys.tsp create mode 100644 packages/samples/specs/misc/appconfig/keyvalues.tsp create mode 100644 packages/samples/specs/misc/appconfig/labels.tsp create mode 100644 packages/samples/specs/misc/appconfig/locks.tsp create mode 100644 packages/samples/specs/misc/appconfig/main.tsp create mode 100644 packages/samples/specs/misc/appconfig/models.tsp create mode 100644 packages/samples/specs/misc/appconfig/revisions.tsp create mode 100644 packages/samples/specs/misc/overloads/main.tsp create mode 100644 packages/samples/specs/misc/overloads/overloads.tsp create mode 100644 packages/samples/specs/misc/overloads/tspconfig.yaml create mode 100644 packages/samples/specs/resource-manager/README.md create mode 100644 packages/samples/specs/resource-manager/arm-library/main.tsp create mode 100644 packages/samples/specs/resource-manager/arm-library/ref-library/int-templates.tsp create mode 100644 packages/samples/specs/resource-manager/arm-library/ref-library/op-templates.tsp create mode 100644 packages/samples/specs/resource-manager/arm-scenarios/extension-resource/main.tsp create mode 100644 packages/samples/specs/resource-manager/arm-scenarios/nobody-action/main.tsp create mode 100644 packages/samples/specs/resource-manager/arm-scenarios/proxy/main.tsp create mode 100644 packages/samples/specs/resource-manager/arm-scenarios/singleton/main.tsp create mode 100644 packages/samples/specs/resource-manager/arm-scenarios/tenant/main.tsp create mode 100644 packages/samples/specs/resource-manager/arm-scenarios/tracked/main.tsp create mode 100644 packages/samples/specs/resource-manager/arm-scenarios/tspconfig.yaml create mode 100644 packages/samples/specs/resource-manager/codesigning/codesigning.tsp create mode 100644 packages/samples/specs/resource-manager/codesigning/main.tsp create mode 100644 packages/samples/specs/resource-manager/codesigning/tspconfig.yaml create mode 100644 packages/samples/specs/resource-manager/common-types/v3/types.json create mode 100644 packages/samples/specs/resource-manager/common-types/v4/managedidentity.json create mode 100644 packages/samples/specs/resource-manager/common-types/v4/privatelinks.json create mode 100644 packages/samples/specs/resource-manager/common-types/v4/types.json create mode 100644 packages/samples/specs/resource-manager/common-types/v5/customermanagedkeys.json create mode 100644 packages/samples/specs/resource-manager/common-types/v5/managedidenity.json create mode 100644 packages/samples/specs/resource-manager/common-types/v5/privatelinks.json create mode 100644 packages/samples/specs/resource-manager/common-types/v5/types.json create mode 100644 packages/samples/specs/resource-manager/contoso/contoso.tsp create mode 100644 packages/samples/specs/resource-manager/contoso/main.tsp create mode 100644 packages/samples/specs/resource-manager/csharpattributetest/main.tsp create mode 100644 packages/samples/specs/resource-manager/customer-managed-keys/main.tsp create mode 100644 packages/samples/specs/resource-manager/discriminatortest/common.tsp create mode 100644 packages/samples/specs/resource-manager/discriminatortest/main.tsp create mode 100644 packages/samples/specs/resource-manager/dynatrace/main.tsp create mode 100644 packages/samples/specs/resource-manager/dynatrace/models.tsp create mode 100644 packages/samples/specs/resource-manager/envelopetest/main.tsp create mode 100644 packages/samples/specs/resource-manager/liftr.confluent/confluent.rest.typespec-example create mode 100644 packages/samples/specs/resource-manager/liftr.confluent/confluent.tsp create mode 100644 packages/samples/specs/resource-manager/liftr.confluent/main.tsp create mode 100644 packages/samples/specs/resource-manager/liftr.frs/fluidrelay.tsp create mode 100644 packages/samples/specs/resource-manager/liftr.frs/main.tsp create mode 100644 packages/samples/specs/resource-manager/liftr.frs/notes.md create mode 100644 packages/samples/specs/resource-manager/liftr.playfab/main.tsp create mode 100644 packages/samples/specs/resource-manager/liftr.playfab/playfab.tsp create mode 100644 packages/samples/specs/resource-manager/logz/logz.tsp create mode 100644 packages/samples/specs/resource-manager/logz/main.tsp create mode 100644 packages/samples/specs/resource-manager/logz/models.tsp create mode 100644 packages/samples/specs/resource-manager/logz/tspconfig.yaml create mode 100644 packages/samples/specs/resource-manager/operationsTest/main.tsp create mode 100644 packages/samples/specs/resource-manager/operationsTest/opTemplates.tsp create mode 100644 packages/samples/specs/resource-manager/private-links/main.tsp create mode 100644 packages/samples/specs/resource-manager/servicelinker/main.tsp create mode 100644 packages/samples/specs/resource-manager/servicelinker/servicelinker.tsp create mode 100644 packages/samples/specs/resource-manager/servicelinker/tspconfig.yaml create mode 100644 packages/samples/specs/resource-manager/tagsUpdateTest/main.tsp create mode 100644 packages/samples/specs/resource-manager/tenantResource/main.tsp create mode 100644 packages/samples/specs/resource-manager/tspconfig.yaml create mode 100644 packages/samples/test/output/azure/core/data-plane/api-path-parameter/@azure-tools/typespec-autorest/2022-08-31/openapi.json create mode 100644 packages/samples/test/output/azure/core/data-plane/api-path-parameter/@typespec/openapi3/openapi.2022-08-31.yaml create mode 100644 packages/samples/test/output/azure/core/data-plane/azure-core-scalars/@azure-tools/typespec-autorest/2022-08-31/openapi.json create mode 100644 packages/samples/test/output/azure/core/data-plane/azure-core-scalars/@typespec/openapi3/openapi.2022-08-31.yaml create mode 100644 packages/samples/test/output/azure/core/data-plane/confidentialledger/@azure-tools/typespec-autorest/openapi.json create mode 100644 packages/samples/test/output/azure/core/data-plane/confidentialledger/@typespec/openapi3/openapi.yaml create mode 100644 packages/samples/test/output/azure/core/data-plane/custom-error-type/@azure-tools/typespec-autorest/2022-08-31/openapi.json create mode 100644 packages/samples/test/output/azure/core/data-plane/custom-error-type/@typespec/openapi3/openapi.2022-08-31.yaml create mode 100644 packages/samples/test/output/azure/core/data-plane/formrecognizer/@azure-tools/typespec-autorest/openapi.json create mode 100644 packages/samples/test/output/azure/core/data-plane/formrecognizer/@typespec/openapi3/openapi.yaml create mode 100644 packages/samples/test/output/azure/core/data-plane/language/authoring/@azure-tools/typespec-autorest/openapi.json create mode 100644 packages/samples/test/output/azure/core/data-plane/language/authoring/@typespec/openapi3/openapi.yaml create mode 100644 packages/samples/test/output/azure/core/data-plane/languageqna/Interface/@azure-tools/typespec-autorest/openapi.json create mode 100644 packages/samples/test/output/azure/core/data-plane/languageqna/Interface/@typespec/openapi3/openapi.yaml create mode 100644 packages/samples/test/output/azure/core/data-plane/languageqna/Raw/@azure-tools/typespec-autorest/openapi.json create mode 100644 packages/samples/test/output/azure/core/data-plane/languageqna/Raw/@typespec/openapi3/openapi.yaml create mode 100644 packages/samples/test/output/azure/core/data-plane/searchindex/@azure-tools/typespec-autorest/openapi.json create mode 100644 packages/samples/test/output/azure/core/data-plane/searchindex/@typespec/openapi3/openapi.yaml create mode 100644 packages/samples/test/output/azure/core/data-plane/searchservice/@azure-tools/typespec-autorest/openapi.json create mode 100644 packages/samples/test/output/azure/core/data-plane/searchservice/@typespec/openapi3/openapi.yaml create mode 100644 packages/samples/test/output/azure/core/data-plane/trait-versioning/@azure-tools/typespec-autorest/2022-08-31/openapi.json create mode 100644 packages/samples/test/output/azure/core/data-plane/trait-versioning/@azure-tools/typespec-autorest/2023-02-07/openapi.json create mode 100644 packages/samples/test/output/azure/core/data-plane/trait-versioning/@typespec/openapi3/openapi.2022-08-31.yaml create mode 100644 packages/samples/test/output/azure/core/data-plane/trait-versioning/@typespec/openapi3/openapi.2023-02-07.yaml create mode 100644 packages/samples/test/output/azure/core/data-plane/widget-manager/@azure-tools/typespec-autorest/2022-08-31/openapi.json create mode 100644 packages/samples/test/output/azure/core/data-plane/widget-manager/@typespec/openapi3/openapi.2022-08-31.yaml create mode 100644 packages/samples/test/output/azure/core/misc/appconfig/@azure-tools/typespec-autorest/openapi.json create mode 100644 packages/samples/test/output/azure/core/misc/appconfig/@typespec/openapi3/openapi.yaml create mode 100644 packages/samples/test/output/azure/core/misc/overloads/@azure-tools/typespec-autorest/openapi.json create mode 100644 packages/samples/test/output/azure/resource-manager/arm-library/@azure-tools/typespec-autorest/openapi.json create mode 100644 packages/samples/test/output/azure/resource-manager/arm-scenarios/extension-resource/@azure-tools/typespec-autorest/2021-10-01-preview/openapi.json create mode 100644 packages/samples/test/output/azure/resource-manager/arm-scenarios/nobody-action/@azure-tools/typespec-autorest/2021-10-01-preview/openapi.json create mode 100644 packages/samples/test/output/azure/resource-manager/arm-scenarios/proxy/@azure-tools/typespec-autorest/2021-10-01-preview/openapi.json create mode 100644 packages/samples/test/output/azure/resource-manager/arm-scenarios/singleton/@azure-tools/typespec-autorest/2021-10-01-preview/openapi.json create mode 100644 packages/samples/test/output/azure/resource-manager/arm-scenarios/tenant/@azure-tools/typespec-autorest/2021-10-01-preview/openapi.json create mode 100644 packages/samples/test/output/azure/resource-manager/arm-scenarios/tracked/@azure-tools/typespec-autorest/2021-10-01-preview/openapi.json create mode 100644 packages/samples/test/output/azure/resource-manager/codesigning/@azure-tools/typespec-autorest/openapi.json create mode 100644 packages/samples/test/output/azure/resource-manager/contoso/@azure-tools/typespec-autorest/openapi.json create mode 100644 packages/samples/test/output/azure/resource-manager/csharpattributetest/@azure-tools/typespec-autorest/openapi.json create mode 100644 packages/samples/test/output/azure/resource-manager/customer-managed-keys/@azure-tools/typespec-autorest/openapi.json create mode 100644 packages/samples/test/output/azure/resource-manager/discriminatortest/@azure-tools/typespec-autorest/openapi.json create mode 100644 packages/samples/test/output/azure/resource-manager/dynatrace/@azure-tools/typespec-autorest/2021-06-13-preview/openapi.json create mode 100644 packages/samples/test/output/azure/resource-manager/dynatrace/@azure-tools/typespec-autorest/2022-04-30-preview/openapi.json create mode 100644 packages/samples/test/output/azure/resource-manager/envelopetest/@azure-tools/typespec-autorest/openapi.json create mode 100644 packages/samples/test/output/azure/resource-manager/liftr.confluent/@azure-tools/typespec-autorest/openapi.json create mode 100644 packages/samples/test/output/azure/resource-manager/liftr.frs/@azure-tools/typespec-autorest/openapi.json create mode 100644 packages/samples/test/output/azure/resource-manager/liftr.playfab/@azure-tools/typespec-autorest/openapi.json create mode 100644 packages/samples/test/output/azure/resource-manager/logz/@azure-tools/typespec-autorest/openapi.json create mode 100644 packages/samples/test/output/azure/resource-manager/operationsTest/@azure-tools/typespec-autorest/openapi.json create mode 100644 packages/samples/test/output/azure/resource-manager/private-links/@azure-tools/typespec-autorest/2023-08-01-preview/openapi.json create mode 100644 packages/samples/test/output/azure/resource-manager/private-links/@azure-tools/typespec-autorest/2023-11-01-preview/openapi.json create mode 100644 packages/samples/test/output/azure/resource-manager/servicelinker/@azure-tools/typespec-autorest/openapi.json create mode 100644 packages/samples/test/output/azure/resource-manager/tagsUpdateTest/@azure-tools/typespec-autorest/openapi.json create mode 100644 packages/samples/test/output/azure/resource-manager/tenantResource/@azure-tools/typespec-autorest/openapi.json create mode 100644 packages/samples/test/output/core/binary/@azure-tools/typespec-autorest/openapi.json create mode 100644 packages/samples/test/output/core/documentation/@azure-tools/typespec-autorest/openapi.json create mode 100644 packages/samples/test/output/core/encoding/@azure-tools/typespec-autorest/openapi.json create mode 100644 packages/samples/test/output/core/grpc-kiosk-example/@azure-tools/typespec-autorest/openapi.json create mode 100644 packages/samples/test/output/core/grpc-library-example/@azure-tools/typespec-autorest/openapi.json create mode 100644 packages/samples/test/output/core/nested/@azure-tools/typespec-autorest/openapi.json create mode 100644 packages/samples/test/output/core/nullable/@azure-tools/typespec-autorest/openapi.json create mode 100644 packages/samples/test/output/core/openapi-extensions/@azure-tools/typespec-autorest/openapi.json create mode 100644 packages/samples/test/output/core/optional/@azure-tools/typespec-autorest/openapi.json create mode 100644 packages/samples/test/output/core/param-decorators/@azure-tools/typespec-autorest/openapi.json create mode 100644 packages/samples/test/output/core/petstore/@azure-tools/typespec-autorest/openapi.json create mode 100644 packages/samples/test/output/core/polymorphism/@azure-tools/typespec-autorest/openapi.json create mode 100644 packages/samples/test/output/core/projected-names/@azure-tools/typespec-autorest/openapi.json create mode 100644 packages/samples/test/output/core/rest-metadata-emitter/@azure-tools/typespec-autorest/AnotherService/openapi.json create mode 100644 packages/samples/test/output/core/rest-metadata-emitter/@azure-tools/typespec-autorest/UserService/v1/openapi.json create mode 100644 packages/samples/test/output/core/rest-metadata-emitter/@azure-tools/typespec-autorest/UserService/v2/openapi.json create mode 100644 packages/samples/test/output/core/rest/petstore/@azure-tools/typespec-autorest/openapi.json create mode 100644 packages/samples/test/output/core/signatures/@azure-tools/typespec-autorest/openapi.json create mode 100644 packages/samples/test/output/core/simple/@azure-tools/typespec-autorest/openapi.json create mode 100644 packages/samples/test/output/core/status-code-ranges/@azure-tools/typespec-autorest/openapi.json create mode 100644 packages/samples/test/output/core/string-template/@azure-tools/typespec-autorest/openapi.json create mode 100644 packages/samples/test/output/core/tags/@azure-tools/typespec-autorest/openapi.json create mode 100644 packages/samples/test/output/core/testserver/body-boolean/@azure-tools/typespec-autorest/openapi.json create mode 100644 packages/samples/test/output/core/testserver/body-complex/@azure-tools/typespec-autorest/openapi.json create mode 100644 packages/samples/test/output/core/testserver/body-string/@azure-tools/typespec-autorest/openapi.json create mode 100644 packages/samples/test/output/core/testserver/body-time/@azure-tools/typespec-autorest/openapi.json create mode 100644 packages/samples/test/output/core/testserver/media-types/@azure-tools/typespec-autorest/openapi.json create mode 100644 packages/samples/test/output/core/testserver/multiple-inheritance/@azure-tools/typespec-autorest/openapi.json create mode 100644 packages/samples/test/output/core/use-versioned-lib/@azure-tools/typespec-autorest/openapi.json create mode 100644 packages/samples/test/output/core/versioning/@azure-tools/typespec-autorest/v1/openapi.json create mode 100644 packages/samples/test/output/core/versioning/@azure-tools/typespec-autorest/v2/openapi.json create mode 100644 packages/samples/test/output/core/visibility/@azure-tools/typespec-autorest/openapi.json create mode 100644 packages/samples/test/samples.test.ts create mode 100644 packages/samples/tsconfig.json create mode 100644 packages/samples/tspconfig.yaml create mode 100644 packages/typespec-autorest/.c8rc.json create mode 100644 packages/typespec-autorest/.eslintrc.cjs create mode 100644 packages/typespec-autorest/.mocharc.yaml create mode 100644 packages/typespec-autorest/.scripts/schema-json-to-js.js create mode 100644 packages/typespec-autorest/CHANGELOG.json create mode 100644 packages/typespec-autorest/CHANGELOG.md create mode 100644 packages/typespec-autorest/LICENSE create mode 100644 packages/typespec-autorest/README.md create mode 100644 packages/typespec-autorest/lib/autorest.tsp create mode 100644 packages/typespec-autorest/lib/decorators.tsp create mode 100644 packages/typespec-autorest/mocha.reporter.config.json create mode 100644 packages/typespec-autorest/package.json create mode 100644 packages/typespec-autorest/schema/.gitignore create mode 100644 packages/typespec-autorest/schema/autorest-openapi-schema.tsp create mode 100644 packages/typespec-autorest/schema/tspconfig.yaml create mode 100644 packages/typespec-autorest/src/autorest-openapi-schema.ts create mode 100644 packages/typespec-autorest/src/decorators.ts create mode 100644 packages/typespec-autorest/src/index.ts create mode 100644 packages/typespec-autorest/src/json-schema-sorter/sorter.ts create mode 100644 packages/typespec-autorest/src/lib.ts create mode 100644 packages/typespec-autorest/src/openapi.ts create mode 100644 packages/typespec-autorest/src/testing/index.ts create mode 100644 packages/typespec-autorest/src/types.ts create mode 100644 packages/typespec-autorest/src/utils.ts create mode 100644 packages/typespec-autorest/test/additional-properties.test.ts create mode 100644 packages/typespec-autorest/test/array.test.ts create mode 100644 packages/typespec-autorest/test/azure-core-operations.test.ts create mode 100644 packages/typespec-autorest/test/decorators.test.ts create mode 100644 packages/typespec-autorest/test/discriminator.test.ts create mode 100644 packages/typespec-autorest/test/documentation.test.ts create mode 100644 packages/typespec-autorest/test/formats.test.ts create mode 100644 packages/typespec-autorest/test/host.test.ts create mode 100644 packages/typespec-autorest/test/info.test.ts create mode 100644 packages/typespec-autorest/test/lro.test.ts create mode 100644 packages/typespec-autorest/test/metadata.test.ts create mode 100644 packages/typespec-autorest/test/models.test.ts create mode 100644 packages/typespec-autorest/test/multipart.test.ts create mode 100644 packages/typespec-autorest/test/openapi-output.test.ts create mode 100644 packages/typespec-autorest/test/options.test.ts create mode 100644 packages/typespec-autorest/test/paging.test.ts create mode 100644 packages/typespec-autorest/test/parameters.test.ts create mode 100644 packages/typespec-autorest/test/primitive-types.test.ts create mode 100644 packages/typespec-autorest/test/produces-consumes.test.ts create mode 100644 packages/typespec-autorest/test/property-schema.test.ts create mode 100644 packages/typespec-autorest/test/return-types.test.ts create mode 100644 packages/typespec-autorest/test/security.test.ts create mode 100644 packages/typespec-autorest/test/shared-routes.test.ts create mode 100644 packages/typespec-autorest/test/sorting.test.ts create mode 100644 packages/typespec-autorest/test/status-codes.test.ts create mode 100644 packages/typespec-autorest/test/string-templates.test.ts create mode 100644 packages/typespec-autorest/test/test-host.ts create mode 100644 packages/typespec-autorest/test/union-schema.test.ts create mode 100644 packages/typespec-autorest/test/versioning.test.ts create mode 100644 packages/typespec-autorest/tsconfig.json create mode 100644 packages/typespec-azure-core/.c8rc.json create mode 100644 packages/typespec-azure-core/.eslintrc.cjs create mode 100644 packages/typespec-azure-core/.mocharc.yaml create mode 100644 packages/typespec-azure-core/CHANGELOG.json create mode 100644 packages/typespec-azure-core/CHANGELOG.md create mode 100644 packages/typespec-azure-core/LICENSE create mode 100644 packages/typespec-azure-core/README.md create mode 100644 packages/typespec-azure-core/lib/auth.tsp create mode 100644 packages/typespec-azure-core/lib/azure-core.tsp create mode 100644 packages/typespec-azure-core/lib/decorators.tsp create mode 100644 packages/typespec-azure-core/lib/foundations.tsp create mode 100644 packages/typespec-azure-core/lib/models.tsp create mode 100644 packages/typespec-azure-core/lib/operations.tsp create mode 100644 packages/typespec-azure-core/lib/traits.tsp create mode 100644 packages/typespec-azure-core/mocha.reporter.config.json create mode 100644 packages/typespec-azure-core/package.json create mode 100644 packages/typespec-azure-core/src/decorators.ts create mode 100644 packages/typespec-azure-core/src/helpers/union-enums.ts create mode 100644 packages/typespec-azure-core/src/index.ts create mode 100644 packages/typespec-azure-core/src/lib.ts create mode 100644 packages/typespec-azure-core/src/lro-helpers.ts create mode 100644 packages/typespec-azure-core/src/lro-info.ts create mode 100644 packages/typespec-azure-core/src/rules/api-version-parameter.ts create mode 100644 packages/typespec-azure-core/src/rules/auth-required.ts create mode 100644 packages/typespec-azure-core/src/rules/byos.ts create mode 100644 packages/typespec-azure-core/src/rules/casing.ts create mode 100644 packages/typespec-azure-core/src/rules/composition-over-inheritance.ts create mode 100644 packages/typespec-azure-core/src/rules/extensible-enums.ts create mode 100644 packages/typespec-azure-core/src/rules/friendly-name.ts create mode 100644 packages/typespec-azure-core/src/rules/known-encoding.ts create mode 100644 packages/typespec-azure-core/src/rules/lro-polling-operation.ts create mode 100644 packages/typespec-azure-core/src/rules/no-closed-literal-union.ts create mode 100644 packages/typespec-azure-core/src/rules/no-enum.ts create mode 100644 packages/typespec-azure-core/src/rules/no-error-status-codes.ts create mode 100644 packages/typespec-azure-core/src/rules/no-explicit-routes-resource-ops.ts create mode 100644 packages/typespec-azure-core/src/rules/no-fixed-enum-discriminator.ts create mode 100644 packages/typespec-azure-core/src/rules/no-nullable.ts create mode 100644 packages/typespec-azure-core/src/rules/no-offsetdatetime.ts create mode 100644 packages/typespec-azure-core/src/rules/no-operation-id.ts create mode 100644 packages/typespec-azure-core/src/rules/no-order-by.ts create mode 100644 packages/typespec-azure-core/src/rules/no-response-body.ts create mode 100644 packages/typespec-azure-core/src/rules/no-rpc-path-params.ts create mode 100644 packages/typespec-azure-core/src/rules/prefer-csv-collection-format.ts create mode 100644 packages/typespec-azure-core/src/rules/prevent-format.ts create mode 100644 packages/typespec-azure-core/src/rules/prevent-multiple-discriminator.ts create mode 100644 packages/typespec-azure-core/src/rules/prevent-rest-library.ts create mode 100644 packages/typespec-azure-core/src/rules/prevent-unknown.ts create mode 100644 packages/typespec-azure-core/src/rules/property-naming.ts create mode 100644 packages/typespec-azure-core/src/rules/record-types.ts create mode 100644 packages/typespec-azure-core/src/rules/request-body-array.ts create mode 100644 packages/typespec-azure-core/src/rules/require-docs.ts create mode 100644 packages/typespec-azure-core/src/rules/require-key-visibility.ts create mode 100644 packages/typespec-azure-core/src/rules/response-schema-multi-status-code.ts create mode 100644 packages/typespec-azure-core/src/rules/rpc-operation-request-body.ts create mode 100644 packages/typespec-azure-core/src/rules/spread-discriminated-model.ts create mode 100644 packages/typespec-azure-core/src/rules/use-standard-names.ts create mode 100644 packages/typespec-azure-core/src/rules/use-standard-ops.ts create mode 100644 packages/typespec-azure-core/src/rules/utils.ts create mode 100644 packages/typespec-azure-core/src/testing/index.ts create mode 100644 packages/typespec-azure-core/src/traits.ts create mode 100644 packages/typespec-azure-core/src/utils.ts create mode 100644 packages/typespec-azure-core/src/validate.ts create mode 100644 packages/typespec-azure-core/test/decorators.test.ts create mode 100644 packages/typespec-azure-core/test/helpers/union-enums.test.ts create mode 100644 packages/typespec-azure-core/test/operations.test.ts create mode 100644 packages/typespec-azure-core/test/rules/api-version-parameter.test.ts create mode 100644 packages/typespec-azure-core/test/rules/auth-required.test.ts create mode 100644 packages/typespec-azure-core/test/rules/byos.test.ts create mode 100644 packages/typespec-azure-core/test/rules/casing.test.ts create mode 100644 packages/typespec-azure-core/test/rules/composition-over-inheritance.test.ts create mode 100644 packages/typespec-azure-core/test/rules/friendly-name.test.ts create mode 100644 packages/typespec-azure-core/test/rules/known-encoding.test.ts create mode 100644 packages/typespec-azure-core/test/rules/lro-polling-operation.test.ts create mode 100644 packages/typespec-azure-core/test/rules/no-closed-literal-union.test.ts create mode 100644 packages/typespec-azure-core/test/rules/no-enum.test.ts create mode 100644 packages/typespec-azure-core/test/rules/no-error-status-codes.test.ts create mode 100644 packages/typespec-azure-core/test/rules/no-explicit-routes-resource-ops.test.ts create mode 100644 packages/typespec-azure-core/test/rules/no-fixed-enum-discriminator.test.ts create mode 100644 packages/typespec-azure-core/test/rules/no-nullable.test.ts create mode 100644 packages/typespec-azure-core/test/rules/no-offsetdatetime.test.ts create mode 100644 packages/typespec-azure-core/test/rules/no-operation-id.test.ts create mode 100644 packages/typespec-azure-core/test/rules/no-order-by.test.ts create mode 100644 packages/typespec-azure-core/test/rules/no-response-body.test.ts create mode 100644 packages/typespec-azure-core/test/rules/no-rpc-path-params.test.ts create mode 100644 packages/typespec-azure-core/test/rules/prefer-csv-collection-format.test.ts create mode 100644 packages/typespec-azure-core/test/rules/prevent-format.test.ts create mode 100644 packages/typespec-azure-core/test/rules/prevent-multiple-discriminator.test.ts create mode 100644 packages/typespec-azure-core/test/rules/prevent-property-name-conflict.test.ts create mode 100644 packages/typespec-azure-core/test/rules/prevent-rest-library.test.ts create mode 100644 packages/typespec-azure-core/test/rules/prevent-unknown.test.ts create mode 100644 packages/typespec-azure-core/test/rules/record-types.test.ts create mode 100644 packages/typespec-azure-core/test/rules/request-body-array.test.ts create mode 100644 packages/typespec-azure-core/test/rules/require-docs.test.ts create mode 100644 packages/typespec-azure-core/test/rules/require-key-visibility.test.ts create mode 100644 packages/typespec-azure-core/test/rules/response-schema-multi-status-code.test.ts create mode 100644 packages/typespec-azure-core/test/rules/rpc-operation-request-body.test.ts create mode 100644 packages/typespec-azure-core/test/rules/spread-discriminated-model.test.ts create mode 100644 packages/typespec-azure-core/test/rules/use-extensible-enums.test.ts create mode 100644 packages/typespec-azure-core/test/rules/use-standard-names.test.ts create mode 100644 packages/typespec-azure-core/test/rules/use-standard-ops.test.ts create mode 100644 packages/typespec-azure-core/test/test-host.ts create mode 100644 packages/typespec-azure-core/test/traits.test.ts create mode 100644 packages/typespec-azure-core/tsconfig.json create mode 100644 packages/typespec-azure-playground-website/.env create mode 100644 packages/typespec-azure-playground-website/.eslintrc.cjs create mode 100644 packages/typespec-azure-playground-website/README.md create mode 100644 packages/typespec-azure-playground-website/e2e/playwright.config.ts create mode 100644 packages/typespec-azure-playground-website/e2e/smoke.e2e.ts create mode 100644 packages/typespec-azure-playground-website/index.html create mode 100644 packages/typespec-azure-playground-website/package.json create mode 100644 packages/typespec-azure-playground-website/samples/arm.tsp create mode 100644 packages/typespec-azure-playground-website/samples/azure-core.tsp create mode 100644 packages/typespec-azure-playground-website/samples/build.js create mode 100644 packages/typespec-azure-playground-website/src/index.ts create mode 100644 packages/typespec-azure-playground-website/src/main.tsx create mode 100644 packages/typespec-azure-playground-website/src/style.css create mode 100644 packages/typespec-azure-playground-website/tsconfig.json create mode 100644 packages/typespec-azure-playground-website/vite.config.ts create mode 100644 packages/typespec-azure-resource-manager/.c8rc.json create mode 100644 packages/typespec-azure-resource-manager/.eslintrc.cjs create mode 100644 packages/typespec-azure-resource-manager/.mocharc.yaml create mode 100644 packages/typespec-azure-resource-manager/CHANGELOG.json create mode 100644 packages/typespec-azure-resource-manager/CHANGELOG.md create mode 100644 packages/typespec-azure-resource-manager/LICENSE create mode 100644 packages/typespec-azure-resource-manager/README.md create mode 100644 packages/typespec-azure-resource-manager/lib/arm.foundations.tsp create mode 100644 packages/typespec-azure-resource-manager/lib/arm.tsp create mode 100644 packages/typespec-azure-resource-manager/lib/common-types.tsp create mode 100644 packages/typespec-azure-resource-manager/lib/customer-managed-keys.tsp create mode 100644 packages/typespec-azure-resource-manager/lib/decorators.tsp create mode 100644 packages/typespec-azure-resource-manager/lib/interfaces.tsp create mode 100644 packages/typespec-azure-resource-manager/lib/models.tsp create mode 100644 packages/typespec-azure-resource-manager/lib/operations.tsp create mode 100644 packages/typespec-azure-resource-manager/lib/parameters.tsp create mode 100644 packages/typespec-azure-resource-manager/lib/private-links.tsp create mode 100644 packages/typespec-azure-resource-manager/lib/private.decorators.tsp create mode 100644 packages/typespec-azure-resource-manager/lib/responses.tsp create mode 100644 packages/typespec-azure-resource-manager/mocha.reporter.config.json create mode 100644 packages/typespec-azure-resource-manager/package.json create mode 100644 packages/typespec-azure-resource-manager/scaffolding.json create mode 100644 packages/typespec-azure-resource-manager/src/common-types.ts create mode 100644 packages/typespec-azure-resource-manager/src/index.ts create mode 100644 packages/typespec-azure-resource-manager/src/lib.ts create mode 100644 packages/typespec-azure-resource-manager/src/namespace.ts create mode 100644 packages/typespec-azure-resource-manager/src/operations.ts create mode 100644 packages/typespec-azure-resource-manager/src/private.decorators.ts create mode 100644 packages/typespec-azure-resource-manager/src/resource.ts create mode 100644 packages/typespec-azure-resource-manager/src/rules/arm-common-types-version.ts create mode 100644 packages/typespec-azure-resource-manager/src/rules/arm-resource-action-no-segment.ts create mode 100644 packages/typespec-azure-resource-manager/src/rules/arm-resource-duplicate-property.ts create mode 100644 packages/typespec-azure-resource-manager/src/rules/arm-resource-interfaces.ts create mode 100644 packages/typespec-azure-resource-manager/src/rules/arm-resource-invalid-action-verb.ts create mode 100644 packages/typespec-azure-resource-manager/src/rules/arm-resource-invalid-envelope-property.ts create mode 100644 packages/typespec-azure-resource-manager/src/rules/arm-resource-invalid-version-format.ts create mode 100644 packages/typespec-azure-resource-manager/src/rules/arm-resource-key-invalid-chars.ts create mode 100644 packages/typespec-azure-resource-manager/src/rules/arm-resource-operation-response.ts create mode 100644 packages/typespec-azure-resource-manager/src/rules/arm-resource-patch.ts create mode 100644 packages/typespec-azure-resource-manager/src/rules/arm-resource-path-invalid-chars.ts create mode 100644 packages/typespec-azure-resource-manager/src/rules/arm-resource-provisioning-state-rule.ts create mode 100644 packages/typespec-azure-resource-manager/src/rules/beyond-nesting-levels.ts create mode 100644 packages/typespec-azure-resource-manager/src/rules/core-operations.ts create mode 100644 packages/typespec-azure-resource-manager/src/rules/delete-operation.ts create mode 100644 packages/typespec-azure-resource-manager/src/rules/envelope-properties.ts create mode 100644 packages/typespec-azure-resource-manager/src/rules/list-operation.ts create mode 100644 packages/typespec-azure-resource-manager/src/rules/no-response-body.ts create mode 100644 packages/typespec-azure-resource-manager/src/rules/operations-interface-missing.ts create mode 100644 packages/typespec-azure-resource-manager/src/rules/patch-envelope-properties.ts create mode 100644 packages/typespec-azure-resource-manager/src/rules/resource-name.ts create mode 100644 packages/typespec-azure-resource-manager/src/rules/retry-after.ts create mode 100644 packages/typespec-azure-resource-manager/src/rules/unsupported-type.ts create mode 100644 packages/typespec-azure-resource-manager/src/rules/utils.ts create mode 100644 packages/typespec-azure-resource-manager/src/state.ts create mode 100644 packages/typespec-azure-resource-manager/src/testing/index.ts create mode 100644 packages/typespec-azure-resource-manager/test/openapi-output.test.ts create mode 100644 packages/typespec-azure-resource-manager/test/resource.test.ts create mode 100644 packages/typespec-azure-resource-manager/test/rules/arm-common-types-version.test.ts create mode 100644 packages/typespec-azure-resource-manager/test/rules/arm-resource-action-no-segment.test.ts create mode 100644 packages/typespec-azure-resource-manager/test/rules/arm-resource-duplicate-properties.test.ts create mode 100644 packages/typespec-azure-resource-manager/test/rules/arm-resource-envelope-properties.test.ts create mode 100644 packages/typespec-azure-resource-manager/test/rules/arm-resource-interface.test.ts create mode 100644 packages/typespec-azure-resource-manager/test/rules/arm-resource-invalid-chars.test.ts create mode 100644 packages/typespec-azure-resource-manager/test/rules/arm-resource-invalid-version-format.test.ts create mode 100644 packages/typespec-azure-resource-manager/test/rules/arm-resource-key-invalid-chars.test.ts create mode 100644 packages/typespec-azure-resource-manager/test/rules/arm-resource-operations.test.ts create mode 100644 packages/typespec-azure-resource-manager/test/rules/arm-resource-provisioning-state.test.ts create mode 100644 packages/typespec-azure-resource-manager/test/rules/beyond-nesting-levels.test.ts create mode 100644 packages/typespec-azure-resource-manager/test/rules/core-operations.test.ts create mode 100644 packages/typespec-azure-resource-manager/test/rules/delete-operation.test.ts create mode 100644 packages/typespec-azure-resource-manager/test/rules/envelope-properties.test.ts create mode 100644 packages/typespec-azure-resource-manager/test/rules/no-response-body.test.ts create mode 100644 packages/typespec-azure-resource-manager/test/rules/operation-usage.test.ts create mode 100644 packages/typespec-azure-resource-manager/test/rules/operations-interface-missing.test.ts create mode 100644 packages/typespec-azure-resource-manager/test/rules/patch-envelope.test.ts create mode 100644 packages/typespec-azure-resource-manager/test/rules/patch-operations.test.ts create mode 100644 packages/typespec-azure-resource-manager/test/rules/resource-name.test.ts create mode 100644 packages/typespec-azure-resource-manager/test/rules/retry-after.test.ts create mode 100644 packages/typespec-azure-resource-manager/test/rules/unsupported-types.test.ts create mode 100644 packages/typespec-azure-resource-manager/test/test-host.ts create mode 100644 packages/typespec-azure-resource-manager/tsconfig.json create mode 100644 packages/typespec-client-generator-core/.c8rc.json create mode 100644 packages/typespec-client-generator-core/.eslintrc.cjs create mode 100644 packages/typespec-client-generator-core/.mocharc.yaml create mode 100644 packages/typespec-client-generator-core/CHANGELOG.json create mode 100644 packages/typespec-client-generator-core/CHANGELOG.md create mode 100644 packages/typespec-client-generator-core/LICENSE create mode 100644 packages/typespec-client-generator-core/README.md create mode 100644 packages/typespec-client-generator-core/doc/types.tsp create mode 100644 packages/typespec-client-generator-core/lib/decorators.tsp create mode 100644 packages/typespec-client-generator-core/lib/main.tsp create mode 100644 packages/typespec-client-generator-core/mocha.reporter.config.json create mode 100644 packages/typespec-client-generator-core/package.json create mode 100644 packages/typespec-client-generator-core/src/decorators.ts create mode 100644 packages/typespec-client-generator-core/src/index.ts create mode 100644 packages/typespec-client-generator-core/src/interfaces.ts create mode 100644 packages/typespec-client-generator-core/src/internal-utils.ts create mode 100644 packages/typespec-client-generator-core/src/lib.ts create mode 100644 packages/typespec-client-generator-core/src/public-utils.ts create mode 100644 packages/typespec-client-generator-core/src/testing/index.ts create mode 100644 packages/typespec-client-generator-core/src/types.ts create mode 100644 packages/typespec-client-generator-core/test/decorators.test.ts create mode 100644 packages/typespec-client-generator-core/test/public-utils.test.ts create mode 100644 packages/typespec-client-generator-core/test/test-host.ts create mode 100644 packages/typespec-client-generator-core/test/types.test.ts create mode 100644 packages/typespec-client-generator-core/tsconfig.json create mode 100644 packages/typespec-diff/.eslintrc.cjs create mode 100644 packages/typespec-diff/.mocharc.yaml create mode 100644 packages/typespec-diff/CHANGELOG.json create mode 100644 packages/typespec-diff/CHANGELOG.md create mode 100644 packages/typespec-diff/LICENSE create mode 100644 packages/typespec-diff/mocha.reporter.config.json create mode 100644 packages/typespec-diff/package.json create mode 100644 packages/typespec-diff/readme.md create mode 100644 packages/typespec-diff/src/array-diff.ts create mode 100644 packages/typespec-diff/src/config.ts create mode 100644 packages/typespec-diff/src/constraint-diff.ts create mode 100644 packages/typespec-diff/src/decorator-diff.ts create mode 100644 packages/typespec-diff/src/diff.ts create mode 100644 packages/typespec-diff/src/enum-diff.ts create mode 100644 packages/typespec-diff/src/index.ts create mode 100644 packages/typespec-diff/src/interface-diff.ts create mode 100644 packages/typespec-diff/src/model-diff.ts create mode 100644 packages/typespec-diff/src/model-property-diff.ts create mode 100644 packages/typespec-diff/src/namespace-diff.ts create mode 100644 packages/typespec-diff/src/operation-diff.ts create mode 100644 packages/typespec-diff/src/parameter-diff.ts create mode 100644 packages/typespec-diff/src/reporter.ts create mode 100644 packages/typespec-diff/src/return-diff.ts create mode 100644 packages/typespec-diff/src/rules.ts create mode 100644 packages/typespec-diff/src/scalar-diff.ts create mode 100644 packages/typespec-diff/src/type-diff.ts create mode 100644 packages/typespec-diff/src/union-diff.ts create mode 100644 packages/typespec-diff/src/utils.ts create mode 100644 packages/typespec-diff/test/diff.test.ts create mode 100644 packages/typespec-diff/test/test-host.ts create mode 100644 packages/typespec-diff/tsconfig.json create mode 100644 packages/typespec-service-csharp/.c8rc.json create mode 100644 packages/typespec-service-csharp/.eslintrc.cjs create mode 100644 packages/typespec-service-csharp/.mocharc.yaml create mode 100644 packages/typespec-service-csharp/CHANGELOG.json create mode 100644 packages/typespec-service-csharp/CHANGELOG.md create mode 100644 packages/typespec-service-csharp/LICENSE create mode 100644 packages/typespec-service-csharp/README.md create mode 100644 packages/typespec-service-csharp/lib/service.tsp create mode 100644 packages/typespec-service-csharp/mocha.reporter.config.json create mode 100644 packages/typespec-service-csharp/package.json create mode 100644 packages/typespec-service-csharp/src/attributes.ts create mode 100644 packages/typespec-service-csharp/src/boilerplate.ts create mode 100644 packages/typespec-service-csharp/src/index.ts create mode 100644 packages/typespec-service-csharp/src/interfaces.ts create mode 100644 packages/typespec-service-csharp/src/lib.ts create mode 100644 packages/typespec-service-csharp/src/service.ts create mode 100644 packages/typespec-service-csharp/src/testing/index.ts create mode 100644 packages/typespec-service-csharp/src/utils.ts create mode 100644 packages/typespec-service-csharp/test/diagnostic.test.ts create mode 100644 packages/typespec-service-csharp/test/generation.test.ts create mode 100644 packages/typespec-service-csharp/test/test-host.ts create mode 100644 packages/typespec-service-csharp/tsconfig.json create mode 100644 packages/website/.gitignore create mode 100644 packages/website/.scripts/docusaurus-build.mjs create mode 100644 packages/website/.scripts/update-playground-versions.mjs create mode 100644 packages/website/README.md create mode 100644 packages/website/babel.config.js create mode 100644 packages/website/docusaurus.config.ts create mode 100644 packages/website/package.json create mode 100644 packages/website/playground-versions.json create mode 100644 packages/website/sidebars.ts create mode 100644 packages/website/src/components/HomepageFeatures/index.js create mode 100644 packages/website/src/components/HomepageFeatures/styles.module.css create mode 100644 packages/website/src/components/fluent-layout/fluent-layout.tsx create mode 100644 packages/website/src/components/playground-component/import-map.ts create mode 100644 packages/website/src/components/playground-component/loading-spinner.module.css create mode 100644 packages/website/src/components/playground-component/loading-spinner.tsx create mode 100644 packages/website/src/components/playground-component/playground.tsx create mode 100644 packages/website/src/css/custom.css create mode 100644 packages/website/src/pages/index.js create mode 100644 packages/website/src/pages/index.module.css create mode 100644 packages/website/src/pages/markdown-page.md create mode 100644 packages/website/src/pages/playground.tsx create mode 100644 packages/website/src/theme/prism-include-languages.ts create mode 100644 packages/website/static/.nojekyll create mode 100644 packages/website/static/img/azure.svg create mode 100644 packages/website/static/img/logo.svg create mode 100644 packages/website/static/img/undraw_docusaurus_mountain.svg create mode 100644 packages/website/static/img/undraw_docusaurus_react.svg create mode 100644 packages/website/static/img/undraw_docusaurus_tree.svg create mode 100644 packages/website/tsconfig.json create mode 100644 packages/website/versioned_docs/version-latest/emitters/typespec-autorest/index.md create mode 100644 packages/website/versioned_docs/version-latest/emitters/typespec-autorest/reference/decorators.md create mode 100644 packages/website/versioned_docs/version-latest/emitters/typespec-autorest/reference/emitter.md create mode 100644 packages/website/versioned_docs/version-latest/emitters/typespec-autorest/reference/index.mdx create mode 100644 packages/website/versioned_docs/version-latest/emitters/typespec-csharp/index.md create mode 100644 packages/website/versioned_docs/version-latest/emitters/typespec-service-csharp/reference/emitter.md create mode 100644 packages/website/versioned_docs/version-latest/emitters/typespec-service-csharp/reference/index.mdx create mode 100644 packages/website/versioned_docs/version-latest/emitters/typespec-service-csharp/reference/js-api/_category_.json create mode 100644 packages/website/versioned_docs/version-latest/emitters/typespec-service-csharp/reference/js-api/functions/$onEmit.md create mode 100644 packages/website/versioned_docs/version-latest/emitters/typespec-service-csharp/reference/js-api/functions/getTracer.md create mode 100644 packages/website/versioned_docs/version-latest/emitters/typespec-service-csharp/reference/js-api/functions/reportDiagnostic.md create mode 100644 packages/website/versioned_docs/version-latest/emitters/typespec-service-csharp/reference/js-api/index.md create mode 100644 packages/website/versioned_docs/version-latest/emitters/typespec-service-csharp/reference/js-api/interfaces/CSharpServiceEmitterOptions.md create mode 100644 packages/website/versioned_docs/version-latest/emitters/typespec-service-csharp/reference/js-api/variables/$lib.md create mode 100644 packages/website/versioned_docs/version-latest/getstarted/azure-core/step01.md create mode 100644 packages/website/versioned_docs/version-latest/getstarted/azure-core/step02.md create mode 100644 packages/website/versioned_docs/version-latest/getstarted/azure-core/step03.md create mode 100644 packages/website/versioned_docs/version-latest/getstarted/azure-core/step04.md create mode 100644 packages/website/versioned_docs/version-latest/getstarted/azure-core/step05.md create mode 100644 packages/website/versioned_docs/version-latest/getstarted/azure-core/step06.md create mode 100644 packages/website/versioned_docs/version-latest/getstarted/azure-core/step07.md create mode 100644 packages/website/versioned_docs/version-latest/getstarted/azure-core/step08.md create mode 100644 packages/website/versioned_docs/version-latest/getstarted/azure-core/step09.md create mode 100644 packages/website/versioned_docs/version-latest/getstarted/azure-core/step10.md create mode 100644 packages/website/versioned_docs/version-latest/getstarted/azure-core/step11.md create mode 100644 packages/website/versioned_docs/version-latest/getstarted/azure-core/step12.md create mode 100644 packages/website/versioned_docs/version-latest/getstarted/azure-resource-manager/step00.md create mode 100644 packages/website/versioned_docs/version-latest/getstarted/azure-resource-manager/step01.md create mode 100644 packages/website/versioned_docs/version-latest/getstarted/azure-resource-manager/step02.md create mode 100644 packages/website/versioned_docs/version-latest/getstarted/azure-resource-manager/step03.md create mode 100644 packages/website/versioned_docs/version-latest/getstarted/azure-resource-manager/step04.md create mode 100644 packages/website/versioned_docs/version-latest/getstarted/azure-resource-manager/step05.md create mode 100644 packages/website/versioned_docs/version-latest/getstarted/createproject.md create mode 100644 packages/website/versioned_docs/version-latest/getstarted/installation.md create mode 100644 packages/website/versioned_docs/version-latest/getstarted/providerhub/step01-create-userrp-project.md create mode 100644 packages/website/versioned_docs/version-latest/getstarted/providerhub/step02-debug-onebox.md create mode 100644 packages/website/versioned_docs/version-latest/getstarted/providerhub/step03-api-testing.md create mode 100644 packages/website/versioned_docs/version-latest/getstarted/providerhub/step04-deploy-cloud.md create mode 100644 packages/website/versioned_docs/version-latest/howtos/ARM/arm-rules.md create mode 100644 packages/website/versioned_docs/version-latest/howtos/ARM/resource-operations.md create mode 100644 packages/website/versioned_docs/version-latest/howtos/ARM/resource-type.md create mode 100644 packages/website/versioned_docs/version-latest/howtos/Azure Core/content-negotiation.md create mode 100644 packages/website/versioned_docs/version-latest/howtos/Azure Core/long-running-operations.md create mode 100644 packages/website/versioned_docs/version-latest/howtos/DataPlane Generation - DPG/00howtogen.mdx create mode 100644 packages/website/versioned_docs/version-latest/howtos/DataPlane Generation - DPG/01setup.mdx create mode 100644 packages/website/versioned_docs/version-latest/howtos/DataPlane Generation - DPG/02client.mdx create mode 100644 packages/website/versioned_docs/version-latest/howtos/DataPlane Generation - DPG/03convenient.mdx create mode 100644 packages/website/versioned_docs/version-latest/howtos/DataPlane Generation - DPG/04renaming.mdx create mode 100644 packages/website/versioned_docs/version-latest/howtos/DataPlane Generation - DPG/05union.mdx create mode 100644 packages/website/versioned_docs/version-latest/howtos/TypeSpec/emitter-configurations.md create mode 100644 packages/website/versioned_docs/version-latest/howtos/rest-api-publish/_category_.json create mode 100644 packages/website/versioned_docs/version-latest/howtos/rest-api-publish/buildpipelines.md create mode 100644 packages/website/versioned_docs/version-latest/howtos/rest-api-publish/checking-in-api-specs-guide.md create mode 100644 packages/website/versioned_docs/version-latest/intro.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/data-types.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/decorators.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/index.mdx create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/interfaces.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/_category_.json create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/enumerations/FinalStateValue.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/functions/$addTraitProperties.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/functions/$applyTraitOverride.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/functions/$ensureAllHeaderParams.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/functions/$ensureAllQueryParams.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/functions/$ensureResourceType.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/functions/$ensureTraitsPresent.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/functions/$ensureVerb.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/functions/$finalLocation.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/functions/$finalOperation.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/functions/$fixed.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/functions/$items.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/functions/$lroCanceled.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/functions/$lroErrorResult.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/functions/$lroFailed.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/functions/$lroResult.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/functions/$lroStatus.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/functions/$lroSucceeded.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/functions/$needsRoute.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/functions/$nextLink.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/functions/$nextPageOperation.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/functions/$omitKeyProperties.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/functions/$onValidate.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/functions/$operationLink.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/functions/$pagedResult.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/functions/$pollingLocation.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/functions/$pollingOperation.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/functions/$pollingOperationParameter.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/functions/$requestParameter.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/functions/$responseProperty.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/functions/$spreadCustomParameters.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/functions/$spreadCustomResponseProperties.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/functions/$trait.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/functions/$traitAdded.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/functions/$traitContext.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/functions/$traitLocation.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/functions/$traitSource.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/functions/checkEnsureVerb.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/functions/checkRpcRoutes.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/functions/extractLroStates.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/functions/filterModelProperties.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/functions/filterResponseModels.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/functions/getAllProperties.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/functions/getAsEmbeddingVector.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/functions/getHttpMetadata.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/functions/getItems.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/functions/getLongRunningStates.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/functions/getLroErrorResult.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/functions/getLroMetadata.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/functions/getLroResult.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/functions/getLroStatusProperty.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/functions/getNextLink.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/functions/getOperationLink.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/functions/getOperationLinks.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/functions/getOperationResponse.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/functions/getPagedResult.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/functions/getPollingOperationParameter.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/functions/getRequestParameter.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/functions/getResponseProperty.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/functions/getResultModelWithProperty.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/functions/getSourceTraitName.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/functions/getSuccessResponse.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/functions/getTraitContexts.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/functions/getTraitLocation.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/functions/getTraitName.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/functions/getUnionAsEnum.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/functions/isFinalLocation.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/functions/isFixed.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/functions/isLroCanceledState.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/functions/isLroFailedState.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/functions/isLroSucceededState.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/functions/isPollingLocation.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/functions/isResourceOperation.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/functions/isTraitModel.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/functions/unsupported_enable_checkStandardOperations.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/index.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/interfaces/EmbeddingVectorMetadata.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/interfaces/FinalOperationLink.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/interfaces/FinalOperationReference.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/interfaces/HttpTerminationStatus.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/interfaces/LogicalOperationStep.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/interfaces/LongRunningStates.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/interfaces/LroMetadata.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/interfaces/ModelPropertyTerminationStatus.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/interfaces/NextOperationLink.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/interfaces/NextOperationReference.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/interfaces/OperationLink.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/interfaces/OperationLinkMetadata.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/interfaces/OperationReference.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/interfaces/PagedResultMetadata.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/interfaces/ParameterSource.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/interfaces/PollingOperationStep.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/interfaces/PollingSuccessNoResult.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/interfaces/PollingSuccessProperty.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/type-aliases/FinalOperationStep.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/type-aliases/OperationStep.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/type-aliases/TerminationStatus.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/type-aliases/UnionEnum.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/type-aliases/nextOperationStep.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/variables/$lib.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/variables/FinalOperationKey.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/variables/PollingOperationKey.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/variables/namespace.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/variables/preventRestLibraryInterfaces.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/js-api/variables/useStandardOperations.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/reference/linter.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/rules/no-closed-literal-union.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-core/rules/no-enum.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-resource-manager/reference/data-types.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-resource-manager/reference/decorators.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-resource-manager/reference/index.mdx create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-resource-manager/reference/interfaces.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-resource-manager/reference/js-api/_category_.json create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-resource-manager/reference/js-api/enumerations/ResourceBaseType.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-resource-manager/reference/js-api/functions/$armCommonTypesVersion.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-resource-manager/reference/js-api/functions/$armLibraryNamespace.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-resource-manager/reference/js-api/functions/$armProviderNameValue.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-resource-manager/reference/js-api/functions/$armProviderNamespace.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-resource-manager/reference/js-api/functions/$armRenameListByOperation.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-resource-manager/reference/js-api/functions/$armResourceAction.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-resource-manager/reference/js-api/functions/$armResourceCollectionAction.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-resource-manager/reference/js-api/functions/$armResourceCreateOrUpdate.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-resource-manager/reference/js-api/functions/$armResourceDelete.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-resource-manager/reference/js-api/functions/$armResourceList.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-resource-manager/reference/js-api/functions/$armResourceOperations.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-resource-manager/reference/js-api/functions/$armResourceRead.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-resource-manager/reference/js-api/functions/$armResourceUpdate.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-resource-manager/reference/js-api/functions/$extensionResource.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-resource-manager/reference/js-api/functions/$locationResource.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-resource-manager/reference/js-api/functions/$resourceGroupResource.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-resource-manager/reference/js-api/functions/$singleton.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-resource-manager/reference/js-api/functions/$subscriptionResource.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-resource-manager/reference/js-api/functions/$tenantResource.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-resource-manager/reference/js-api/functions/$useLibraryNamespace.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-resource-manager/reference/js-api/functions/getArmCommonTypesVersion.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-resource-manager/reference/js-api/functions/getArmCommonTypesVersions.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-resource-manager/reference/js-api/functions/getArmProviderNamespace.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-resource-manager/reference/js-api/functions/getArmResource.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-resource-manager/reference/js-api/functions/getArmResourceInfo.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-resource-manager/reference/js-api/functions/getArmResourceKind.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-resource-manager/reference/js-api/functions/getArmResources.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-resource-manager/reference/js-api/functions/getResourceBaseType.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-resource-manager/reference/js-api/functions/getSingletonResourceKey.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-resource-manager/reference/js-api/functions/getUsedLibraryNamespaces.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-resource-manager/reference/js-api/functions/isArmCollectionAction.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-resource-manager/reference/js-api/functions/isArmCommonType.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-resource-manager/reference/js-api/functions/isArmLibraryNamespace.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-resource-manager/reference/js-api/functions/isSingletonResource.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-resource-manager/reference/js-api/functions/resolveResourceBaseType.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-resource-manager/reference/js-api/functions/resolveResourceOperations.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-resource-manager/reference/js-api/index.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-resource-manager/reference/js-api/interfaces/ArmCommonTypeVersions.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-resource-manager/reference/js-api/interfaces/ArmLifecycleOperations.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-resource-manager/reference/js-api/interfaces/ArmResourceDetails.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-resource-manager/reference/js-api/interfaces/ArmResourceDetailsBase.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-resource-manager/reference/js-api/interfaces/ArmResourceOperation.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-resource-manager/reference/js-api/interfaces/ArmResourceOperations.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-resource-manager/reference/js-api/type-aliases/ArmLifecycleOperationKind.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-resource-manager/reference/js-api/type-aliases/ArmOperationKind.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-resource-manager/reference/js-api/type-aliases/ArmResourceKind.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-resource-manager/reference/js-api/variables/$lib.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-resource-manager/reference/js-api/variables/namespace.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-resource-manager/reference/linter.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/azure-resource-manager/rules/unsupported-type.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/decorators.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/index.mdx create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/_category_.json create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/functions/$access.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/functions/$client.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/functions/$clientFormat.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/functions/$convenientAPI.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/functions/$exclude.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/functions/$include.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/functions/$internal.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/functions/$operationGroup.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/functions/$protocolAPI.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/functions/$usage.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/functions/capitalize.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/functions/createDiagnostic.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/functions/createSdkContext.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/functions/createStateSymbol.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/functions/getAccess.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/functions/getAccessOverride.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/functions/getAllModels.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/functions/getClient.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/functions/getClientFormat.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/functions/getClientNamespaceString.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/functions/getClientType.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/functions/getCrossLanguageDefinitionId.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/functions/getDefaultApiVersion.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/functions/getDocHelper.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/functions/getEffectivePayloadType.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/functions/getEmitterTargetName.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/functions/getGeneratedName.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/functions/getLibraryName.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/functions/getOperationGroup.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/functions/getPropertyNames.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/functions/getSdkArrayOrDict.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/functions/getSdkBuiltInType.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/functions/getSdkConstant.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/functions/getSdkDatetimeType.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/functions/getSdkDurationType.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/functions/getSdkEnum.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/functions/getSdkEnumValue.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/functions/getSdkModel.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/functions/getSdkTuple.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/functions/getSdkTypeBaseHelper.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/functions/getSdkUnion.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/functions/getUsage.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/functions/getUsageOverride.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/functions/getWireName.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/functions/intOrFloat.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/functions/isApiVersion.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/functions/isAzureCoreModel.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/functions/isExclude.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/functions/isInOperationGroup.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/functions/isInclude.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/functions/isInternal.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/functions/isOperationGroup.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/functions/isReadOnly.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/functions/isSdkDatetimeEncodings.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/functions/listClients.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/functions/listOperationGroups.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/functions/listOperationsInOperationGroup.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/functions/reportDiagnostic.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/functions/reportUnionUnsupported.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/functions/shouldGenerateConvenient.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/functions/shouldGenerateProtocol.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/index.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/interfaces/SdkArrayType.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/interfaces/SdkBodyModelPropertyType.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/interfaces/SdkBuiltInType.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/interfaces/SdkClient.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/interfaces/SdkConstantType.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/interfaces/SdkContext.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/interfaces/SdkDatetimeType.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/interfaces/SdkDictionaryType.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/interfaces/SdkDurationType.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/interfaces/SdkEmitterOptions.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/interfaces/SdkEnumType.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/interfaces/SdkEnumValueType.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/interfaces/SdkModelPropertyTypeBase.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/interfaces/SdkModelType.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/interfaces/SdkOperationGroup.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/interfaces/SdkTupleType.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/interfaces/SdkUnionType.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/type-aliases/AccessFlags.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/type-aliases/ClientFormat.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/type-aliases/SdkBuiltInKinds.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/type-aliases/SdkModelPropertyType.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/type-aliases/SdkOperation.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/type-aliases/SdkParameterImplementation.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/type-aliases/SdkParameterLocation.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/type-aliases/SdkType.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/type-aliases/SdkValidation.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/variables/$lib.md create mode 100644 packages/website/versioned_docs/version-latest/libraries/typespec-client-generator-core/reference/js-api/variables/namespace.md create mode 100644 packages/website/versioned_docs/version-latest/reference/arm/index.md create mode 100644 packages/website/versioned_docs/version-latest/reference/azure-style-guide.md create mode 100644 packages/website/versioned_docs/version-latest/reference/azure.core/index.md create mode 100644 packages/website/versioned_docs/version-latest/release-notes/cadl-typespec-migration.md create mode 100644 packages/website/versioned_docs/version-latest/release-notes/release-2022-07-08.md create mode 100644 packages/website/versioned_docs/version-latest/release-notes/release-2022-08-10.md create mode 100644 packages/website/versioned_docs/version-latest/release-notes/release-2022-09-07.md create mode 100644 packages/website/versioned_docs/version-latest/release-notes/release-2022-10-12.md create mode 100644 packages/website/versioned_docs/version-latest/release-notes/release-2022-11-11.md create mode 100644 packages/website/versioned_docs/version-latest/release-notes/release-2022-12-07.md create mode 100644 packages/website/versioned_docs/version-latest/release-notes/release-2023-01-12.md create mode 100644 packages/website/versioned_docs/version-latest/release-notes/release-2023-02-07.md create mode 100644 packages/website/versioned_docs/version-latest/release-notes/release-2023-03-13.md create mode 100644 packages/website/versioned_docs/version-latest/release-notes/release-2023-04-11.md create mode 100644 packages/website/versioned_docs/version-latest/release-notes/release-2023-05-10.md create mode 100644 packages/website/versioned_docs/version-latest/release-notes/release-2023-06-06.md create mode 100644 packages/website/versioned_docs/version-latest/release-notes/release-2023-07-11.md create mode 100644 packages/website/versioned_docs/version-latest/release-notes/release-2023-08-08.md create mode 100644 packages/website/versioned_docs/version-latest/release-notes/release-2023-09-12.md create mode 100644 packages/website/versioned_docs/version-latest/release-notes/release-2023-10-11.md create mode 100644 packages/website/versioned_docs/version-latest/release-notes/release-2023-11-07.md create mode 100644 packages/website/versioned_docs/version-latest/release-notes/release-2023-12-06.md create mode 100644 packages/website/versioned_docs/version-latest/troubleshoot/arm-proxy-operations-error.md create mode 100644 packages/website/versioned_docs/version-latest/troubleshoot/sdl.md create mode 100644 packages/website/versioned_docs/version-latest/troubleshoot/suppresswarnings.md create mode 100644 packages/website/versioned_docs/version-latest/troubleshoot/troubleshoot_template create mode 100644 packages/website/versioned_docs/version-latest/troubleshoot/typespec-providerhub-controller-warning-nu1605.md create mode 100644 packages/website/versioned_docs/version-latest/typespec-getting-started.md create mode 100644 packages/website/versioned_sidebars/version-latest-sidebars.json create mode 100644 packages/website/versions.json create mode 100644 rush.json create mode 100644 tsconfig.json diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000000..1e95d629b4 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,16 @@ +root = true + +[*] +indent_size = 2 +indent_style = space +end_of_line = lf +insert_final_newline = true +charset = utf-8 + +[*.cs] +indent_size = 4 + +[/packages/samples/**/generated/**] +generated_code = true +[/packages/samples/**/output/**] +generated_code = true diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000000..8d95188fc4 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,19 @@ +# Don't allow people to merge changes to these generated files, because the result +# may be invalid. You need to run "rush update" again. Also make GitHub collapse +# the diff by default for generated files. +pnpm-lock.yaml merge=binary linguist-generated=true +shrinkwrap.yaml merge=binary linguist-generated=true +npm-shrinkwrap.json merge=binary linguist-generated=true +yarn.lock merge=binary linguist-generated=true +common/config/rush/repo-state.json merge=binary linguist-generated=true + +# docs/spec.html is also generated and not worth resolving line by line or +# reviewing or having its diff uncollpased on GitHub. On conflict, pick either +# side and rebuild to regenerate. +docs/spec.html merge=binary linguist-generated=true + +# Use unix line endings always, even on Windows +* text=auto eol=lf + +# Allow comments in JSON in GitHub rendering +*.json linguist-language=JSON-with-Comments diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 0000000000..1cf4891e0f --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1,5 @@ +* @bterlson @daviwil @markcowl @allenjzhang @timotheeguerin + +/packages/typespec-client-generator-core @lmazuel @m-nash @iscai-msft @srnagar @joheredi + +/docs/howtos/DataPlane*/ @lmazuel @m-nash @iscai-msft @srnagar @joheredi diff --git a/.github/ISSUE_TEMPLATE/0_general.md b/.github/ISSUE_TEMPLATE/0_general.md new file mode 100644 index 0000000000..187f544395 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/0_general.md @@ -0,0 +1,4 @@ +--- +name: TypeSpec Azure general issue +about: for general TypeSpec Azure issue. +--- diff --git a/.github/ISSUE_TEMPLATE/breaking-change-form.md b/.github/ISSUE_TEMPLATE/breaking-change-form.md new file mode 100644 index 0000000000..9915254960 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/breaking-change-form.md @@ -0,0 +1,31 @@ +--- +name: Breaking Change Review Form +about: Requesting Breaking Change Review for TypeSpec Azure features +title: "[Breaking Change Review] {title} " +labels: Breaking Change Review +--- + +**Describe the breaking change** +A clear and concise description of what the proposed change is. + +**Back-compat design to avoid immediate breaking** +Any back-compat design: + +**Link to detailed breaking design** +Link: + +**Impact** +This change affecting: + +- [ ] ARM +- [ ] Data-plane +- [ ] Existing specs: approx. # of service/spec impacted +- [ ] New specs +- [ ] Emitters +- [ ] SDK + +**Targeted Sprint** +Sprint: + +**Additional information** +Add any other information about the change including fixes for here. diff --git a/.github/ISSUE_TEMPLATE/bug-report.md b/.github/ISSUE_TEMPLATE/bug-report.md new file mode 100644 index 0000000000..80a0fe9418 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug-report.md @@ -0,0 +1,19 @@ +--- +name: Bug Report +about: Report bugs or unexpected behaviors of TypeSpec Azure +title: "[Bug] {Bug title} " +labels: bug +assignees: "" +--- + +**Describe the bug** +A clear and concise description of what the bug is. + +**To Reproduce** +Steps to reproduce the behavior: + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Additional context** +Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/feature-request.md b/.github/ISSUE_TEMPLATE/feature-request.md new file mode 100644 index 0000000000..60ffb1305a --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature-request.md @@ -0,0 +1,18 @@ +--- +name: Feature Request +about: Request TypeSpec Azure features +title: "[Feature Request] {Title} " +assignees: "" +--- + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context or screenshots about the feature request here. diff --git a/.github/ISSUE_TEMPLATE/onboarding-request.md b/.github/ISSUE_TEMPLATE/onboarding-request.md new file mode 100644 index 0000000000..e8369bffc0 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/onboarding-request.md @@ -0,0 +1,40 @@ +--- +name: Onboarding request +about: One time onboarding form to help TypeSpec team to provide better support. +title: "[Onboarding] {ProviderName} {ARM|Data-plane} " +labels: onboarding +assignees: "" +--- + +**Please update issue title with provider name and select ARM or Data-plane.** + +--- + +**Service Team Contacts** +Dev: +PM: + +**Tell us what stage you are currently at with TypeSpec for your API definition** + +- [ ] Just heard about TypeSpec, tell me more. +- [ ] Started modeling with TypeSpec. +- [ ] Dogfooding with TypeSpec. +- [ ] Going Private Preview with TypeSpec. +- [ ] Going for Public Preview with TypeSpec. +- [ ] We are live. + +**What's your next milestone ** + +1. Milestone: Private Preview | Public Preview + +- Target Date: + +2. Milestone: Private Preview | Public Preview + +- Target Date: + +**Link to your repo if available** +[Repo Link](...) + +**Additional notes or questions** +Add any other context or questions here. diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000000..a35170671d --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,17 @@ +# To get started with Dependabot version updates, you'll need to specify which +# package ecosystems to update and where the package manifests are located. +# Please see the documentation for all configuration options: +# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates + +version: 2 +updates: + - package-ecosystem: "gitsubmodule" + directory: "/" + schedule: + interval: "daily" + + # Auto update the cadl-ranch-specs version used for e2e tests. It is pinned instead of always using the latest so we don't have a failure showing in random PRs blocking the flow. + - package-ecosystem: "npm" + directory: "/packages/e2e-tests/cadl-ranch-specs" + schedule: + interval: "daily" diff --git a/.github/policies/issues.add-labels.yml b/.github/policies/issues.add-labels.yml new file mode 100644 index 0000000000..2786032cb4 --- /dev/null +++ b/.github/policies/issues.add-labels.yml @@ -0,0 +1,47 @@ +id: +name: New Issue Assign labels +description: Assign labels to new issues +owner: +resource: repository +disabled: false +where: +configuration: + resourceManagementConfiguration: + scheduledSearches: [] + eventResponderTasks: + - description: Adds `needs-triage` label for new unassigned issues + if: + - payloadType: Issues + - isAction: + action: Opened + - and: + - not: + and: + - isAssignedToSomeone + then: + - addLabel: + label: needs-triage + + - description: Adds `needs-triage` label for new issues reported by non contributors + if: + - payloadType: Issues + - isAction: + action: Opened + - and: + - not: + activitySenderHasPermission: + permission: Write + - not: + activitySenderHasAssociation: + association: Member + - not: + activitySenderHasAssociation: + association: Collaborator + - not: + activitySenderHasPermission: + permission: Admin + then: + - addLabel: + label: customer-reported +onFailure: +onSuccess: diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml new file mode 100644 index 0000000000..6f749caff8 --- /dev/null +++ b/.github/workflows/codeql.yml @@ -0,0 +1,69 @@ +name: "CodeQL" + +on: + push: + branches: ["main", "release/*"] + pull_request: + branches: ["main", "release/*"] + schedule: + - cron: "30 3 * * 3" + +jobs: + analyze: + name: Analyze + # Runner size impacts CodeQL analysis time. To learn more, please see: + # - https://gh.io/recommended-hardware-resources-for-running-codeql + # - https://gh.io/supported-runners-and-hardware-resources + # - https://gh.io/using-larger-runners + # Consider using larger runners for possible analysis time improvements. + runs-on: ${{ (matrix.language == 'swift' && 'macos-latest') || 'ubuntu-latest' }} + timeout-minutes: ${{ (matrix.language == 'swift' && 120) || 360 }} + permissions: + actions: read + contents: read + security-events: write + + strategy: + fail-fast: false + matrix: + language: ["javascript-typescript"] + # CodeQL supports [ 'c-cpp', 'csharp', 'go', 'java-kotlin', 'javascript-typescript', 'python', 'ruby', 'swift' ] + # Use only 'java-kotlin' to analyze code written in Java, Kotlin or both + # Use only 'javascript-typescript' to analyze code written in JavaScript, TypeScript or both + # Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@v2 + with: + languages: ${{ matrix.language }} + # If you wish to specify custom queries, you can do so here or in a config file. + # By default, queries listed here will override any specified in a config file. + # Prefix the list here with "+" to use these queries and those in the config file. + + # For more details on CodeQL's query packs, refer to: https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs + # queries: security-extended,security-and-quality + + # Autobuild attempts to build any compiled languages (C/C++, C#, Go, Java, or Swift). + # If this step fails, then you should remove it and run the build manually (see below) + - name: Autobuild + uses: github/codeql-action/autobuild@v2 + + # ℹ️ Command-line programs to run using the OS shell. + # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun + + # If the Autobuild fails above, remove it and uncomment the following three lines. + # modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance. + + # - run: | + # echo "Run, Build Application using script" + # ./location_of_script_within_repo/buildscript.sh + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v2 + with: + category: "/language:${{matrix.language}}" diff --git a/.github/workflows/merge-release-in-main.yml b/.github/workflows/merge-release-in-main.yml new file mode 100644 index 0000000000..0e284463ef --- /dev/null +++ b/.github/workflows/merge-release-in-main.yml @@ -0,0 +1,48 @@ +name: Merge release branch back into main + +on: + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + push: + branches: + - "release/*" + +concurrency: ${{ github.workflow }}-${{ github.ref }} + +# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages +permissions: + id-token: write + contents: write + pull-requests: write + +jobs: + # Create PR + create: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Generate branch name + id: branchname + run: | + echo "::set-output name=branchname::backmerge/${{ github.ref_name }}-$(date +'%Y-%m-%d')" + - name: Create branch + run: | + branch="${{ steps.branchname.outputs.branchname }}" + git checkout -b $branch + git push --set-upstream origin $branch --force + + # --- + # Unfortunately, this step is no longer possible due to security constraints. + # User will have to create the PR manually until we can get a way to create a PR here. + # --- + #- name: create pull request + # id: open-pr + # uses: repo-sync/pull-request@v2 + # with: + # github_token: ${{ secrets.GITHUB_TOKEN }} + # source_branch: ${{ steps.branchname.outputs.branchname }} + # destination_branch: ${{ github.event.repository.default_branch }} + # pr_title: "[Automated] Merge ${{ github.ref_name }} into ${{ github.event.repository.default_branch }}" + # pr_body: "Merge ${{github.ref}} back into ${{ github.event.repository.default_branch }}" diff --git a/.github/workflows/website-gh-pages.yml b/.github/workflows/website-gh-pages.yml new file mode 100644 index 0000000000..7b94d3db07 --- /dev/null +++ b/.github/workflows/website-gh-pages.yml @@ -0,0 +1,61 @@ +name: Deploy TypeSpec Website to github pages + +on: + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: {} + # Deploy on push to main + push: + branches: + - main + +# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages +permissions: + contents: read + pages: write + id-token: write + +# Allow one concurrent deployment +concurrency: + group: "pages" + cancel-in-progress: true + +jobs: + # Build job + build: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + submodules: recursive + + - name: Use Node.js node 18.x + uses: actions/setup-node@v3 + with: + node-version: 18.x + + - name: Install dependencies + run: node common/scripts/install-run-rush.js update + + - name: Build + run: node common/scripts/install-run-rush.js build --to @azure-tools/typespec-azure-website -v + env: + TYPESPEC_WEBSITE_BASE_PATH: "/typespec-azure/" + NODE_OPTIONS: "--max_old_space_size=4096" + + - name: Upload artifact + uses: actions/upload-pages-artifact@v1 + with: + path: ./packages/website/build + + # Deployment job + deploy: + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-latest + needs: build + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v1 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000..e84d8619ca --- /dev/null +++ b/.gitignore @@ -0,0 +1,204 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +dist-dev/ +downloads/ +eggs/ +.eggs/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +.hypothesis/ +.pytest_cache/ +test-results.xml +xunit.xml + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# pyenv +.python-version + +# celery beat schedule file +celerybeat-schedule + +# SageMath parsed files +*.sage.py + +# Environments +/.env +.env.local +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +node_modules/ +package-lock.json +report.xml +*.tgz + +# Logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Runtime data +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# next.js build output +.next + +# Common toolchain intermediate files +temp + +# Rush files +common/temp/** +package-deps.json + +# Default TypeSpec output +tsp-output/ + +# Visual Studio / C# +bin/ +obj/ +.vs/ +*.binlog +*.user + +# JetBrains Rider +.idea/ + +# tsc incremental build files +*.tsbuildinfo + +*.vsix +*.zip + +# template generated post action files +packages/samples/test/output/azure/templates-contoso/setup.* + +.apitest/ + +# MacOS +.DS_Store + +# JetBrains Rider +.idea/ + +docs/**/js-api/ diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000000..f41500661f --- /dev/null +++ b/.gitmodules @@ -0,0 +1,4 @@ +[submodule "core"] + path = core + url = https://github.com/microsoft/typespec + branch = main diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000000..889a4e8e24 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,58 @@ +**/dist/ +**/dist-dev/ +**/test/output/ +**/bin/ +**/obj/ +**/.vs/ +**/common/temp/ +**/common/scripts/ +**/common/changes/ +**/common/config/rush/pnpm-lock.yaml + +# Coverage report directory +**/coverage/ + +packages/samples/specs/resource-manager/common-types/**/* + +# These are standard and should not be edited +SECURITY.md +CODE_OF_CONDUCT.md + +# These are auto-generated by rush +**/CHANGELOG.md + +# Don't format compiler test typespec files. +core/packages/compiler/test/formatter/**/*.tsp + +# That is an example with error and can't be formatted +core/packages/samples/specs/local-typespec/test.tsp + +# Don't check format website generated files. +core/packages/website/.docusaurus/ +core/packages/website/build/ +core/packages/website/versioned_sidebars/ +core/packages/website/versions.json +packages/website/.docusaurus/ +packages/website/build/ +packages/website/versioned_sidebars/ +packages/website/versions.json + + +# Auto generated reference docs. +docs/**/reference/ +packages/website/versioned_docs/**/reference/ +core/docs/**/reference/ +core/docs/standard-library/built-in-decorators.md +core/docs/standard-library/built-in-data-types.md +core/packages/website/versioned_docs/**/reference/ +core/packages/website/versioned_docs/**/standard-library/built-in-decorators.md +core/packages/website/versioned_docs/**/standard-library/built-in-data-types.md + +# Auto generated version list +packages/website/playground-versions.json +core/packages/website/playground-versions.json + +core/eng/feeds/ + +# TypeSpec init template +eng/feeds/ diff --git a/.prettierrc.json b/.prettierrc.json new file mode 100644 index 0000000000..beeb19d443 --- /dev/null +++ b/.prettierrc.json @@ -0,0 +1,22 @@ +{ + "arrowParens": "always", + "trailingComma": "es5", + "bracketSpacing": true, + "endOfLine": "lf", + "printWidth": 100, + "semi": true, + "singleQuote": false, + "tabWidth": 2, + "plugins": [ + "./core/packages/prettier-plugin-typespec/dist/index.js", + "./core/packages/compiler/node_modules/prettier-plugin-organize-imports/index.js" + ], + "overrides": [ + { + "files": "*.tsp", + "options": { + "parser": "typespec" + } + } + ] +} diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000000..c512900eb3 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,8 @@ +{ + "recommendations": [ + "dbaeumer.vscode-eslint", + "esbenp.prettier-vscode", + "streetsidesoftware.code-spell-checker", + "hbenl.vscode-mocha-test-adapter" + ] +} diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000000..38be33af4c --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,246 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Python: Current File", + "type": "python", + "request": "launch", + "program": "${file}", + "args": [], + "console": "integratedTerminal", + "justMyCode": true + }, + { + "type": "node", + "request": "attach", + "name": "Attach to Default Port", + "port": 9229, + "smartStep": true, + "sourceMaps": true, + "skipFiles": ["/**/*.js"], + "outFiles": [ + "${workspaceFolder}/packages/*/dist/**/*.js", + "${workspaceFolder}/packages/*/dist-dev/**/*.js", + "${workspaceFolder}/core/packages/*/dist/**/*.js", + "${workspaceFolder}/core/packages/*/dist-dev/**/*.js" + ], + "presentation": { + "order": 999 + } + }, + { + "type": "pwa-node", + "request": "attach", + "name": "Tests", + "port": 9229, + "smartStep": true, + "sourceMaps": true, + "continueOnAttach": true, + "skipFiles": [ + "/**/*.js", + "**/.vscode/extensions/hbenl.vscode-mocha-test-adapter-*/**.js" + ], + "outFiles": [ + "${workspaceFolder}/packages/*/dist/**/*.js", + "${workspaceFolder}/packages/*/dist-dev/**/*.js", + "${workspaceFolder}/core/packages/*/dist/**/*.js", + "${workspaceFolder}/core/packages/*/dist-dev/**/*.js" + ], + "presentation": { + "hidden": true + } + }, + { + "name": "Attach to Language Server", + "type": "node", + "request": "attach", + "port": 4242, + "restart": { + "delay": 100, + "maxAttempts": 10 + }, + "continueOnAttach": true, + "smartStep": true, + "sourceMaps": true, + "skipFiles": ["/**/*.js"], + "outFiles": [ + "${workspaceFolder}/packages/*/dist/**/*.js", + "${workspaceFolder}/packages/*/dist-dev/**/*.js", + "${workspaceFolder}/core/packages/*/dist/**/*.js", + "${workspaceFolder}/core/packages/*/dist-dev/**/*.js" + ], + "timeout": 60000, + "presentation": { + "order": 999 + } + }, + { + "type": "node", + "request": "launch", + "name": "Compile Scratch (core)", + "program": "${workspaceRoot}/core/packages/compiler/entrypoints/cli.js", + "args": [ + "compile", + "../samples/scratch", + "--output-dir=../samples/scratch/tsp-output", + "--emit=@typespec/openapi3" + ], + "smartStep": true, + "sourceMaps": true, + "skipFiles": ["/**/*.js"], + "outFiles": [ + "${workspaceFolder}/packages/*/dist/**/*.js", + "${workspaceFolder}/packages/*/dist-dev/**/*.js", + "${workspaceFolder}/core/packages/*/dist/**/*.js", + "${workspaceFolder}/core/packages/*/dist-dev/**/*.js" + ], + "cwd": "${workspaceRoot}/core/packages/compiler", + "presentation": { + "order": 2 + } + }, + { + "type": "node", + "request": "launch", + "name": "Test TypeSpec init Azure (core)", + "program": "${workspaceRoot}/core/packages/compiler/entrypoints/cli.js", + "args": ["init", "${input:initTemplate}"], + "smartStep": true, + "sourceMaps": true, + "cwd": "${workspaceRoot}/eng/feeds/scratch", + "console": "integratedTerminal", + "presentation": { + "order": 2 + } + }, + { + "type": "node", + "request": "launch", + "name": "Compile Scratch (core - nostdlib)", + "program": "${workspaceRoot}/core/packages/compiler/entrypoints/cli.js", + "args": ["compile", "../samples/scratch", "--output-dir=temp/scratch-output", "--nostdlib"], + "smartStep": true, + "sourceMaps": true, + "skipFiles": ["/**/*.js"], + "outFiles": [ + "${workspaceFolder}/packages/*/dist/**/*.js", + "${workspaceFolder}/packages/*/dist-dev/**/*.js", + "${workspaceFolder}/core/packages/*/dist/**/*.js", + "${workspaceFolder}/core/packages/*/dist-dev/**/*.js" + ], + "cwd": "${workspaceRoot}/core/packages/compiler", + "presentation": { + "order": 2 + } + }, + { + "type": "node", + "request": "launch", + "name": "Compile Scratch", + "program": "${workspaceRoot}/core/packages/compiler/entrypoints/cli.js", + "args": ["compile", ".", "--emit=@azure-tools/typespec-autorest"], + "smartStep": true, + "sourceMaps": true, + "skipFiles": ["/**/*.js"], + "outFiles": [ + "${workspaceFolder}/packages/*/dist/**/*.js", + "${workspaceFolder}/packages/*/dist-dev/**/*.js", + "${workspaceFolder}/core/packages/*/dist/**/*.js", + "${workspaceFolder}/core/packages/*/dist-dev/**/*.js" + ], + "cwd": "${workspaceRoot}/packages/samples/scratch", + "presentation": { + "order": 2 + } + }, + { + "name": "Regenerate .tmlanguage", + "type": "node", + "program": "${workspaceRoot}/core/packages/typespec-vscode/scripts/generate-tmlanguage.js", + "request": "launch", + "skipFiles": ["/**/*.js"], + "outFiles": [ + "${workspaceFolder}/packages/*/dist/**/*.js", + "${workspaceFolder}/packages/*/dist-dev/**/*.js", + "${workspaceFolder}/core/packages/*/dist/**/*.js", + "${workspaceFolder}/core/packages/*/dist-dev/**/*.js" + ], + "cwd": "${workspaceRoot}/packages/typespec-vscode", + "presentation": { + "order": 999 + } + }, + { + "name": "e2e Tests", + "type": "node", + "program": "${workspaceRoot}/packages/e2e-tests/e2e-tests.mjs", + "request": "launch", + "skipFiles": ["/**/*.js"], + "outFiles": [ + "${workspaceFolder}/packages/*/dist/**/*.js", + "${workspaceFolder}/packages/*/dist-dev/**/*.js", + "${workspaceFolder}/core/packages/*/dist/**/*.js", + "${workspaceFolder}/core/packages/*/dist-dev/**/*.js" + ], + "cwd": "${workspaceRoot}", + "presentation": { + "order": 999 + } + }, + { + "name": "VS Code Extension (Client)", + "type": "extensionHost", + "request": "launch", + "args": ["--extensionDevelopmentPath=${workspaceRoot}/core/packages/typespec-vscode"], + "skipFiles": ["/**/*.js"], + "outFiles": [ + "${workspaceFolder}/packages/*/dist/**/*.js", + "${workspaceFolder}/packages/*/dist-dev/**/*.js", + "${workspaceFolder}/core/packages/*/dist/**/*.js", + "${workspaceFolder}/core/packages/*/dist-dev/**/*.js" + ], + "env": { + "TYPESPEC_DEVELOPMENT_MODE": "true", + "TYPESPEC_SERVER_NODE_OPTIONS": "--nolazy --inspect-brk=4242" + }, + "presentation": { + "hidden": true + } + }, + { + "type": "node", + "request": "launch", + "name": "Debug Docs Generation", + "program": "${workspaceRoot}/core/packages/tspd/cmd/tspd.js", + "args": [ + "doc", + "${workspaceFolder}/packages/typespec-azure-resource-manager", + "--enable-experimental", + "--output-dir=../../docs/libraries/azure-resource-manager/reference" + ], + "smartStep": true, + "sourceMaps": true, + "skipFiles": ["/**/*.js"] + } + ], + "compounds": [ + { + "name": "VS Code Extension", + "configurations": ["VS Code Extension (Client)", "Attach to Language Server"], + "presentation": { + "order": 1 + } + } + ], + "inputs": [ + { + "id": "initTemplate", + "type": "promptString", + "default": "${workspaceRoot}/eng/feeds/azure-scaffolding.json", + "description": "The init template to use" + } + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000000..41bc347795 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,83 @@ +{ + "files.eol": "\n", + "files.insertFinalNewline": true, + "search.exclude": { + "**/dist/**": true, + "**/dist-dev/**": true, + "**/CHANGELOG.json": true, + "docs/spec.html": true, + "**/bin/**": true, + "**/node_modules/**": true, + "packages/website/versioned_docs/**": true, + "core/packages/website/versioned_docs/**": true + }, + "files.exclude": { + "**/common/temp/**": true, + "**/obj/**": true, + "**/.git": true, + "**/.DS_Store": true + }, + "[javascript][javascriptreact][typescript][typescriptreact]": { + "editor.formatOnSave": true, + "editor.formatOnPaste": false, // work around https://github.com/simonhaenisch/prettier-plugin-organize-imports/issues/53 + "editor.insertSpaces": true, + "editor.tabSize": 2, + "editor.detectIndentation": false, + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[json][[jsonc][yaml][typespec][markdown][css]": { + "editor.formatOnSave": true, + "editor.formatOnPaste": true, + "editor.insertSpaces": true, + "editor.tabSize": 2, + "editor.detectIndentation": false, + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[csharp]": { + "editor.insertSpaces": true, + "editor.detectIndentation": false, + "editor.tabSize": 4 + }, + "[xml]": { + "editor.insertSpaces": true, + "editor.detectIndentation": false, + "editor.tabSize": 2 + }, + "files.associations": { + "rush.json": "jsonc", + "common-versions.json": "jsonc", + "command-line.json": "jsonc", + "pnpm-config.json": "jsonc", + "version-policies.json": "jsonc" + }, + "typescript.tsdk": "./core/packages/compiler/node_modules/typescript/lib", + "git.ignoreLimitWarning": true, + "testExplorer.useNativeTesting": true, + "mochaExplorer.parallel": false, + "mochaExplorer.files": [ + "./core/packages/*/dist/test/**/*.test.js", + "./core/packages/*/test/**/*.test.js", + "./packages/*/dist/test/**/*.test.js", + "./packages/*/test/**/*.test.js" + ], + "mochaExplorer.ignore": [ + "./core/packages/*/dist/test/manual/**/*.js", + "./packages/*/dist/test/manual/**/*.js" + ], + "mochaExplorer.mochaPath": "./core/packages/compiler/node_modules/mocha", + "mochaExplorer.timeout": 500000, + "mochaExplorer.require": "source-map-support/register", + "mochaExplorer.debuggerConfig": "Tests", + "mochaExplorer.env": { + "TYPESPEC_VERBOSE_TEST_OUTPUT": "true", + "NODE_OPTIONS": "--stack-trace-limit=50" + }, + "prettier.configPath": ".prettierrc.json", + "prettier.ignorePath": ".prettierignore", + "prettier.prettierPath": "./core/packages/compiler/node_modules/prettier/index.cjs", + "prettier.documentSelectors": ["**/*.tsp"], + "testExplorer.errorDecoration": false, + "typespec.tsp-server.path": "${workspaceRoot}/core/packages/compiler", + "cSpell.words": ["autorest", "typespec"], + "dotnet.defaultSolution": "disable" +} diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000000..b4c121aead --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,106 @@ +{ + // See https://go.microsoft.com/fwlink/?LinkId=733558 + // for the documentation about the tasks.json format + "version": "2.0.0", + "tasks": [ + { + "label": "watch", + "dependsOn": ["watch-tmlanguage", "watch-spec", "watch-source"], + "dependsOrder": "parallel", + "group": { + "kind": "build", + "isDefault": true + } + }, + { + "label": "watch-source", + "type": "process", + "command": "node", + "args": [ + "${workspaceFolder}/core/packages/compiler/node_modules/typescript/lib/tsc.js", + "--build", + "--watch" + ], + "isBackground": true, + "problemMatcher": "$tsc-watch", + "presentation": { + "echo": true, + "reveal": "always", + "focus": false, + "panel": "dedicated", + "showReuseMessage": false, + "clear": true + } + }, + { + "label": "watch-tmlanguage", + "type": "process", + "command": "node", + "args": ["${workspaceFolder}/core/packages/compiler/scripts/watch-tmlanguage.js"], + "problemMatcher": { + "base": "$msCompile", + "background": { + "activeOnStart": true, + "beginsPattern": "^.*File change detected.*$", + "endsPattern": "^.*Waiting for file changes.*$" + } + }, + "isBackground": true, + "options": { + "cwd": "${workspaceFolder}/core/packages/compiler" + }, + "presentation": { + "echo": true, + "reveal": "always", + "focus": false, + "panel": "dedicated", + "showReuseMessage": false, + "clear": true + } + }, + { + "label": "watch-spec", + "type": "process", + "command": "node", + "args": ["${workspaceFolder}/core/packages/spec/scripts/watch-spec.js"], + "problemMatcher": { + "base": "$msCompile", + "background": { + "activeOnStart": true, + "beginsPattern": "^.*File change detected.*$", + "endsPattern": "^.*Waiting for file changes.*$" + } + }, + "isBackground": true, + "options": { + "cwd": "${workspaceFolder}/core/packages/spec" + }, + "presentation": { + "echo": true, + "reveal": "always", + "focus": false, + "panel": "dedicated", + "showReuseMessage": false, + "clear": true + } + }, + { + "label": "test", + "type": "process", + "command": "node", + "args": ["${workspaceFolder}/eng/scripts/npm-run.js", "test"], + "group": { + "kind": "test", + "isDefault": true + }, + "presentation": { + "echo": true, + "reveal": "always", + "focus": false, + "panel": "shared", + "showReuseMessage": false, + "clear": true + } + } + ] +} diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000000..a8b2cc7c5e --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,247 @@ +# Common contributing steps + +Most of the steps for working in this repo are the same as those for working +in https://github.com/microsoft/typespec. Refer to +https://github.com/microsoft/typespec/blob/main/CONTRIBUTING.md for most common +day-to-day operations. The rest of this document only covers the things that +are unique to this repo. + +# Testing a change in repo azure-rest-api-specs + +If you are proposing a change that is likely to impact existing specs, it's +recommended to test a private of the change before merging. + +1. Create a fork of https://github.com/azure/azure-rest-api-specs + (if you don't already have one) +2. Create a branch from `main` you will use to create the test PR +3. Find the URL of the private build of your test package(s) + 1. Browse to your PR in repo `microsoft/typespec` or `azure/typespec-azure` + 2. Select the "Checks" tab, the "Verify PR" pipeline, then click "View more + details on Azure Pipelines" + 3. Click the link "# published" which shows the artifacts published by the + build + 4. Expand "packages", find the package you need to test, click the three + vertical dots on the selected line, then "Copy download URL". +4. In your branch of `azure-rest-api-specs`, edit the root `package.json`, and + replace the version with the URL to your private build, for example: + + ```diff + - "@azure-tools/typespec-autorest": "0.36.0", + + "@azure-tools/typespec-autorest": "https://.../package.tgz" + ``` + +5. Also edit `eng/pipelines/templates/steps/npm-install.yml`, to force install + your private build: + + ```diff + - - script: npm ci + + - script: npm i --no-package-lock --force + ``` + +6. Create a draft PR from your fork branch. +7. In a few minutes, view the results of check "TypeSpec Validation - All". + - If the check is green, it means your change did not impact any specs currently + in `azure-rest-api-specs/main`. + - If the check is red, click through to the DevOps log to see why each spec failed + (e.g. violation of new linter rule, change to generated autorest), and determine + the course of action. + +Example: https://github.com/Azure/azure-rest-api-specs/pull/26684 + +# Working with the core submodule + +This repository uses a git +[submodule](https://git-scm.com/book/en/v2/Git-Tools-Submodules) for the +[TypeSpec OSS core](https://github.com/microsoft/typespec). + +This section covers some basic everyday tasks for working with it. The steps +below are are really just one possible workflow. There's more than one way +to accomplish these tasks and if you prefer to do it differently, that's +fine too! + +## Configuring git to recurse submodules automatically for most commands + +Run the following command: + +``` +git config --global submodule.recurse true +``` + +This will effectively pass `--recurse-submodules` for you to git commands +that accept it. It should eliminate some of the common pain points around +submodules. + +NOTE: git clone is exceptional, see below. + +## Cloning recursively + +`git clone` does not recurse submodules automatically, even with +submodule.recurse=true as configured above. + +Fork the repo, then clone recursively as follows: + +``` +git clone --recurse-submodules https://github.com/(your_username)/typespec-azure +``` + +## Updating and initializing the submodule + +In some situations, even with the above setting, you may still end up with the core/ folder +being uninitialized and not having a good clone of microsoft/typespec, or with the core/ folder +initialized, but checked out to the wrong commit for the current branch. To fix this, run the +following command to update and initialize the submodule: + +``` +git submodule update --init +``` + +## Point the submodule origin remote to your fork + +You can change the remotes of the submodule so that `origin` is your fork of +microsoft/typespec rather than microsoft/typespec itself, and microsoft/typespec is +`upstream`: + +``` +cd [repo_root] +cd core +git remote remove origin +git remote add origin https://github.com/(your_username)/typespec +git remote add upstream https://github.com/microsoft/typespec +``` + +## Forcing dependabot to send a submodule update PR + +Normally, the submodule is updated automatically once per day (except on +weekends) by automated PRs from dependabot. If you would like dependabot to +perform an update right away, you can: + +- Go here: https://github.com/Azure/typespec-azure/network/updates +- Click on "Last updated X hours ago" link +- Click on "Check for updates button" + +## Making a cross-cutting change across both repos + +1. Make matching branches: + +``` +cd core +git checkout -b featurebranch + +cd .. +git checkout -b featurebranch +``` + +2. Make your changes as needed to both repos. + +3. Commit changes to both repos: + +``` +cd core +git commit -a -m "Core part of my change" + +cd .. +git commit -a -m "Azure-specific part of my change" +``` + +4. Push + +``` +git push origin featurebranch +``` + +NOTE: If you configured submodule.recurse=true as shown above, this will +automatically push the submodule typespec branch along with the typespec-azure +branch. If you prefer not to use that, then `cd core` and push that too. + +5. Create 2 PRs from the two branches that were pushed to your + microsoft/typespec and Azure/typespec-azure forks. Start with the microsoft/typespec + PR, then follow up with the Azure/typespec-azure PR that depends on it. + +6. Get approval for both PRs before merging either of them. + +7. Merge the microsoft/typespec PR first. + +8. Update the submodule to point to the actual commit you merged to microsoft/typespec main: + +``` +cd core +git fetch --all +git checkout upstream/main + +cd .. +git commit -a -m "Update submodule" +git push origin featurebranch +``` + +9. Merge the typespec-azure PR and you're done. + +Note that you only need to do all of the above when your changes span both +repos. If you are only changing one repo or the other, then just work in +each individual repo as you would any other. + +## E2E tests + +### Run tests same as the ci: + +```bash +rush e2e-tests + +``` + +### Test with local cadl-ranch repo + +```bash +rush e2e-tests --local-cadl-ranch= # where path is the absolute path to your local cadl-ranch repo. +# Example +rush e2e-tests --local-cadl-ranch=/Users/some/dev/cadl-ranch +``` + +## Publishing + +Do the following to publish a new release: + +1. Announce to coworkers on Teams in TypeSpec Engineering channel that you will + be publishing and that they should hold off on merging until the process + is complete. + +2. Make sure your working copy is clean and you are up-to-date and on the + main branch. + +3. Run `rush prepare-publish` to stage the publishing changes. + +If it works you'll get a message like this: + +``` +Success! Push publish/kvd01q9v branches and send PRs. +``` + +4. Follow steps 4-9 in [making a cross-cutting change across both + repos](#making-a-cross-cutting-change-across-both-repos) to send PRs from + the generated `publish/` branches and merge them. + +**NOTE**: The reason for step 1 to ask for folks to avoid merging while +publishing is in progress is that any changes merged to the repo while the +publish PR would become part of the release, but the release changelogs +would not include their descriptions. For this reason, publish PRs will fail +if this happens and you will have to close them and start over. In the case +where you are in another time zone and unable to coordinate with the rest of +the team, it may be easier to ask on Teams for someone in a closer time zone +to coordinate and perform the publish in the morning. + +## Make a patch release + +`main` branch always points the latest changes. This means in the case an important bug fix needs to make an earlier release this flow must be followed: + +Depending on the package where the fix needs to go do this on the `Microsoft/typespec` repo or this repo `Azure/typespec-azure` + +1. (only have not done for this sprint yet) Find the commit from the last release and make a new branch called `release/` at that commit. For example `release/october-2022`. Push the branch to `upstream`. +2. Make a new branch with your fix like any other bug fix or new feature +3. Run `rush change` to describe your change +4. Make a new PR from that branch targeting the `release/xyz` branch +5. Wait for CI & approval, then squash merge +6. Make a new branch in this format `publish/hotfix/` +7. Run `rush publish --apply` to bump the versions, commit push, make PR, wait for CI and squash merge. +8. The package should then get published +9. A workflow should run automatically and create a branch named `backmerge/release/xyz-YYYY-MM-DD`. +10. Find the backmerge branch [here](https://github.com/Azure/typespec-azure/branches) and click "New pull request". +11. Rebase merge the new backmerge PR into main. diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000000..21071075c2 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ + MIT License + + Copyright (c) Microsoft Corporation. All rights reserved. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE diff --git a/README.md b/README.md new file mode 100644 index 0000000000..1ec4409ef7 --- /dev/null +++ b/README.md @@ -0,0 +1,60 @@ +# TypeSpec Azure Libraries + +[TypeSpec](https://github.com/microsoft/typespec) is a language for describing cloud +service APIs and generating other API description languages, client and +service code, documentation, and other assets. + +This repository adds common Azure-specific TypeSpec libraries to the +[TypeSpec](https://github.com/microsoft/typespec) core that is pulled in as a git +submodule. + +## Try TypeSpec without installing anything + +You can try TypeSpec on the web without installing anything. +[TypeSpec playground for Azure services](https://cadlplayground.z22.web.core.windows.net/cadl-azure/) + +## Prerequisites + +- Please install Node.js 16 LTS and ensure you are able to run the npm command in a command prompt: `npm --version`. +- It is recommended to have npm 7+. To update npm run `npm install -g npm` + +## Getting Started + +For TypeSpec language documentation, see https://microsoft.github.io/typespec. + +If you are team working on Azure, see TypeSpec Azure development documentation https://azure.github.io/typespec-azure. You should pre-install as well `@azure-tools/typespec-azure-core` to define Azure resources, and `@azure-tools/typespec-autorest` to export in Swagger: + +``` +npm install @typespec/rest @typespec/openapi3 @azure-tools/typespec-azure-core @azure-tools/typespec-autorest +``` + +> If you plan to use the output openapi with autorest or any of the azure sdk tooling _you should use typespec-autorest_, the openapi3 emitter is not going to have any of the ms extensions (pageable, lro, client name, etc.) and so it will be losing information. + +## Build Pipelines + +Information on using TypeSpec within build pipelines [can be found here](./docs/howtos/rest-api-publish/buildpipelines.md) + +## Packages + +| Name | Changelog | Latest | Next | +| ----------------------------------------------------------------------------- | ------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------- | +| [@azure-tools/typespec-autorest][typespec-autorest_src] | [Changelog][typespec-autorest_chg] | [![](https://img.shields.io/npm/v/@azure-tools/typespec-autorest)](https://www.npmjs.com/package/@azure-tools/typespec-autorest) | ![](https://img.shields.io/npm/v/@azure-tools/typespec-autorest/next) | +| [@azure-tools/typespec-azure-core][typespec-azure-core_src] | [Changelog][typespec-azure-core_chg] | [![](https://img.shields.io/npm/v/@azure-tools/typespec-azure-core)](https://www.npmjs.com/package/@azure-tools/typespec-azure-core) | ![](https://img.shields.io/npm/@azure-tools/typespec-azure-core/next) | +| [@azure-tools/typespec-resource-manager][typespec-azure-resource-manager_src] | [Changelog][typespec-azure-resource-manager_chg] | [![](https://img.shields.io/npm/v/@azure-tools/typespec-azure-resource-manager)](https://www.npmjs.com/package/@azure-tools/typespec-azure-resource-manager) | ![](https://img.shields.io/npm/@azure-tools/typespec-azure-resource-manager/next) | + +[typespec-autorest_src]: packages/typespec-autorest +[typespec-autorest_chg]: packages/typespec-autorest/CHANGELOG.md +[typespec-azure-core_src]: packages/typespec-azure-core +[typespec-azure-core_chg]: packages/typespec-azure-core/CHANGELOG.md +[typespec-azure-resource-manager_src]: packages/typespec-azure-resource-manager +[typespec-azure-resource-manager_chg]: packages/typespec-azure-resource-manager/CHANGELOG.md + +`@next` version of the package are the latest versions available on the `main` branch. + +### Package Layering + +The main packages in this repository can be considered a series of layers which progressively add functionality +for specific scenarios: + +- [**@azure-tools/typespec-azure-core:**](https://github.com/Azure/typespec-azure/tree/main/packages/typespec-azure-core) Provides core models and interfaces for Azure service modelling +- [**@azure-tools/typespec-azure-resource-manager:**](https://github.com/Azure/typespec-azure/tree/main/packages/typespec-azure-resource-manager) Provides additional models and interfaces for modelling Azure Resource Manager services diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000000..e138ec5d6a --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,41 @@ + + +## Security + +Microsoft takes the security of our software products and services seriously, which includes all source code repositories managed through our GitHub organizations, which include [Microsoft](https://github.com/microsoft), [Azure](https://github.com/Azure), [DotNet](https://github.com/dotnet), [AspNet](https://github.com/aspnet), [Xamarin](https://github.com/xamarin), and [our GitHub organizations](https://opensource.microsoft.com/). + +If you believe you have found a security vulnerability in any Microsoft-owned repository that meets [Microsoft's definition of a security vulnerability](https://aka.ms/opensource/security/definition), please report it to us as described below. + +## Reporting Security Issues + +**Please do not report security vulnerabilities through public GitHub issues.** + +Instead, please report them to the Microsoft Security Response Center (MSRC) at [https://msrc.microsoft.com/create-report](https://aka.ms/opensource/security/create-report). + +If you prefer to submit without logging in, send email to [secure@microsoft.com](mailto:secure@microsoft.com). If possible, encrypt your message with our PGP key; please download it from the [Microsoft Security Response Center PGP Key page](https://aka.ms/opensource/security/pgpkey). + +You should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message. Additional information can be found at [microsoft.com/msrc](https://aka.ms/opensource/security/msrc). + +Please include the requested information listed below (as much as you can provide) to help us better understand the nature and scope of the possible issue: + + * Type of issue (e.g. buffer overflow, SQL injection, cross-site scripting, etc.) + * Full paths of source file(s) related to the manifestation of the issue + * The location of the affected source code (tag/branch/commit or direct URL) + * Any special configuration required to reproduce the issue + * Step-by-step instructions to reproduce the issue + * Proof-of-concept or exploit code (if possible) + * Impact of the issue, including how an attacker might exploit the issue + +This information will help us triage your report more quickly. + +If you are reporting for a bug bounty, more complete reports can contribute to a higher bounty award. Please visit our [Microsoft Bug Bounty Program](https://aka.ms/opensource/security/bounty) page for more details about our active programs. + +## Preferred Languages + +We prefer all communications to be in English. + +## Policy + +Microsoft follows the principle of [Coordinated Vulnerability Disclosure](https://aka.ms/opensource/security/cvd). + + diff --git a/common/changes/@azure-tools/typespec-diff/removeproviderhub_2023-11-22-18-53.json b/common/changes/@azure-tools/typespec-diff/removeproviderhub_2023-11-22-18-53.json new file mode 100644 index 0000000000..2960f6bc2d --- /dev/null +++ b/common/changes/@azure-tools/typespec-diff/removeproviderhub_2023-11-22-18-53.json @@ -0,0 +1,10 @@ +{ + "changes": [ + { + "packageName": "@azure-tools/typespec-diff", + "comment": "Remove unused dependency on providerhub", + "type": "none" + } + ], + "packageName": "@azure-tools/typespec-diff" +} \ No newline at end of file diff --git a/common/config/rush/.npmrc b/common/config/rush/.npmrc new file mode 100644 index 0000000000..bad27d2353 --- /dev/null +++ b/common/config/rush/.npmrc @@ -0,0 +1,15 @@ +# Rush uses this file to configure the package registry, regardless of whether the +# package manager is PNPM, NPM, or Yarn. Prior to invoking the package manager, +# Rush will always copy this file to the folder where installation is performed. +# When NPM is the package manager, Rush works around NPM's processing of +# undefined environment variables by deleting any lines that reference undefined +# environment variables. +# +# DO NOT SPECIFY AUTHENTICATION CREDENTIALS IN THIS FILE. It should only be used +# to configure registry sources. + +registry=https://registry.npmjs.org/ +always-auth=false +update-notifier=false + +auto-install-peers=true diff --git a/common/config/rush/.npmrc-publish b/common/config/rush/.npmrc-publish new file mode 100644 index 0000000000..a40aa61461 --- /dev/null +++ b/common/config/rush/.npmrc-publish @@ -0,0 +1,25 @@ +# This config file is very similar to common/config/rush/.npmrc, except that .npmrc-publish +# is used by the "rush publish" command, as publishing often involves different credentials +# and registries than other operations. +# +# Before invoking the package manager, Rush will copy this file to "common/temp/publish-home/.npmrc" +# and then temporarily map that folder as the "home directory" for the current user account. +# This enables the same settings to apply for each project folder that gets published. The copied file +# will omit any config lines that reference environment variables that are undefined in that session; +# this avoids problems that would otherwise result due to a missing variable being replaced by +# an empty string. +# +# * * * SECURITY WARNING * * * +# +# It is NOT recommended to store authentication tokens in a text file on a lab machine, because +# other unrelated processes may be able to read the file. Also, the file may persist indefinitely, +# for example if the machine loses power. A safer practice is to pass the token via an +# environment variable, which can be referenced from .npmrc using ${} expansion. For example: +# +# //registry.npmjs.org/:_authToken=${NPM_AUTH_TOKEN} +# + +registry=https://registry.npmjs.org/ +always-auth=true +loglevel=debug +//registry.npmjs.org/:_authToken=${NPM_AUTH_TOKEN} diff --git a/common/config/rush/.pnpmfile.cjs b/common/config/rush/.pnpmfile.cjs new file mode 100644 index 0000000000..01dbf3e03d --- /dev/null +++ b/common/config/rush/.pnpmfile.cjs @@ -0,0 +1,37 @@ +"use strict"; + +/** + * When using the PNPM package manager, you can use pnpmfile.js to workaround + * dependencies that have mistakes in their package.json file. (This feature is + * functionally similar to Yarn's "resolutions".) + * + * For details, see the PNPM documentation: + * https://pnpm.js.org/docs/en/hooks.html + * + * IMPORTANT: SINCE THIS FILE CONTAINS EXECUTABLE CODE, MODIFYING IT IS LIKELY TO INVALIDATE + * ANY CACHED DEPENDENCY ANALYSIS. After any modification to pnpmfile.js, it's recommended to run + * "rush update --full" so that PNPM will recalculate all version selections. + */ +module.exports = { + hooks: { + readPackage, + }, +}; + +/** + * This hook is invoked during installation before a package's dependencies + * are selected. + * The `packageJson` parameter is the deserialized package.json + * contents for the package that is about to be installed. + * The `context` parameter provides a log() function. + * The return value is the updated object. + */ +function readPackage(packageJson, context) { + // // The karma types have a missing dependency on typings from the log4js package. + // if (packageJson.name === '@types/karma') { + // context.log('Fixed up dependencies for @types/karma'); + // packageJson.dependencies['log4js'] = '0.6.38'; + // } + + return packageJson; +} diff --git a/common/config/rush/command-line.json b/common/config/rush/command-line.json new file mode 100644 index 0000000000..8b7391cd73 --- /dev/null +++ b/common/config/rush/command-line.json @@ -0,0 +1,188 @@ +/** + * This configuration file defines custom commands for the "rush" command-line. + * For full documentation, please see https://rushjs.io + */ +{ + "$schema": "https://developer.microsoft.com/json-schemas/rush/v5/command-line.schema.json", + /** + * Custom "commands" introduce new verbs for the command-line. To see the help for these + * example commands, try "rush --help", "rush my-bulk-command --help", or + * "rush my-global-command --help". + */ + "commands": [ + { + "commandKind": "global", + "safeForSimultaneousRushProcesses": true, + "name": "watch", + "summary": "(CUSTOM) Runs TypeScript compiler in watch mode on all projects.", + "shellCommand": "node eng/scripts/watch.js" + }, + { + "commandKind": "bulk", + "name": "test", + "summary": "(CUSTOM) Runs all tests.", + "enableParallelism": true, + "ignoreMissingScript": true, + "ignoreDependencyOrder": true + }, + { + "commandKind": "bulk", + "name": "test-official", + "summary": "(CUSTOM) Runs all tests for CI or PR validation. Disallows .only.", + "enableParallelism": true, + "ignoreMissingScript": true, + "ignoreDependencyOrder": true + }, + { + "commandKind": "global", + "safeForSimultaneousRushProcesses": true, + "name": "merge-coverage", + "summary": "(CUSTOM) Merge the coverage reports generated by running `rush test-official`", + "shellCommand": "npx istanbul report --include packages/**/coverage/**/coverage-final.json cobertura text" + }, + { + "commandKind": "global", + "name": "format", + "summary": "(CUSTOM) Formats all code with Prettier.", + "shellCommand": "node eng/scripts/format.js" + }, + { + "commandKind": "global", + "name": "regen-docs", + "summary": "(CUSTOM) Regenerate the reference docs.", + "shellCommand": "node eng/scripts/npm-run.js regen-docs" + }, + { + "commandKind": "global", + "name": "check-format", + "summary": "(CUSTOM) Checks formatting of all code with with Prettier.", + "shellCommand": "node eng/scripts/check-format.js" + }, + { + "commandKind": "global", + "name": "regen-samples", + "summary": "(CUSTOM) Regenerate samples.", + "shellCommand": "node eng/scripts/npm-run.js regen-samples" + }, + { + "commandKind": "global", + "name": "update-latest-docs", + "summary": "(CUSTOM) Copy the current docs to the latest.", + "shellCommand": "node eng/scripts/npm-run.js update-latest-docs" + }, + { + "commandKind": "global", + "safeForSimultaneousRushProcesses": true, + "name": "dogfood", + "summary": "(CUSTOM) Globally installs local builds of @typespec/compiler and typespec-vscode.", + "shellCommand": "node eng/scripts/dogfood.js" + }, + { + "commandKind": "global", + "safeForSimultaneousRushProcesses": true, + "name": "prepare-publish", + "summary": "(CUSTOM) Prepare publish", + "shellCommand": "node eng/scripts/prepare-publish.js" + }, + { + "commandKind": "global", + "name": "cspell", + "summary": "(CUSTOM) Check spelling.", + "shellCommand": "node eng/scripts/cspell.js" + }, + { + "commandKind": "global", + "name": "e2e-tests", + "summary": "(CUSTOM) Run the e2e tests.", + "shellCommand": "node packages/e2e-tests/e2e-tests.mjs" + }, + { + "commandKind": "bulk", + "name": "lint", + "summary": "Lint projects. Runs `npm run lint` on all projects.", + "enableParallelism": true, + "ignoreMissingScript": true, + "ignoreDependencyOrder": true + }, + { + "commandKind": "bulk", + "name": "lint:fix", + "summary": "Fix lint issues in projects. Runs `npm run lint:fix` on all projects.", + "enableParallelism": true, + "ignoreMissingScript": true, + "ignoreDependencyOrder": true + }, + { + "commandKind": "bulk", + "name": "clean", + "summary": "(CUSTOM) Run `npm run clean` on all the projects.", + "enableParallelism": true, + "ignoreMissingScript": true, + "ignoreDependencyOrder": true + } + ], + /** + * Custom "parameters" introduce new parameters for specified Rush command-line commands. + * For example, you might define a "--production" parameter for the "rush build" command. + */ + "parameters": [ + { + "parameterKind": "string", + "longName": "--local-cadl-ranch", + "description": "Specify path to local cadl-ranch repo to test change locally. Can also set environment variable: LOCAL_CADL_RANCH=", + "associatedCommands": ["e2e-tests"], + "argumentName": "LOCAL_CADL_RANCH" + } + // + // { + // /** + // * (Required) Determines the type of custom parameter. + // * A "flag" is a custom command-line parameter whose presence acts as an on/off switch. + // */ + // "parameterKind": "choice", + // "longName": "--my-choice", + // "description": "A custom choice parameter for the \"my-global-command\" custom command", + // + // "associatedCommands": [ "my-global-command" ], + // + // /** + // * Normally if a parameter is omitted from the command line, it will not be passed + // * to the shell command. this value will be inserted by default. Whereas if a "defaultValue" + // * is defined, the parameter will always be passed to the shell command, and will use the + // * default value if unspecified. The value must be one of the defined alternatives. + // */ + // "defaultValue": "vanilla", + // + // /** + // * (Required) A list of alternative argument values that can be chosen for this parameter. + // */ + // "alternatives": [ + // { + // /** + // * A token that is one of the alternatives that can be used with the choice parameter, + // * e.g. "vanilla" in "--flavor vanilla". + // */ + // "name": "vanilla", + // + // /** + // * A detailed description for the alternative that can be shown in the command-line help. + // * + // * Whenever you introduce commands/parameters, taking a little time to write meaningful + // * documentation can make a big difference for the developer experience in your repo. + // */ + // "description": "Use the vanilla flavor (the default)" + // }, + // + // { + // "name": "chocolate", + // "description": "Use the chocolate flavor" + // }, + // + // { + // "name": "strawberry", + // "description": "Use the strawberry flavor" + // } + // ] + // } + ] +} diff --git a/common/config/rush/common-versions.json b/common/config/rush/common-versions.json new file mode 100644 index 0000000000..d813115878 --- /dev/null +++ b/common/config/rush/common-versions.json @@ -0,0 +1,44 @@ +/** + * This configuration file specifies NPM dependency version selections that affect all projects + * in a Rush repo. For full documentation, please see https://rushjs.io + */ +{ + "$schema": "https://developer.microsoft.com/json-schemas/rush/v5/common-versions.schema.json", + + /** + * A table that specifies a "preferred version" for a dependency package. The "preferred version" + * is typically used to hold an indirect dependency back to a specific version, however generally + * it can be any SemVer range specifier (e.g. "~1.2.3"), and it will narrow any (compatible) + * SemVer range specifier. See the Rush documentation for details about this feature. + * + * After modifying this field, it's recommended to run "rush update --full" so that the package manager + * will recalculate all version selections. + */ + "preferredVersions": { + /** + * When someone asks for "^1.0.0" make sure they get "1.2.3" when working in this repo, + * instead of the latest version. + */ + // "some-library": "1.2.3" + }, + + /** + * The "rush check" command can be used to enforce that every project in the repo must specify + * the same SemVer range for a given dependency. However, sometimes exceptions are needed. + * The allowedAlternativeVersions table allows you to list other SemVer ranges that will be + * accepted by "rush check" for a given dependency. + * + * IMPORTANT: THIS TABLE IS FOR *ADDITIONAL* VERSION RANGES THAT ARE ALTERNATIVES TO THE + * USUAL VERSION (WHICH IS INFERRED BY LOOKING AT ALL PROJECTS IN THE REPO). + * This design avoids unnecessary churn in this file. + */ + "allowedAlternativeVersions": { + /** + * For example, allow some projects to use an older TypeScript compiler + * (in addition to whatever "usual" version is being used by other projects in the repo): + */ + // "typescript": [ + // "~2.4.0" + // ] + } +} diff --git a/common/config/rush/pnpm-config.json b/common/config/rush/pnpm-config.json new file mode 100644 index 0000000000..ef32cb1947 --- /dev/null +++ b/common/config/rush/pnpm-config.json @@ -0,0 +1,208 @@ +/** + * This configuration file provides settings specific to the PNPM package manager. + * More documentation is available on the Rush website: https://rushjs.io + */ +{ + "$schema": "https://developer.microsoft.com/json-schemas/rush/v5/pnpm-config.schema.json", + + /** + * If true, then `rush install` and `rush update` will use the PNPM workspaces feature + * to perform the install, instead of the old model where Rush generated the symlinks + * for each projects's node_modules folder. + * + * When using workspaces, Rush will generate a `common/temp/pnpm-workspace.yaml` file referencing + * all local projects to install. Rush will also generate a `.pnpmfile.cjs` shim which implements + * Rush-specific features such as preferred versions. The user's `common/config/rush/.pnpmfile.cjs` + * is invoked by the shim. + * + * This option is strongly recommended. The default value is false. + */ + "useWorkspaces": true, + + /** + * If true, then Rush will add the `--strict-peer-dependencies` command-line parameter when + * invoking PNPM. This causes `rush update` to fail if there are unsatisfied peer dependencies, + * which is an invalid state that can cause build failures or incompatible dependency versions. + * (For historical reasons, JavaScript package managers generally do not treat this invalid + * state as an error.) + * + * PNPM documentation: https://pnpm.io/npmrc#strict-peer-dependencies + * + * The default value is false to avoid legacy compatibility issues. + * It is strongly recommended to set `strictPeerDependencies=true`. + */ + // "strictPeerDependencies": true, + + /** + * Environment variables that will be provided to PNPM. + */ + // "environmentVariables": { + // "NODE_OPTIONS": { + // "value": "--max-old-space-size=4096", + // "override": false + // } + // }, + + /** + * Specifies the location of the PNPM store. There are two possible values: + * + * - `local` - use the `pnpm-store` folder in the current configured temp folder: + * `common/temp/pnpm-store` by default. + * - `global` - use PNPM's global store, which has the benefit of being shared + * across multiple repo folders, but the disadvantage of less isolation for builds + * (for example, bugs or incompatibilities when two repos use different releases of PNPM) + * + * In both cases, the store path can be overridden by the environment variable `RUSH_PNPM_STORE_PATH`. + * + * The default value is `local`. + */ + // "pnpmStore": "global", + + /** + * If true, then `rush install` will report an error if manual modifications + * were made to the PNPM shrinkwrap file without running `rush update` afterwards. + * + * This feature protects against accidental inconsistencies that may be introduced + * if the PNPM shrinkwrap file (`pnpm-lock.yaml`) is manually edited. When this + * feature is enabled, `rush update` will append a hash to the file as a YAML comment, + * and then `rush update` and `rush install` will validate the hash. Note that this + * does not prohibit manual modifications, but merely requires `rush update` be run + * afterwards, ensuring that PNPM can report or repair any potential inconsistencies. + * + * To temporarily disable this validation when invoking `rush install`, use the + * `--bypass-policy` command-line parameter. + * + * The default value is false. + */ + // "preventManualShrinkwrapChanges": true, + + /** + * The "globalOverrides" setting provides a simple mechanism for overriding version selections + * for all dependencies of all projects in the monorepo workspace. The settings are copied + * into the `pnpm.overrides` field of the `common/temp/package.json` file that is generated + * by Rush during installation. + * + * Order of precedence: `.pnpmfile.cjs` has the highest precedence, followed by + * `unsupportedPackageJsonSettings`, `globalPeerDependencyRules`, `globalPackageExtensions`, + * and `globalOverrides` has lowest precedence. + * + * PNPM documentation: https://pnpm.io/package_json#pnpmoverrides + */ + "globalOverrides": { + "node-fetch@3.2.8": "^3.3.2", + // BUG https://github.com/microsoft/tabster/issues/316 + "@fluentui/react-tabster": "9.12.9", + "tabster": "4.7.0" + // "example1": "^1.0.0", + // "example2": "npm:@company/example2@^1.0.0" + }, + + /** + * The `globalPeerDependencyRules` setting provides various settings for suppressing validation errors + * that are reported during installation with `strictPeerDependencies=true`. The settings are copied + * into the `pnpm.peerDependencyRules` field of the `common/temp/package.json` file that is generated + * by Rush during installation. + * + * Order of precedence: `.pnpmfile.cjs` has the highest precedence, followed by + * `unsupportedPackageJsonSettings`, `globalPeerDependencyRules`, `globalPackageExtensions`, + * and `globalOverrides` has lowest precedence. + * + * https://pnpm.io/package_json#pnpmpeerdependencyrules + */ + "globalPeerDependencyRules": { + // "ignoreMissing": ["@eslint/*"], + // "allowedVersions": { "react": "17" }, + // "allowAny": ["@babel/*"] + }, + + /** + * The `globalPackageExtension` setting provides a way to patch arbitrary package.json fields + * for any PNPM dependency of the monorepo. The settings are copied into the `pnpm.packageExtensions` + * field of the `common/temp/package.json` file that is generated by Rush during installation. + * The `globalPackageExtension` setting has similar capabilities as `.pnpmfile.cjs` but without + * the downsides of an executable script (nondeterminism, unreliable caching, performance concerns). + * + * Order of precedence: `.pnpmfile.cjs` has the highest precedence, followed by + * `unsupportedPackageJsonSettings`, `globalPeerDependencyRules`, `globalPackageExtensions`, + * and `globalOverrides` has lowest precedence. + * + * PNPM documentation: https://pnpm.io/package_json#pnpmpackageextensions + */ + "globalPackageExtensions": { + // "fork-ts-checker-webpack-plugin": { + // "dependencies": { + // "@babel/core": "1" + // }, + // "peerDependencies": { + // "eslint": ">= 6" + // }, + // "peerDependenciesMeta": { + // "eslint": { + // "optional": true + // } + // } + // } + }, + + /** + * The `globalNeverBuiltDependencies` setting suppresses the `preinstall`, `install`, and `postinstall` + * lifecycle events for the specified NPM dependencies. This is useful for scripts with poor practices + * such as downloading large binaries without retries or attempting to invoke OS tools such as + * a C++ compiler. (PNPM's terminology refers to these lifecycle events as "building" a package; + * it has nothing to do with build system operations such as `rush build` or `rushx build`.) + * The settings are copied into the `pnpm.neverBuiltDependencies` field of the `common/temp/package.json` + * file that is generated by Rush during installation. + * + * PNPM documentation: https://pnpm.io/package_json#pnpmneverbuiltdependencies + */ + "globalNeverBuiltDependencies": [ + // "fsevents" + ], + + /** + * The `globalAllowedDeprecatedVersions` setting suppresses installation warnings for package + * versions that the NPM registry reports as being deprecated. This is useful if the + * deprecated package is an indirect dependency of an external package that has not released a fix. + * The settings are copied into the `pnpm.allowedDeprecatedVersions` field of the `common/temp/package.json` + * file that is generated by Rush during installation. + * + * PNPM documentation: https://pnpm.io/package_json#pnpmalloweddeprecatedversions + * + * If you are working to eliminate a deprecated version, it's better to specify `allowedDeprecatedVersions` + * in the package.json file for individual Rush projects. + */ + "globalAllowedDeprecatedVersions": { + // "request": "*" + }, + + /** + * (THIS FIELD IS MACHINE GENERATED) The "globalPatchedDependencies" field is updated automatically + * by the `rush-pnpm patch-commit` command. It is a dictionary, where the key is an NPM package name + * and exact version, and the value is a relative path to the associated patch file. + * + * PNPM documentation: https://pnpm.io/package_json#pnpmpatcheddependencies + */ + "globalPatchedDependencies": {}, + + /** + * (USE AT YOUR OWN RISK) This is a free-form property bag that will be copied into + * the `common/temp/package.json` file that is generated by Rush during installation. + * This provides a way to experiment with new PNPM features. These settings will override + * any other Rush configuration associated with a given JSON field except for `.pnpmfile.cjs`. + * + * USAGE OF THIS SETTING IS NOT SUPPORTED BY THE RUSH MAINTAINERS AND MAY CAUSE RUSH + * TO MALFUNCTION. If you encounter a missing PNPM setting that you believe should + * be supported, please create a GitHub issue or PR. Note that Rush does not aim to + * support every possible PNPM setting, but rather to promote a battle-tested installation + * strategy that is known to provide a good experience for large teams with lots of projects. + */ + "unsupportedPackageJsonSettings": { + // "dependencies": { + // "not-a-good-practice": "*" + // }, + // "scripts": { + // "do-something": "echo Also not a good practice" + // }, + // "pnpm": { "futurePnpmFeature": true } + } +} diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml new file mode 100644 index 0000000000..39604931e9 --- /dev/null +++ b/common/config/rush/pnpm-lock.yaml @@ -0,0 +1,19437 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +overrides: + node-fetch@3.2.8: ^3.3.2 + '@fluentui/react-tabster': 9.12.9 + tabster: 4.7.0 + +importers: + + .: {} + + ../../core/packages/best-practices: + devDependencies: + '@types/mocha': + specifier: ~10.0.1 + version: 10.0.3 + '@types/node': + specifier: ~18.11.9 + version: 18.11.19 + '@typespec/compiler': + specifier: workspace:~0.51.0 + version: link:../compiler + '@typespec/eslint-config-typespec': + specifier: workspace:~0.51.0 + version: link:../eslint-config-typespec + '@typespec/eslint-plugin': + specifier: workspace:~0.51.0 + version: link:../eslint-plugin-typespec + c8: + specifier: ~8.0.1 + version: 8.0.1 + eslint: + specifier: ^8.49.0 + version: 8.52.0 + mocha: + specifier: ~10.2.0 + version: 10.2.0 + mocha-junit-reporter: + specifier: ~2.2.1 + version: 2.2.1(mocha@10.2.0) + mocha-multi-reporters: + specifier: ~1.5.1 + version: 1.5.1(mocha@10.2.0) + rimraf: + specifier: ~5.0.1 + version: 5.0.5 + typescript: + specifier: ~5.2.2 + version: 5.2.2 + + ../../core/packages/bundle-uploader: + dependencies: + '@azure/identity': + specifier: ~3.3.2 + version: 3.3.2 + '@azure/storage-blob': + specifier: ~12.16.0 + version: 12.16.0 + '@typespec/bundler': + specifier: workspace:~0.1.0-alpha.4 + version: link:../bundler + json5: + specifier: ^2.2.3 + version: 2.2.3 + picocolors: + specifier: ~1.0.0 + version: 1.0.0 + semver: + specifier: ^7.5.4 + version: 7.5.4 + devDependencies: + '@types/mocha': + specifier: ~10.0.1 + version: 10.0.3 + '@types/node': + specifier: ~18.11.9 + version: 18.11.19 + '@types/semver': + specifier: ^7.5.2 + version: 7.5.4 + '@typespec/eslint-config-typespec': + specifier: workspace:~0.51.0 + version: link:../eslint-config-typespec + c8: + specifier: ~8.0.1 + version: 8.0.1 + eslint: + specifier: ^8.49.0 + version: 8.52.0 + mocha: + specifier: ~10.2.0 + version: 10.2.0 + mocha-junit-reporter: + specifier: ~2.2.1 + version: 2.2.1(mocha@10.2.0) + mocha-multi-reporters: + specifier: ~1.5.1 + version: 1.5.1(mocha@10.2.0) + rimraf: + specifier: ~5.0.1 + version: 5.0.5 + typescript: + specifier: ~5.2.2 + version: 5.2.2 + + ../../core/packages/bundler: + dependencies: + '@rollup/plugin-alias': + specifier: ~5.0.0 + version: 5.0.1(rollup@3.29.4) + '@rollup/plugin-commonjs': + specifier: ~25.0.4 + version: 25.0.7(rollup@3.29.4) + '@rollup/plugin-json': + specifier: ~6.0.0 + version: 6.0.1(rollup@3.29.4) + '@rollup/plugin-multi-entry': + specifier: ~6.0.0 + version: 6.0.1(rollup@3.29.4) + '@rollup/plugin-node-resolve': + specifier: ~15.2.1 + version: 15.2.3(rollup@3.29.4) + '@rollup/plugin-virtual': + specifier: ~3.0.1 + version: 3.0.2(rollup@3.29.4) + '@typespec/compiler': + specifier: workspace:~0.51.0 + version: link:../compiler + picocolors: + specifier: ~1.0.0 + version: 1.0.0 + rollup: + specifier: ~3.29.2 + version: 3.29.4 + yargs: + specifier: ~17.7.2 + version: 17.7.2 + devDependencies: + '@types/mocha': + specifier: ~10.0.1 + version: 10.0.3 + '@types/node': + specifier: ~18.11.9 + version: 18.11.19 + '@types/yargs': + specifier: ~17.0.24 + version: 17.0.29 + '@typespec/eslint-config-typespec': + specifier: workspace:~0.51.0 + version: link:../eslint-config-typespec + c8: + specifier: ~8.0.1 + version: 8.0.1 + eslint: + specifier: ^8.49.0 + version: 8.52.0 + mocha: + specifier: ~10.2.0 + version: 10.2.0 + mocha-junit-reporter: + specifier: ~2.2.1 + version: 2.2.1(mocha@10.2.0) + mocha-multi-reporters: + specifier: ~1.5.1 + version: 1.5.1(mocha@10.2.0) + rimraf: + specifier: ~5.0.1 + version: 5.0.5 + typescript: + specifier: ~5.2.2 + version: 5.2.2 + vite: + specifier: ^4.4.9 + version: 4.5.0(@types/node@18.11.19) + + ../../core/packages/compiler: + dependencies: + '@babel/code-frame': + specifier: ~7.22.13 + version: 7.22.13 + ajv: + specifier: ~8.12.0 + version: 8.12.0 + change-case: + specifier: ~4.1.2 + version: 4.1.2 + globby: + specifier: ~13.2.2 + version: 13.2.2 + mustache: + specifier: ~4.2.0 + version: 4.2.0 + picocolors: + specifier: ~1.0.0 + version: 1.0.0 + prettier: + specifier: ~3.1.0 + version: 3.1.0 + prompts: + specifier: ~2.4.2 + version: 2.4.2 + semver: + specifier: ^7.5.4 + version: 7.5.4 + vscode-languageserver: + specifier: ~9.0.0 + version: 9.0.1 + vscode-languageserver-textdocument: + specifier: ~1.0.8 + version: 1.0.11 + yaml: + specifier: ~2.3.2 + version: 2.3.3 + yargs: + specifier: ~17.7.2 + version: 17.7.2 + devDependencies: + '@types/babel__code-frame': + specifier: ~7.0.4 + version: 7.0.5 + '@types/mocha': + specifier: ~10.0.1 + version: 10.0.3 + '@types/mustache': + specifier: ~4.2.2 + version: 4.2.4 + '@types/node': + specifier: ~18.11.9 + version: 18.11.19 + '@types/prompts': + specifier: ~2.4.4 + version: 2.4.7 + '@types/semver': + specifier: ^7.5.2 + version: 7.5.4 + '@types/sinon': + specifier: ~10.0.20 + version: 10.0.20 + '@types/yargs': + specifier: ~17.0.24 + version: 17.0.29 + '@typespec/eslint-config-typespec': + specifier: workspace:~0.51.0 + version: link:../eslint-config-typespec + '@typespec/internal-build-utils': + specifier: workspace:~0.51.0 + version: link:../internal-build-utils + c8: + specifier: ~8.0.1 + version: 8.0.1 + eslint: + specifier: ^8.49.0 + version: 8.52.0 + grammarkdown: + specifier: ~3.3.2 + version: 3.3.2 + mocha: + specifier: ~10.2.0 + version: 10.2.0 + mocha-junit-reporter: + specifier: ~2.2.1 + version: 2.2.1(mocha@10.2.0) + mocha-multi-reporters: + specifier: ~1.5.1 + version: 1.5.1(mocha@10.2.0) + prettier-plugin-organize-imports: + specifier: ~3.2.3 + version: 3.2.3(prettier@3.1.0)(typescript@5.2.2) + rimraf: + specifier: ~5.0.1 + version: 5.0.5 + sinon: + specifier: ~17.0.1 + version: 17.0.1 + source-map-support: + specifier: ~0.5.21 + version: 0.5.21 + tmlanguage-generator: + specifier: workspace:~0.5.1 + version: link:../tmlanguage-generator + typescript: + specifier: ~5.2.2 + version: 5.2.2 + vscode-oniguruma: + specifier: ~2.0.1 + version: 2.0.1 + vscode-textmate: + specifier: ~9.0.0 + version: 9.0.0 + + ../../core/packages/eslint-config-typespec: + dependencies: + '@rushstack/eslint-patch': + specifier: 1.3.2 + version: 1.3.2 + '@typescript-eslint/eslint-plugin': + specifier: ^6.2.1 + version: 6.9.1(@typescript-eslint/parser@6.9.1)(eslint@8.52.0)(typescript@5.2.2) + '@typescript-eslint/parser': + specifier: ^6.2.1 + version: 6.9.1(eslint@8.52.0)(typescript@5.2.2) + eslint: + specifier: ^8.49.0 + version: 8.52.0 + eslint-config-prettier: + specifier: ^8.5.0 + version: 8.10.0(eslint@8.52.0) + eslint-plugin-deprecation: + specifier: ^2.0.0 + version: 2.0.0(eslint@8.52.0)(typescript@5.2.2) + eslint-plugin-mocha: + specifier: ^10.0.5 + version: 10.2.0(eslint@8.52.0) + eslint-plugin-prettier: + specifier: ^5.0.0 + version: 5.0.1(eslint-config-prettier@8.10.0)(eslint@8.52.0)(prettier@3.1.0) + eslint-plugin-unicorn: + specifier: ^47.0.0 + version: 47.0.0(eslint@8.52.0) + typescript: + specifier: ~5.2.2 + version: 5.2.2 + + ../../core/packages/eslint-plugin-typespec: + dependencies: + '@typescript-eslint/utils': + specifier: ~5.59.11 + version: 5.59.11(eslint@8.52.0)(typescript@5.2.2) + devDependencies: + '@types/mocha': + specifier: ~10.0.1 + version: 10.0.3 + '@types/node': + specifier: ~18.11.9 + version: 18.11.19 + '@typescript-eslint/parser': + specifier: ^6.2.1 + version: 6.9.1(eslint@8.52.0)(typescript@5.2.2) + '@typespec/eslint-config-typespec': + specifier: workspace:~0.51.0 + version: link:../eslint-config-typespec + c8: + specifier: ~8.0.1 + version: 8.0.1 + eslint: + specifier: ^8.49.0 + version: 8.52.0 + mocha: + specifier: ~10.2.0 + version: 10.2.0 + mocha-junit-reporter: + specifier: ~2.2.1 + version: 2.2.1(mocha@10.2.0) + mocha-multi-reporters: + specifier: ~1.5.1 + version: 1.5.1(mocha@10.2.0) + rimraf: + specifier: ~5.0.1 + version: 5.0.5 + typescript: + specifier: ~5.2.2 + version: 5.2.2 + + ../../core/packages/html-program-viewer: + dependencies: + '@emotion/react': + specifier: ^11.11.1 + version: 11.11.1(@types/react@18.2.34)(react@18.2.0) + prettier: + specifier: ~3.1.0 + version: 3.1.0 + react: + specifier: ~18.2.0 + version: 18.2.0 + react-dom: + specifier: ~18.2.0 + version: 18.2.0(react@18.2.0) + react-is: + specifier: ~18.1.0 + version: 18.1.0 + devDependencies: + '@babel/core': + specifier: ^7.22.20 + version: 7.23.2 + '@types/mocha': + specifier: ~10.0.1 + version: 10.0.3 + '@types/node': + specifier: ~18.11.9 + version: 18.11.19 + '@types/react': + specifier: ~18.2.22 + version: 18.2.34 + '@types/react-dom': + specifier: ~18.2.7 + version: 18.2.14 + '@typespec/compiler': + specifier: workspace:~0.51.0 + version: link:../compiler + '@typespec/eslint-config-typespec': + specifier: workspace:~0.51.0 + version: link:../eslint-config-typespec + c8: + specifier: ~8.0.1 + version: 8.0.1 + eslint: + specifier: ^8.49.0 + version: 8.52.0 + mocha: + specifier: ~10.2.0 + version: 10.2.0 + mocha-junit-reporter: + specifier: ~2.2.1 + version: 2.2.1(mocha@10.2.0) + mocha-multi-reporters: + specifier: ~1.5.1 + version: 1.5.1(mocha@10.2.0) + rimraf: + specifier: ~5.0.1 + version: 5.0.5 + typescript: + specifier: ~5.2.2 + version: 5.2.2 + + ../../core/packages/http: + devDependencies: + '@types/mocha': + specifier: ~10.0.1 + version: 10.0.3 + '@types/node': + specifier: ~18.11.9 + version: 18.11.19 + '@typespec/compiler': + specifier: workspace:~0.51.0 + version: link:../compiler + '@typespec/eslint-config-typespec': + specifier: workspace:~0.51.0 + version: link:../eslint-config-typespec + '@typespec/eslint-plugin': + specifier: workspace:~0.51.0 + version: link:../eslint-plugin-typespec + '@typespec/library-linter': + specifier: workspace:~0.51.0 + version: link:../library-linter + '@typespec/tspd': + specifier: workspace:~0.46.0 + version: link:../tspd + c8: + specifier: ~8.0.1 + version: 8.0.1 + eslint: + specifier: ^8.49.0 + version: 8.52.0 + mocha: + specifier: ~10.2.0 + version: 10.2.0 + mocha-junit-reporter: + specifier: ~2.2.1 + version: 2.2.1(mocha@10.2.0) + mocha-multi-reporters: + specifier: ~1.5.1 + version: 1.5.1(mocha@10.2.0) + rimraf: + specifier: ~5.0.1 + version: 5.0.5 + typescript: + specifier: ~5.2.2 + version: 5.2.2 + + ../../core/packages/internal-build-utils: + dependencies: + cspell: + specifier: ~6.31.1 + version: 6.31.3 + semver: + specifier: ^7.5.4 + version: 7.5.4 + strip-json-comments: + specifier: ~5.0.0 + version: 5.0.1 + yargs: + specifier: ~17.7.2 + version: 17.7.2 + devDependencies: + '@types/mocha': + specifier: ~10.0.1 + version: 10.0.3 + '@types/node': + specifier: ~18.11.9 + version: 18.11.19 + '@types/semver': + specifier: ^7.5.2 + version: 7.5.4 + '@types/yargs': + specifier: ~17.0.24 + version: 17.0.29 + '@typespec/eslint-config-typespec': + specifier: workspace:~0.51.0 + version: link:../eslint-config-typespec + c8: + specifier: ~8.0.1 + version: 8.0.1 + chokidar: + specifier: ~3.5.3 + version: 3.5.3 + eslint: + specifier: ^8.49.0 + version: 8.52.0 + mocha: + specifier: ~10.2.0 + version: 10.2.0 + mocha-junit-reporter: + specifier: ~2.2.1 + version: 2.2.1(mocha@10.2.0) + mocha-multi-reporters: + specifier: ~1.5.1 + version: 1.5.1(mocha@10.2.0) + rimraf: + specifier: ~5.0.1 + version: 5.0.5 + typescript: + specifier: ~5.2.2 + version: 5.2.2 + + ../../core/packages/json-schema: + dependencies: + yaml: + specifier: ~2.3.2 + version: 2.3.3 + devDependencies: + '@types/mocha': + specifier: ~10.0.1 + version: 10.0.3 + '@types/node': + specifier: ~18.11.9 + version: 18.11.19 + '@typespec/compiler': + specifier: workspace:~0.51.0 + version: link:../compiler + '@typespec/eslint-config-typespec': + specifier: workspace:~0.51.0 + version: link:../eslint-config-typespec + '@typespec/eslint-plugin': + specifier: workspace:~0.51.0 + version: link:../eslint-plugin-typespec + '@typespec/internal-build-utils': + specifier: workspace:~0.51.0 + version: link:../internal-build-utils + '@typespec/library-linter': + specifier: workspace:~0.51.0 + version: link:../library-linter + '@typespec/tspd': + specifier: workspace:~0.46.0 + version: link:../tspd + ajv: + specifier: ~8.12.0 + version: 8.12.0 + ajv-formats: + specifier: ~2.1.1 + version: 2.1.1(ajv@8.12.0) + c8: + specifier: ~8.0.1 + version: 8.0.1 + eslint: + specifier: ^8.49.0 + version: 8.52.0 + mocha: + specifier: ~10.2.0 + version: 10.2.0 + mocha-junit-reporter: + specifier: ~2.2.1 + version: 2.2.1(mocha@10.2.0) + mocha-multi-reporters: + specifier: ~1.5.1 + version: 1.5.1(mocha@10.2.0) + rimraf: + specifier: ~5.0.1 + version: 5.0.5 + typescript: + specifier: ~5.2.2 + version: 5.2.2 + + ../../core/packages/library-linter: + devDependencies: + '@types/mocha': + specifier: ~10.0.1 + version: 10.0.3 + '@types/node': + specifier: ~18.11.9 + version: 18.11.19 + '@typespec/compiler': + specifier: workspace:~0.51.0 + version: link:../compiler + '@typespec/eslint-config-typespec': + specifier: workspace:~0.51.0 + version: link:../eslint-config-typespec + c8: + specifier: ~8.0.1 + version: 8.0.1 + eslint: + specifier: ^8.49.0 + version: 8.52.0 + mocha: + specifier: ~10.2.0 + version: 10.2.0 + mocha-junit-reporter: + specifier: ~2.2.1 + version: 2.2.1(mocha@10.2.0) + mocha-multi-reporters: + specifier: ~1.5.1 + version: 1.5.1(mocha@10.2.0) + rimraf: + specifier: ~5.0.1 + version: 5.0.5 + typescript: + specifier: ~5.2.2 + version: 5.2.2 + + ../../core/packages/lint: + devDependencies: + '@types/mocha': + specifier: ~10.0.1 + version: 10.0.3 + '@types/node': + specifier: ~18.11.9 + version: 18.11.19 + '@typespec/compiler': + specifier: workspace:~0.51.0 + version: link:../compiler + '@typespec/eslint-config-typespec': + specifier: workspace:~0.51.0 + version: link:../eslint-config-typespec + '@typespec/eslint-plugin': + specifier: workspace:~0.51.0 + version: link:../eslint-plugin-typespec + c8: + specifier: ~8.0.1 + version: 8.0.1 + eslint: + specifier: ^8.49.0 + version: 8.52.0 + mocha: + specifier: ~10.2.0 + version: 10.2.0 + mocha-junit-reporter: + specifier: ~2.2.1 + version: 2.2.1(mocha@10.2.0) + mocha-multi-reporters: + specifier: ~1.5.1 + version: 1.5.1(mocha@10.2.0) + rimraf: + specifier: ~5.0.1 + version: 5.0.5 + typescript: + specifier: ~5.2.2 + version: 5.2.2 + + ../../core/packages/migrate: + dependencies: + '@typespec/compiler': + specifier: workspace:~0.51.0 + version: link:../compiler + '@typespec/compiler-v0.37': + specifier: npm:@cadl-lang/compiler@0.37.0 + version: /@cadl-lang/compiler@0.37.0 + '@typespec/compiler-v0.38': + specifier: npm:@cadl-lang/compiler@0.38.5 + version: /@cadl-lang/compiler@0.38.5 + '@typespec/compiler-v0.40': + specifier: npm:@cadl-lang/compiler@0.40.0 + version: /@cadl-lang/compiler@0.40.0 + '@typespec/compiler-v0.41': + specifier: npm:@typespec/compiler@0.41.0 + version: /@typespec/compiler@0.41.0 + '@typespec/compiler-v0.42': + specifier: npm:@typespec/compiler@0.42.0 + version: /@typespec/compiler@0.42.0 + globby: + specifier: ~13.2.2 + version: 13.2.2 + prettier: + specifier: ~3.1.0 + version: 3.1.0 + semver: + specifier: ^7.5.4 + version: 7.5.4 + yaml: + specifier: ~2.3.2 + version: 2.3.3 + yargs: + specifier: ~17.7.2 + version: 17.7.2 + devDependencies: + '@types/mocha': + specifier: ~10.0.1 + version: 10.0.3 + '@types/node': + specifier: ~18.11.9 + version: 18.11.19 + '@types/semver': + specifier: ^7.5.2 + version: 7.5.4 + '@types/yargs': + specifier: ~17.0.24 + version: 17.0.29 + '@typespec/eslint-config-typespec': + specifier: workspace:~0.51.0 + version: link:../eslint-config-typespec + '@typespec/eslint-plugin': + specifier: workspace:~0.51.0 + version: link:../eslint-plugin-typespec + c8: + specifier: ~8.0.1 + version: 8.0.1 + eslint: + specifier: ^8.49.0 + version: 8.52.0 + mocha: + specifier: ~10.2.0 + version: 10.2.0 + mocha-junit-reporter: + specifier: ~2.2.1 + version: 2.2.1(mocha@10.2.0) + mocha-multi-reporters: + specifier: ~1.5.1 + version: 1.5.1(mocha@10.2.0) + rimraf: + specifier: ~5.0.1 + version: 5.0.5 + typescript: + specifier: ~5.2.2 + version: 5.2.2 + + ../../core/packages/openapi: + devDependencies: + '@types/mocha': + specifier: ~10.0.1 + version: 10.0.3 + '@types/node': + specifier: ~18.11.9 + version: 18.11.19 + '@typespec/compiler': + specifier: workspace:~0.51.0 + version: link:../compiler + '@typespec/eslint-config-typespec': + specifier: workspace:~0.51.0 + version: link:../eslint-config-typespec + '@typespec/eslint-plugin': + specifier: workspace:~0.51.0 + version: link:../eslint-plugin-typespec + '@typespec/http': + specifier: workspace:~0.51.0 + version: link:../http + '@typespec/library-linter': + specifier: workspace:~0.51.0 + version: link:../library-linter + '@typespec/rest': + specifier: workspace:~0.51.0 + version: link:../rest + '@typespec/tspd': + specifier: workspace:~0.46.0 + version: link:../tspd + c8: + specifier: ~8.0.1 + version: 8.0.1 + eslint: + specifier: ^8.49.0 + version: 8.52.0 + mocha: + specifier: ~10.2.0 + version: 10.2.0 + mocha-junit-reporter: + specifier: ~2.2.1 + version: 2.2.1(mocha@10.2.0) + mocha-multi-reporters: + specifier: ~1.5.1 + version: 1.5.1(mocha@10.2.0) + rimraf: + specifier: ~5.0.1 + version: 5.0.5 + typescript: + specifier: ~5.2.2 + version: 5.2.2 + + ../../core/packages/openapi3: + dependencies: + yaml: + specifier: ~2.3.2 + version: 2.3.3 + devDependencies: + '@types/mocha': + specifier: ~10.0.1 + version: 10.0.3 + '@types/node': + specifier: ~18.11.9 + version: 18.11.19 + '@typespec/compiler': + specifier: workspace:~0.51.0 + version: link:../compiler + '@typespec/eslint-config-typespec': + specifier: workspace:~0.51.0 + version: link:../eslint-config-typespec + '@typespec/eslint-plugin': + specifier: workspace:~0.51.0 + version: link:../eslint-plugin-typespec + '@typespec/http': + specifier: workspace:~0.51.0 + version: link:../http + '@typespec/library-linter': + specifier: workspace:~0.51.0 + version: link:../library-linter + '@typespec/openapi': + specifier: workspace:~0.51.0 + version: link:../openapi + '@typespec/rest': + specifier: workspace:~0.51.0 + version: link:../rest + '@typespec/tspd': + specifier: workspace:~0.46.0 + version: link:../tspd + '@typespec/versioning': + specifier: workspace:~0.51.0 + version: link:../versioning + c8: + specifier: ~8.0.1 + version: 8.0.1 + eslint: + specifier: ^8.49.0 + version: 8.52.0 + mocha: + specifier: ~10.2.0 + version: 10.2.0 + mocha-junit-reporter: + specifier: ~2.2.1 + version: 2.2.1(mocha@10.2.0) + mocha-multi-reporters: + specifier: ~1.5.1 + version: 1.5.1(mocha@10.2.0) + rimraf: + specifier: ~5.0.1 + version: 5.0.5 + typescript: + specifier: ~5.2.2 + version: 5.2.2 + + ../../core/packages/playground: + dependencies: + '@fluentui/react-components': + specifier: ~9.32.1 + version: 9.32.3(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2) + '@fluentui/react-icons': + specifier: ~2.0.217 + version: 2.0.221(react@18.2.0) + '@typespec/bundler': + specifier: workspace:~0.1.0-alpha.4 + version: link:../bundler + '@typespec/compiler': + specifier: workspace:~0.51.0 + version: link:../compiler + '@typespec/html-program-viewer': + specifier: workspace:~0.51.0 + version: link:../html-program-viewer + '@typespec/http': + specifier: workspace:~0.51.0 + version: link:../http + '@typespec/openapi': + specifier: workspace:~0.51.0 + version: link:../openapi + '@typespec/openapi3': + specifier: workspace:~0.51.0 + version: link:../openapi3 + '@typespec/protobuf': + specifier: workspace:~0.51.0 + version: link:../protobuf + '@typespec/rest': + specifier: workspace:~0.51.0 + version: link:../rest + '@typespec/versioning': + specifier: workspace:~0.51.0 + version: link:../versioning + clsx: + specifier: ~2.0.0 + version: 2.0.0 + debounce: + specifier: ~1.2.1 + version: 1.2.1 + lzutf8: + specifier: 0.6.3 + version: 0.6.3 + monaco-editor: + specifier: ~0.43.0 + version: 0.43.0 + react: + specifier: ~18.2.0 + version: 18.2.0 + react-dom: + specifier: ~18.2.0 + version: 18.2.0(react@18.2.0) + swagger-ui-react: + specifier: ~5.7.2 + version: 5.7.2(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + vscode-languageserver: + specifier: ~9.0.0 + version: 9.0.1 + vscode-languageserver-textdocument: + specifier: ~1.0.8 + version: 1.0.11 + devDependencies: + '@babel/core': + specifier: ^7.22.20 + version: 7.23.2 + '@playwright/test': + specifier: ^1.39.0 + version: 1.39.0 + '@rollup/plugin-commonjs': + specifier: ~25.0.4 + version: 25.0.7(rollup@3.29.4) + '@rollup/plugin-json': + specifier: ~6.0.0 + version: 6.0.1(rollup@3.29.4) + '@rollup/plugin-node-resolve': + specifier: ~15.2.1 + version: 15.2.3(rollup@3.29.4) + '@rollup/plugin-typescript': + specifier: ~11.1.5 + version: 11.1.5(rollup@3.29.4)(typescript@5.2.2) + '@types/debounce': + specifier: ~1.2.1 + version: 1.2.3 + '@types/mocha': + specifier: ~10.0.1 + version: 10.0.3 + '@types/node': + specifier: ~18.11.9 + version: 18.11.19 + '@types/react': + specifier: ~18.2.22 + version: 18.2.34 + '@types/react-dom': + specifier: ~18.2.7 + version: 18.2.14 + '@types/swagger-ui': + specifier: ~3.52.0 + version: 3.52.3 + '@types/swagger-ui-react': + specifier: ^4.18.0 + version: 4.18.2 + '@typespec/eslint-config-typespec': + specifier: workspace:~0.51.0 + version: link:../eslint-config-typespec + '@vitejs/plugin-react': + specifier: ~4.1.0 + version: 4.1.1(vite@4.5.0) + c8: + specifier: ~8.0.1 + version: 8.0.1 + copyfiles: + specifier: ~2.4.1 + version: 2.4.1 + cross-env: + specifier: ~7.0.3 + version: 7.0.3 + eslint: + specifier: ^8.49.0 + version: 8.52.0 + mocha: + specifier: ~10.2.0 + version: 10.2.0 + mocha-junit-reporter: + specifier: ~2.2.1 + version: 2.2.1(mocha@10.2.0) + mocha-multi-reporters: + specifier: ~1.5.1 + version: 1.5.1(mocha@10.2.0) + rimraf: + specifier: ~5.0.1 + version: 5.0.5 + rollup: + specifier: ~3.29.2 + version: 3.29.4 + rollup-plugin-dts: + specifier: ~6.1.0 + version: 6.1.0(rollup@3.29.4)(typescript@5.2.2) + rollup-plugin-postcss: + specifier: ~4.0.2 + version: 4.0.2(postcss@8.4.31) + rollup-plugin-visualizer: + specifier: ~5.9.2 + version: 5.9.2(rollup@3.29.4) + typescript: + specifier: ~5.2.2 + version: 5.2.2 + vite: + specifier: ^4.4.9 + version: 4.5.0(@types/node@18.11.19) + + ../../core/packages/playground-website: + dependencies: + '@typespec/compiler': + specifier: workspace:~0.51.0 + version: link:../compiler + '@typespec/html-program-viewer': + specifier: workspace:~0.51.0 + version: link:../html-program-viewer + '@typespec/http': + specifier: workspace:~0.51.0 + version: link:../http + '@typespec/json-schema': + specifier: workspace:~0.51.0 + version: link:../json-schema + '@typespec/openapi': + specifier: workspace:~0.51.0 + version: link:../openapi + '@typespec/openapi3': + specifier: workspace:~0.51.0 + version: link:../openapi3 + '@typespec/playground': + specifier: workspace:~0.1.0-alpha.4 + version: link:../playground + '@typespec/protobuf': + specifier: workspace:~0.51.0 + version: link:../protobuf + '@typespec/rest': + specifier: workspace:~0.51.0 + version: link:../rest + '@typespec/versioning': + specifier: workspace:~0.51.0 + version: link:../versioning + es-module-shims: + specifier: ~1.8.0 + version: 1.8.1 + react: + specifier: ~18.2.0 + version: 18.2.0 + react-dom: + specifier: ~18.2.0 + version: 18.2.0(react@18.2.0) + devDependencies: + '@babel/core': + specifier: ^7.22.20 + version: 7.23.2 + '@playwright/test': + specifier: ^1.39.0 + version: 1.39.0 + '@types/debounce': + specifier: ~1.2.1 + version: 1.2.3 + '@types/mocha': + specifier: ~10.0.1 + version: 10.0.3 + '@types/node': + specifier: ~18.11.9 + version: 18.11.19 + '@types/react': + specifier: ~18.2.22 + version: 18.2.34 + '@types/react-dom': + specifier: ~18.2.7 + version: 18.2.14 + '@types/swagger-ui': + specifier: ~3.52.0 + version: 3.52.3 + '@types/swagger-ui-react': + specifier: ^4.18.0 + version: 4.18.2 + '@typespec/eslint-config-typespec': + specifier: workspace:~0.51.0 + version: link:../eslint-config-typespec + '@vitejs/plugin-react': + specifier: ~4.1.0 + version: 4.1.1(vite@4.5.0) + c8: + specifier: ~8.0.1 + version: 8.0.1 + cross-env: + specifier: ~7.0.3 + version: 7.0.3 + eslint: + specifier: ^8.49.0 + version: 8.52.0 + mocha: + specifier: ~10.2.0 + version: 10.2.0 + mocha-junit-reporter: + specifier: ~2.2.1 + version: 2.2.1(mocha@10.2.0) + mocha-multi-reporters: + specifier: ~1.5.1 + version: 1.5.1(mocha@10.2.0) + rimraf: + specifier: ~5.0.1 + version: 5.0.5 + rollup-plugin-visualizer: + specifier: ~5.9.2 + version: 5.9.2(rollup@3.29.4) + typescript: + specifier: ~5.2.2 + version: 5.2.2 + vite: + specifier: ^4.4.9 + version: 4.5.0(@types/node@18.11.19) + + ../../core/packages/prettier-plugin-typespec: + dependencies: + prettier: + specifier: ~3.1.0 + version: 3.1.0 + devDependencies: + '@rollup/plugin-commonjs': + specifier: ~25.0.4 + version: 25.0.7(rollup@3.29.4) + '@rollup/plugin-json': + specifier: ~6.0.0 + version: 6.0.1(rollup@3.29.4) + '@rollup/plugin-node-resolve': + specifier: ~15.2.1 + version: 15.2.3(rollup@3.29.4) + '@rollup/plugin-replace': + specifier: ~5.0.2 + version: 5.0.5(rollup@3.29.4) + '@typespec/compiler': + specifier: workspace:~0.51.0 + version: link:../compiler + '@typespec/internal-build-utils': + specifier: workspace:~0.51.0 + version: link:../internal-build-utils + mocha: + specifier: ~10.2.0 + version: 10.2.0 + mocha-junit-reporter: + specifier: ~2.2.1 + version: 2.2.1(mocha@10.2.0) + mocha-multi-reporters: + specifier: ~1.5.1 + version: 1.5.1(mocha@10.2.0) + prettier_2: + specifier: npm:prettier@2.8.7 + version: /prettier@2.8.7 + rollup: + specifier: ~3.29.2 + version: 3.29.4 + + ../../core/packages/protobuf: + devDependencies: + '@types/micromatch': + specifier: ^4.0.2 + version: 4.0.4 + '@types/mocha': + specifier: ~10.0.1 + version: 10.0.3 + '@types/node': + specifier: ~18.11.9 + version: 18.11.19 + '@typespec/compiler': + specifier: workspace:~0.51.0 + version: link:../compiler + '@typespec/eslint-config-typespec': + specifier: workspace:~0.51.0 + version: link:../eslint-config-typespec + '@typespec/eslint-plugin': + specifier: workspace:~0.51.0 + version: link:../eslint-plugin-typespec + '@typespec/tspd': + specifier: workspace:~0.46.0 + version: link:../tspd + c8: + specifier: ~8.0.1 + version: 8.0.1 + eslint: + specifier: ^8.49.0 + version: 8.52.0 + micromatch: + specifier: ^4.0.5 + version: 4.0.5 + mocha: + specifier: ~10.2.0 + version: 10.2.0 + rimraf: + specifier: ~5.0.1 + version: 5.0.5 + typescript: + specifier: ~5.2.2 + version: 5.2.2 + + ../../core/packages/rest: + devDependencies: + '@types/mocha': + specifier: ~10.0.1 + version: 10.0.3 + '@types/node': + specifier: ~18.11.9 + version: 18.11.19 + '@typespec/compiler': + specifier: workspace:~0.51.0 + version: link:../compiler + '@typespec/eslint-config-typespec': + specifier: workspace:~0.51.0 + version: link:../eslint-config-typespec + '@typespec/eslint-plugin': + specifier: workspace:~0.51.0 + version: link:../eslint-plugin-typespec + '@typespec/http': + specifier: workspace:~0.51.0 + version: link:../http + '@typespec/library-linter': + specifier: workspace:~0.51.0 + version: link:../library-linter + '@typespec/tspd': + specifier: workspace:~0.46.0 + version: link:../tspd + c8: + specifier: ~8.0.1 + version: 8.0.1 + eslint: + specifier: ^8.49.0 + version: 8.52.0 + mocha: + specifier: ~10.2.0 + version: 10.2.0 + mocha-junit-reporter: + specifier: ~2.2.1 + version: 2.2.1(mocha@10.2.0) + mocha-multi-reporters: + specifier: ~1.5.1 + version: 1.5.1(mocha@10.2.0) + rimraf: + specifier: ~5.0.1 + version: 5.0.5 + typescript: + specifier: ~5.2.2 + version: 5.2.2 + + ../../core/packages/samples: + dependencies: + '@typespec/best-practices': + specifier: workspace:~0.45.0 + version: link:../best-practices + '@typespec/compiler': + specifier: workspace:~0.51.0 + version: link:../compiler + '@typespec/html-program-viewer': + specifier: workspace:~0.51.0 + version: link:../html-program-viewer + '@typespec/http': + specifier: workspace:~0.51.0 + version: link:../http + '@typespec/json-schema': + specifier: workspace:~0.51.0 + version: link:../json-schema + '@typespec/openapi': + specifier: workspace:~0.51.0 + version: link:../openapi + '@typespec/openapi3': + specifier: workspace:~0.51.0 + version: link:../openapi3 + '@typespec/rest': + specifier: workspace:~0.51.0 + version: link:../rest + '@typespec/versioning': + specifier: workspace:~0.51.0 + version: link:../versioning + devDependencies: + '@types/mocha': + specifier: ~10.0.1 + version: 10.0.3 + '@types/node': + specifier: ~18.11.9 + version: 18.11.19 + '@typespec/eslint-config-typespec': + specifier: workspace:~0.51.0 + version: link:../eslint-config-typespec + '@typespec/internal-build-utils': + specifier: workspace:~0.51.0 + version: link:../internal-build-utils + autorest: + specifier: ~3.3.2 + version: 3.3.2 + cross-env: + specifier: ~7.0.3 + version: 7.0.3 + eslint: + specifier: ^8.49.0 + version: 8.52.0 + mocha: + specifier: ~10.2.0 + version: 10.2.0 + rimraf: + specifier: ~5.0.1 + version: 5.0.5 + typescript: + specifier: ~5.2.2 + version: 5.2.2 + + ../../core/packages/spec: + devDependencies: + '@types/node': + specifier: ~18.11.9 + version: 18.11.19 + '@typespec/internal-build-utils': + specifier: workspace:~0.51.0 + version: link:../internal-build-utils + ecmarkup: + specifier: ~12.0.3 + version: 12.0.3 + + ../../core/packages/tmlanguage-generator: + dependencies: + onigasm: + specifier: ~2.2.5 + version: 2.2.5 + plist: + specifier: ~3.1.0 + version: 3.1.0 + devDependencies: + '@types/node': + specifier: ~18.11.9 + version: 18.11.19 + '@types/plist': + specifier: ~3.0.2 + version: 3.0.4 + '@typespec/eslint-config-typespec': + specifier: workspace:~0.51.0 + version: link:../eslint-config-typespec + eslint: + specifier: ^8.49.0 + version: 8.52.0 + rimraf: + specifier: ~5.0.1 + version: 5.0.5 + typescript: + specifier: ~5.2.2 + version: 5.2.2 + + ../../core/packages/tspd: + dependencies: + '@typespec/compiler': + specifier: workspace:~0.51.0 + version: link:../compiler + picocolors: + specifier: ~1.0.0 + version: 1.0.0 + prettier: + specifier: ~3.1.0 + version: 3.1.0 + yaml: + specifier: ~2.3.2 + version: 2.3.3 + yargs: + specifier: ~17.7.2 + version: 17.7.2 + devDependencies: + '@types/mocha': + specifier: ~10.0.1 + version: 10.0.3 + '@types/node': + specifier: ~18.11.9 + version: 18.11.19 + '@types/yargs': + specifier: ~17.0.24 + version: 17.0.29 + '@typespec/eslint-config-typespec': + specifier: workspace:~0.51.0 + version: link:../eslint-config-typespec + '@typespec/prettier-plugin-typespec': + specifier: workspace:~0.51.0 + version: link:../prettier-plugin-typespec + c8: + specifier: ~8.0.1 + version: 8.0.1 + eslint: + specifier: ^8.49.0 + version: 8.52.0 + mocha: + specifier: ~10.2.0 + version: 10.2.0 + mocha-junit-reporter: + specifier: ~2.2.1 + version: 2.2.1(mocha@10.2.0) + mocha-multi-reporters: + specifier: ~1.5.1 + version: 1.5.1(mocha@10.2.0) + rimraf: + specifier: ~5.0.1 + version: 5.0.5 + source-map-support: + specifier: ~0.5.21 + version: 0.5.21 + typedoc: + specifier: 0.25.2 + version: 0.25.2(typescript@5.2.2) + typedoc-plugin-markdown: + specifier: ~4.0.0-next.22 + version: 4.0.0-next.25(typedoc@0.25.2) + typescript: + specifier: ~5.2.2 + version: 5.2.2 + + ../../core/packages/typespec-vs: + devDependencies: + '@typespec/internal-build-utils': + specifier: workspace:~0.51.0 + version: link:../internal-build-utils + typespec-vscode: + specifier: workspace:~0.51.0 + version: link:../typespec-vscode + + ../../core/packages/typespec-vscode: + devDependencies: + '@rollup/plugin-commonjs': + specifier: ~25.0.4 + version: 25.0.7(rollup@3.29.4) + '@rollup/plugin-node-resolve': + specifier: ~15.2.1 + version: 15.2.3(rollup@3.29.4) + '@types/mocha': + specifier: ~10.0.1 + version: 10.0.3 + '@types/node': + specifier: ~18.11.9 + version: 18.11.19 + '@types/vscode': + specifier: ~1.82.0 + version: 1.82.0 + '@typespec/compiler': + specifier: workspace:~0.51.0 + version: link:../compiler + '@typespec/eslint-config-typespec': + specifier: workspace:~0.51.0 + version: link:../eslint-config-typespec + '@typespec/internal-build-utils': + specifier: workspace:~0.51.0 + version: link:../internal-build-utils + '@vscode/vsce': + specifier: ~2.21.0 + version: 2.21.1 + c8: + specifier: ~8.0.1 + version: 8.0.1 + eslint: + specifier: ^8.49.0 + version: 8.52.0 + mocha: + specifier: ~10.2.0 + version: 10.2.0 + mocha-junit-reporter: + specifier: ~2.2.1 + version: 2.2.1(mocha@10.2.0) + mocha-multi-reporters: + specifier: ~1.5.1 + version: 1.5.1(mocha@10.2.0) + rimraf: + specifier: ~5.0.1 + version: 5.0.5 + rollup: + specifier: ~3.29.2 + version: 3.29.4 + typescript: + specifier: ~5.2.2 + version: 5.2.2 + vscode-languageclient: + specifier: ~9.0.0 + version: 9.0.1 + + ../../core/packages/versioning: + devDependencies: + '@types/mocha': + specifier: ~10.0.1 + version: 10.0.3 + '@types/node': + specifier: ~18.11.9 + version: 18.11.19 + '@typespec/compiler': + specifier: workspace:~0.51.0 + version: link:../compiler + '@typespec/eslint-config-typespec': + specifier: workspace:~0.51.0 + version: link:../eslint-config-typespec + '@typespec/eslint-plugin': + specifier: workspace:~0.51.0 + version: link:../eslint-plugin-typespec + '@typespec/library-linter': + specifier: workspace:~0.51.0 + version: link:../library-linter + '@typespec/tspd': + specifier: workspace:~0.46.0 + version: link:../tspd + c8: + specifier: ~8.0.1 + version: 8.0.1 + eslint: + specifier: ^8.49.0 + version: 8.52.0 + mocha: + specifier: ~10.2.0 + version: 10.2.0 + mocha-junit-reporter: + specifier: ~2.2.1 + version: 2.2.1(mocha@10.2.0) + mocha-multi-reporters: + specifier: ~1.5.1 + version: 1.5.1(mocha@10.2.0) + rimraf: + specifier: ~5.0.1 + version: 5.0.5 + typescript: + specifier: ~5.2.2 + version: 5.2.2 + + ../../core/packages/website: + dependencies: + '@docusaurus/core': + specifier: ^3.0.0 + version: 3.0.0(@docusaurus/types@3.0.0)(@swc/core@1.3.95)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/plugin-content-docs': + specifier: ~3.0.0 + version: 3.0.0(@swc/core@1.3.95)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/preset-classic': + specifier: ^3.0.0 + version: 3.0.0(@algolia/client-search@4.20.0)(@swc/core@1.3.95)(@types/react@18.2.34)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.9.0)(typescript@5.2.2) + '@docusaurus/theme-common': + specifier: ~3.0.0 + version: 3.0.0(@docusaurus/types@3.0.0)(@swc/core@1.3.95)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/theme-mermaid': + specifier: ^3.0.0 + version: 3.0.0(@swc/core@1.3.95)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@fluentui/react-components': + specifier: ~9.32.1 + version: 9.32.3(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2) + '@mdx-js/react': + specifier: ^3.0.0 + version: 3.0.0(@types/react@18.2.34)(react@18.2.0) + '@typespec/playground': + specifier: workspace:~0.1.0-alpha.4 + version: link:../playground + es-module-shims: + specifier: ~1.8.0 + version: 1.8.1 + prism-react-renderer: + specifier: ^2.1.0 + version: 2.1.0(react@18.2.0) + prismjs: + specifier: ~1.29.0 + version: 1.29.0 + react: + specifier: ~18.2.0 + version: 18.2.0 + react-dom: + specifier: ~18.2.0 + version: 18.2.0(react@18.2.0) + devDependencies: + '@docusaurus/module-type-aliases': + specifier: ^3.0.0 + version: 3.0.0(@swc/core@1.3.95)(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/tsconfig': + specifier: ^3.0.0 + version: 3.0.0 + '@docusaurus/types': + specifier: ^3.0.0 + version: 3.0.0(@swc/core@1.3.95)(react-dom@18.2.0)(react@18.2.0) + '@swc/core': + specifier: ^1.3.62 + version: 1.3.95 + '@types/node': + specifier: ~18.11.9 + version: 18.11.19 + '@types/react': + specifier: ~18.2.22 + version: 18.2.34 + '@typespec/compiler': + specifier: workspace:~0.51.0 + version: link:../compiler + '@typespec/eslint-config-typespec': + specifier: workspace:~0.51.0 + version: link:../eslint-config-typespec + '@typespec/http': + specifier: workspace:~0.51.0 + version: link:../http + '@typespec/json-schema': + specifier: workspace:~0.51.0 + version: link:../json-schema + '@typespec/openapi': + specifier: workspace:~0.51.0 + version: link:../openapi + '@typespec/openapi3': + specifier: workspace:~0.51.0 + version: link:../openapi3 + '@typespec/playground-website': + specifier: workspace:* + version: link:../playground-website + '@typespec/protobuf': + specifier: workspace:~0.51.0 + version: link:../protobuf + '@typespec/rest': + specifier: workspace:~0.51.0 + version: link:../rest + '@typespec/spec': + specifier: workspace:* + version: link:../spec + '@typespec/tspd': + specifier: workspace:~0.46.0 + version: link:../tspd + '@typespec/versioning': + specifier: workspace:~0.51.0 + version: link:../versioning + dotenv: + specifier: ~16.3.1 + version: 16.3.1 + eslint: + specifier: ^8.49.0 + version: 8.52.0 + file-loader: + specifier: ~6.2.0 + version: 6.2.0(webpack@5.89.0) + mermaid: + specifier: ~10.4.0 + version: 10.4.0 + monaco-editor-webpack-plugin: + specifier: ~7.1.0 + version: 7.1.0(monaco-editor@0.43.0)(webpack@5.89.0) + playwright: + specifier: ^1.39.0 + version: 1.39.0 + prism-themes: + specifier: ~1.9.0 + version: 1.9.0 + raw-loader: + specifier: ~4.0.2 + version: 4.0.2(webpack@5.89.0) + rimraf: + specifier: ~5.0.1 + version: 5.0.5 + swc-loader: + specifier: ^0.2.3 + version: 0.2.3(@swc/core@1.3.95)(webpack@5.89.0) + typescript: + specifier: ~5.2.2 + version: 5.2.2 + + ../../packages/e2e-tests: + devDependencies: + '@typespec/compiler': + specifier: workspace:~0.51.0 + version: link:../../core/packages/compiler + dotenv: + specifier: ~16.3.1 + version: 16.3.1 + typescript: + specifier: ~5.2.2 + version: 5.2.2 + + ../../packages/samples: + dependencies: + '@azure-tools/typespec-autorest': + specifier: workspace:~0.37.1 + version: link:../typespec-autorest + '@azure-tools/typespec-azure-core': + specifier: workspace:~0.37.1 + version: link:../typespec-azure-core + '@azure-tools/typespec-azure-resource-manager': + specifier: workspace:~0.37.0 + version: link:../typespec-azure-resource-manager + '@azure-tools/typespec-client-generator-core': + specifier: workspace:~0.37.0 + version: link:../typespec-client-generator-core + '@typespec/compiler': + specifier: workspace:~0.51.0 + version: link:../../core/packages/compiler + '@typespec/http': + specifier: workspace:~0.51.0 + version: link:../../core/packages/http + '@typespec/openapi': + specifier: workspace:~0.51.0 + version: link:../../core/packages/openapi + '@typespec/openapi3': + specifier: workspace:~0.51.0 + version: link:../../core/packages/openapi3 + '@typespec/rest': + specifier: workspace:~0.51.0 + version: link:../../core/packages/rest + '@typespec/versioning': + specifier: workspace:~0.51.0 + version: link:../../core/packages/versioning + devDependencies: + '@types/mocha': + specifier: ~10.0.1 + version: 10.0.3 + '@types/node': + specifier: ~18.11.9 + version: 18.11.19 + '@typespec/eslint-config-typespec': + specifier: workspace:~0.51.0 + version: link:../../core/packages/eslint-config-typespec + '@typespec/internal-build-utils': + specifier: workspace:~0.51.0 + version: link:../../core/packages/internal-build-utils + '@typespec/samples': + specifier: workspace:~1.0.0 + version: link:../../core/packages/samples + autorest: + specifier: ~3.3.2 + version: 3.3.2 + cross-env: + specifier: ~7.0.3 + version: 7.0.3 + eslint: + specifier: ^8.49.0 + version: 8.52.0 + mocha: + specifier: ~10.2.0 + version: 10.2.0 + rimraf: + specifier: ~5.0.1 + version: 5.0.5 + typescript: + specifier: ~5.2.2 + version: 5.2.2 + + ../../packages/typespec-autorest: + devDependencies: + '@azure-tools/typespec-azure-core': + specifier: workspace:~0.37.1 + version: link:../typespec-azure-core + '@types/mocha': + specifier: ~10.0.1 + version: 10.0.3 + '@types/node': + specifier: ~18.11.9 + version: 18.11.19 + '@typespec/compiler': + specifier: workspace:~0.51.0 + version: link:../../core/packages/compiler + '@typespec/eslint-config-typespec': + specifier: workspace:~0.51.0 + version: link:../../core/packages/eslint-config-typespec + '@typespec/eslint-plugin': + specifier: workspace:~0.51.0 + version: link:../../core/packages/eslint-plugin-typespec + '@typespec/http': + specifier: workspace:~0.51.0 + version: link:../../core/packages/http + '@typespec/json-schema': + specifier: workspace:~0.51.0 + version: link:../../core/packages/json-schema + '@typespec/library-linter': + specifier: workspace:~0.51.0 + version: link:../../core/packages/library-linter + '@typespec/openapi': + specifier: workspace:~0.51.0 + version: link:../../core/packages/openapi + '@typespec/rest': + specifier: workspace:~0.51.0 + version: link:../../core/packages/rest + '@typespec/tspd': + specifier: workspace:~0.46.0 + version: link:../../core/packages/tspd + '@typespec/versioning': + specifier: workspace:~0.51.0 + version: link:../../core/packages/versioning + c8: + specifier: ~8.0.1 + version: 8.0.1 + change-case: + specifier: ~4.1.2 + version: 4.1.2 + eslint: + specifier: ^8.49.0 + version: 8.52.0 + mocha: + specifier: ~10.2.0 + version: 10.2.0 + mocha-junit-reporter: + specifier: ~2.2.1 + version: 2.2.1(mocha@10.2.0) + mocha-multi-reporters: + specifier: ~1.5.1 + version: 1.5.1(mocha@10.2.0) + rimraf: + specifier: ~5.0.1 + version: 5.0.5 + typescript: + specifier: ~5.2.2 + version: 5.2.2 + + ../../packages/typespec-azure-core: + devDependencies: + '@types/mocha': + specifier: ~10.0.1 + version: 10.0.3 + '@types/node': + specifier: ~18.11.9 + version: 18.11.19 + '@typespec/compiler': + specifier: workspace:~0.51.0 + version: link:../../core/packages/compiler + '@typespec/eslint-config-typespec': + specifier: workspace:~0.51.0 + version: link:../../core/packages/eslint-config-typespec + '@typespec/eslint-plugin': + specifier: workspace:~0.51.0 + version: link:../../core/packages/eslint-plugin-typespec + '@typespec/http': + specifier: workspace:~0.51.0 + version: link:../../core/packages/http + '@typespec/library-linter': + specifier: workspace:~0.51.0 + version: link:../../core/packages/library-linter + '@typespec/openapi': + specifier: workspace:~0.51.0 + version: link:../../core/packages/openapi + '@typespec/rest': + specifier: workspace:~0.51.0 + version: link:../../core/packages/rest + '@typespec/tspd': + specifier: workspace:~0.46.0 + version: link:../../core/packages/tspd + '@typespec/versioning': + specifier: workspace:~0.51.0 + version: link:../../core/packages/versioning + c8: + specifier: ~8.0.1 + version: 8.0.1 + eslint: + specifier: ^8.49.0 + version: 8.52.0 + mocha: + specifier: ~10.2.0 + version: 10.2.0 + mocha-junit-reporter: + specifier: ~2.2.1 + version: 2.2.1(mocha@10.2.0) + mocha-multi-reporters: + specifier: ~1.5.1 + version: 1.5.1(mocha@10.2.0) + rimraf: + specifier: ~5.0.1 + version: 5.0.5 + typescript: + specifier: ~5.2.2 + version: 5.2.2 + + ../../packages/typespec-azure-playground-website: + dependencies: + '@azure-tools/typespec-autorest': + specifier: workspace:~0.37.1 + version: link:../typespec-autorest + '@azure-tools/typespec-azure-core': + specifier: workspace:~0.37.1 + version: link:../typespec-azure-core + '@azure-tools/typespec-azure-resource-manager': + specifier: workspace:~0.37.0 + version: link:../typespec-azure-resource-manager + '@azure-tools/typespec-client-generator-core': + specifier: workspace:~0.37.0 + version: link:../typespec-client-generator-core + '@emotion/react': + specifier: ^11.11.1 + version: 11.11.1(@types/react@18.2.34)(react@18.2.0) + '@typespec/compiler': + specifier: workspace:~0.51.0 + version: link:../../core/packages/compiler + '@typespec/http': + specifier: workspace:~0.51.0 + version: link:../../core/packages/http + '@typespec/openapi': + specifier: workspace:~0.51.0 + version: link:../../core/packages/openapi + '@typespec/openapi3': + specifier: workspace:~0.51.0 + version: link:../../core/packages/openapi3 + '@typespec/rest': + specifier: workspace:~0.51.0 + version: link:../../core/packages/rest + '@typespec/versioning': + specifier: workspace:~0.51.0 + version: link:../../core/packages/versioning + '@vitejs/plugin-react': + specifier: ~4.1.0 + version: 4.1.1(vite@4.5.0) + es-module-shims: + specifier: ~1.8.0 + version: 1.8.1 + monaco-editor: + specifier: ~0.43.0 + version: 0.43.0 + react: + specifier: ~18.2.0 + version: 18.2.0 + react-dom: + specifier: ~18.2.0 + version: 18.2.0(react@18.2.0) + vite: + specifier: ^4.4.9 + version: 4.5.0(@types/node@18.11.19) + devDependencies: + '@playwright/test': + specifier: ^1.39.0 + version: 1.39.0 + '@types/node': + specifier: ~18.11.9 + version: 18.11.19 + '@types/react-dom': + specifier: ~18.2.7 + version: 18.2.14 + '@typespec/bundler': + specifier: workspace:~0.1.0-alpha.4 + version: link:../../core/packages/bundler + '@typespec/eslint-config-typespec': + specifier: workspace:~0.51.0 + version: link:../../core/packages/eslint-config-typespec + '@typespec/playground': + specifier: workspace:~0.1.0-alpha.4 + version: link:../../core/packages/playground + cross-env: + specifier: ~7.0.3 + version: 7.0.3 + eslint: + specifier: ^8.49.0 + version: 8.52.0 + rimraf: + specifier: ~5.0.1 + version: 5.0.5 + typescript: + specifier: ~5.2.2 + version: 5.2.2 + + ../../packages/typespec-azure-resource-manager: + devDependencies: + '@azure-tools/typespec-autorest': + specifier: workspace:~0.37.1 + version: link:../typespec-autorest + '@azure-tools/typespec-azure-core': + specifier: workspace:~0.37.1 + version: link:../typespec-azure-core + '@types/mocha': + specifier: ~10.0.1 + version: 10.0.3 + '@types/node': + specifier: ~18.11.9 + version: 18.11.19 + '@typespec/compiler': + specifier: workspace:~0.51.0 + version: link:../../core/packages/compiler + '@typespec/eslint-config-typespec': + specifier: workspace:~0.51.0 + version: link:../../core/packages/eslint-config-typespec + '@typespec/eslint-plugin': + specifier: workspace:~0.51.0 + version: link:../../core/packages/eslint-plugin-typespec + '@typespec/http': + specifier: workspace:~0.51.0 + version: link:../../core/packages/http + '@typespec/library-linter': + specifier: workspace:~0.51.0 + version: link:../../core/packages/library-linter + '@typespec/openapi': + specifier: workspace:~0.51.0 + version: link:../../core/packages/openapi + '@typespec/rest': + specifier: workspace:~0.51.0 + version: link:../../core/packages/rest + '@typespec/tspd': + specifier: workspace:~0.46.0 + version: link:../../core/packages/tspd + '@typespec/versioning': + specifier: workspace:~0.51.0 + version: link:../../core/packages/versioning + c8: + specifier: ~8.0.1 + version: 8.0.1 + eslint: + specifier: ^8.49.0 + version: 8.52.0 + mocha: + specifier: ~10.2.0 + version: 10.2.0 + mocha-junit-reporter: + specifier: ~2.2.1 + version: 2.2.1(mocha@10.2.0) + mocha-multi-reporters: + specifier: ~1.5.1 + version: 1.5.1(mocha@10.2.0) + rimraf: + specifier: ~5.0.1 + version: 5.0.5 + typescript: + specifier: ~5.2.2 + version: 5.2.2 + + ../../packages/typespec-client-generator-core: + dependencies: + change-case: + specifier: ~4.1.2 + version: 4.1.2 + pluralize: + specifier: ^8.0.0 + version: 8.0.0 + devDependencies: + '@azure-tools/typespec-azure-core': + specifier: workspace:~0.37.1 + version: link:../typespec-azure-core + '@types/mocha': + specifier: ~10.0.1 + version: 10.0.3 + '@types/node': + specifier: ~18.11.9 + version: 18.11.19 + '@types/pluralize': + specifier: ^0.0.30 + version: 0.0.30 + '@typespec/compiler': + specifier: workspace:~0.51.0 + version: link:../../core/packages/compiler + '@typespec/eslint-config-typespec': + specifier: workspace:~0.51.0 + version: link:../../core/packages/eslint-config-typespec + '@typespec/eslint-plugin': + specifier: workspace:~0.51.0 + version: link:../../core/packages/eslint-plugin-typespec + '@typespec/http': + specifier: workspace:~0.51.0 + version: link:../../core/packages/http + '@typespec/library-linter': + specifier: workspace:~0.51.0 + version: link:../../core/packages/library-linter + '@typespec/prettier-plugin-typespec': + specifier: workspace:~0.51.0 + version: link:../../core/packages/prettier-plugin-typespec + '@typespec/rest': + specifier: workspace:~0.51.0 + version: link:../../core/packages/rest + '@typespec/tspd': + specifier: workspace:~0.46.0 + version: link:../../core/packages/tspd + '@typespec/versioning': + specifier: workspace:~0.51.0 + version: link:../../core/packages/versioning + c8: + specifier: ~8.0.1 + version: 8.0.1 + eslint: + specifier: ^8.49.0 + version: 8.52.0 + mocha: + specifier: ~10.2.0 + version: 10.2.0 + mocha-junit-reporter: + specifier: ~2.2.1 + version: 2.2.1(mocha@10.2.0) + mocha-multi-reporters: + specifier: ~1.5.1 + version: 1.5.1(mocha@10.2.0) + rimraf: + specifier: ~5.0.1 + version: 5.0.5 + typescript: + specifier: ~5.2.2 + version: 5.2.2 + + ../../packages/typespec-diff: + dependencies: + '@typespec/compiler': + specifier: workspace:~0.51.0 + version: link:../../core/packages/compiler + '@typespec/http': + specifier: workspace:~0.51.0 + version: link:../../core/packages/http + '@typespec/openapi': + specifier: workspace:~0.51.0 + version: link:../../core/packages/openapi + '@typespec/rest': + specifier: workspace:~0.51.0 + version: link:../../core/packages/rest + '@typespec/versioning': + specifier: workspace:~0.51.0 + version: link:../../core/packages/versioning + ajv: + specifier: ~8.12.0 + version: 8.12.0 + js-yaml: + specifier: ~4.1.0 + version: 4.1.0 + lodash: + specifier: ~4.17.21 + version: 4.17.21 + picocolors: + specifier: ~1.0.0 + version: 1.0.0 + yargs: + specifier: ~17.7.2 + version: 17.7.2 + devDependencies: + '@azure-tools/typespec-azure-core': + specifier: workspace:~0.37.1 + version: link:../typespec-azure-core + '@azure-tools/typespec-azure-resource-manager': + specifier: workspace:~0.37.0 + version: link:../typespec-azure-resource-manager + '@types/js-yaml': + specifier: ~4.0.1 + version: 4.0.8 + '@types/lodash': + specifier: 4.14.191 + version: 4.14.191 + '@types/mocha': + specifier: ~10.0.1 + version: 10.0.3 + '@types/node': + specifier: ~18.11.9 + version: 18.11.19 + '@types/yargs': + specifier: ~17.0.24 + version: 17.0.29 + '@typespec/eslint-config-typespec': + specifier: workspace:~0.51.0 + version: link:../../core/packages/eslint-config-typespec + '@typespec/eslint-plugin': + specifier: workspace:~0.51.0 + version: link:../../core/packages/eslint-plugin-typespec + '@typespec/library-linter': + specifier: workspace:~0.51.0 + version: link:../../core/packages/library-linter + c8: + specifier: ~8.0.1 + version: 8.0.1 + eslint: + specifier: ^8.49.0 + version: 8.52.0 + mocha: + specifier: ~10.2.0 + version: 10.2.0 + mocha-junit-reporter: + specifier: ~2.2.1 + version: 2.2.1(mocha@10.2.0) + mocha-multi-reporters: + specifier: ~1.5.1 + version: 1.5.1(mocha@10.2.0) + rimraf: + specifier: ~5.0.1 + version: 5.0.5 + typescript: + specifier: ~5.2.2 + version: 5.2.2 + + ../../packages/typespec-service-csharp: + dependencies: + '@typespec/versioning': + specifier: workspace:~0.51.0 + version: link:../../core/packages/versioning + change-case: + specifier: ~4.1.2 + version: 4.1.2 + devDependencies: + '@azure-tools/typespec-autorest': + specifier: workspace:~0.37.1 + version: link:../typespec-autorest + '@azure-tools/typespec-azure-core': + specifier: workspace:~0.37.1 + version: link:../typespec-azure-core + '@types/mocha': + specifier: ~10.0.1 + version: 10.0.3 + '@types/node': + specifier: ~18.11.9 + version: 18.11.19 + '@typespec/compiler': + specifier: workspace:~0.51.0 + version: link:../../core/packages/compiler + '@typespec/eslint-config-typespec': + specifier: workspace:~0.51.0 + version: link:../../core/packages/eslint-config-typespec + '@typespec/eslint-plugin': + specifier: workspace:~0.51.0 + version: link:../../core/packages/eslint-plugin-typespec + '@typespec/http': + specifier: workspace:~0.51.0 + version: link:../../core/packages/http + '@typespec/library-linter': + specifier: workspace:~0.51.0 + version: link:../../core/packages/library-linter + '@typespec/openapi': + specifier: workspace:~0.51.0 + version: link:../../core/packages/openapi + '@typespec/rest': + specifier: workspace:~0.51.0 + version: link:../../core/packages/rest + '@typespec/tspd': + specifier: workspace:~0.46.0 + version: link:../../core/packages/tspd + c8: + specifier: ~8.0.1 + version: 8.0.1 + eslint: + specifier: ^8.49.0 + version: 8.52.0 + mocha: + specifier: ~10.2.0 + version: 10.2.0 + mocha-junit-reporter: + specifier: ~2.2.1 + version: 2.2.1(mocha@10.2.0) + mocha-multi-reporters: + specifier: ~1.5.1 + version: 1.5.1(mocha@10.2.0) + rimraf: + specifier: ~5.0.1 + version: 5.0.5 + typescript: + specifier: ~5.2.2 + version: 5.2.2 + + ../../packages/website: + dependencies: + '@docusaurus/core': + specifier: ^3.0.0 + version: 3.0.0(@docusaurus/types@3.0.0)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/plugin-content-docs': + specifier: ~3.0.0 + version: 3.0.0(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/preset-classic': + specifier: ^3.0.0 + version: 3.0.0(@algolia/client-search@4.20.0)(@types/react@18.2.34)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.9.0)(typescript@5.2.2) + '@docusaurus/theme-common': + specifier: ~3.0.0 + version: 3.0.0(@docusaurus/types@3.0.0)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@fluentui/react-components': + specifier: ~9.32.1 + version: 9.32.3(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2) + '@mdx-js/react': + specifier: ^3.0.0 + version: 3.0.0(@types/react@18.2.34)(react@18.2.0) + '@typespec/playground': + specifier: workspace:~0.1.0-alpha.4 + version: link:../../core/packages/playground + '@typespec/website': + specifier: workspace:~1.0.0 + version: link:../../core/packages/website + clsx: + specifier: ~2.0.0 + version: 2.0.0 + es-module-shims: + specifier: ~1.8.0 + version: 1.8.1 + prism-react-renderer: + specifier: ^2.1.0 + version: 2.1.0(react@18.2.0) + prismjs: + specifier: ~1.29.0 + version: 1.29.0 + react: + specifier: ~18.2.0 + version: 18.2.0 + react-dom: + specifier: ~18.2.0 + version: 18.2.0(react@18.2.0) + devDependencies: + '@azure-tools/typespec-azure-core': + specifier: workspace:~0.37.1 + version: link:../typespec-azure-core + '@azure-tools/typespec-azure-playground-website': + specifier: workspace:~1.0.0 + version: link:../typespec-azure-playground-website + '@azure-tools/typespec-azure-resource-manager': + specifier: workspace:~0.37.0 + version: link:../typespec-azure-resource-manager + '@azure-tools/typespec-client-generator-core': + specifier: workspace:~0.37.0 + version: link:../typespec-client-generator-core + '@azure-tools/typespec-service-csharp': + specifier: workspace:~0.32.0 + version: link:../typespec-service-csharp + '@docusaurus/module-type-aliases': + specifier: ^3.0.0 + version: 3.0.0(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/tsconfig': + specifier: ^3.0.0 + version: 3.0.0 + '@docusaurus/types': + specifier: ^3.0.0 + version: 3.0.0(react-dom@18.2.0)(react@18.2.0) + '@types/node': + specifier: ~18.11.9 + version: 18.11.19 + '@types/react': + specifier: ~18.2.22 + version: 18.2.34 + '@typespec/eslint-config-typespec': + specifier: workspace:~0.51.0 + version: link:../../core/packages/eslint-config-typespec + '@typespec/tspd': + specifier: workspace:~0.46.0 + version: link:../../core/packages/tspd + dotenv: + specifier: ~16.3.1 + version: 16.3.1 + eslint: + specifier: ^8.49.0 + version: 8.52.0 + file-loader: + specifier: ~6.2.0 + version: 6.2.0(webpack@5.89.0) + monaco-editor-webpack-plugin: + specifier: ~7.1.0 + version: 7.1.0(monaco-editor@0.43.0)(webpack@5.89.0) + rimraf: + specifier: ~5.0.1 + version: 5.0.5 + typescript: + specifier: ~5.2.2 + version: 5.2.2 + +packages: + + /@aashutoshrathi/word-wrap@1.2.6: + resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} + engines: {node: '>=0.10.0'} + + /@algolia/autocomplete-core@1.9.3(@algolia/client-search@4.20.0)(algoliasearch@4.20.0)(search-insights@2.9.0): + resolution: {integrity: sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==} + dependencies: + '@algolia/autocomplete-plugin-algolia-insights': 1.9.3(@algolia/client-search@4.20.0)(algoliasearch@4.20.0)(search-insights@2.9.0) + '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.20.0)(algoliasearch@4.20.0) + transitivePeerDependencies: + - '@algolia/client-search' + - algoliasearch + - search-insights + dev: false + + /@algolia/autocomplete-plugin-algolia-insights@1.9.3(@algolia/client-search@4.20.0)(algoliasearch@4.20.0)(search-insights@2.9.0): + resolution: {integrity: sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg==} + peerDependencies: + search-insights: '>= 1 < 3' + dependencies: + '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.20.0)(algoliasearch@4.20.0) + search-insights: 2.9.0 + transitivePeerDependencies: + - '@algolia/client-search' + - algoliasearch + dev: false + + /@algolia/autocomplete-preset-algolia@1.9.3(@algolia/client-search@4.20.0)(algoliasearch@4.20.0): + resolution: {integrity: sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA==} + peerDependencies: + '@algolia/client-search': '>= 4.9.1 < 6' + algoliasearch: '>= 4.9.1 < 6' + dependencies: + '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.20.0)(algoliasearch@4.20.0) + '@algolia/client-search': 4.20.0 + algoliasearch: 4.20.0 + dev: false + + /@algolia/autocomplete-shared@1.9.3(@algolia/client-search@4.20.0)(algoliasearch@4.20.0): + resolution: {integrity: sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ==} + peerDependencies: + '@algolia/client-search': '>= 4.9.1 < 6' + algoliasearch: '>= 4.9.1 < 6' + dependencies: + '@algolia/client-search': 4.20.0 + algoliasearch: 4.20.0 + dev: false + + /@algolia/cache-browser-local-storage@4.20.0: + resolution: {integrity: sha512-uujahcBt4DxduBTvYdwO3sBfHuJvJokiC3BP1+O70fglmE1ShkH8lpXqZBac1rrU3FnNYSUs4pL9lBdTKeRPOQ==} + dependencies: + '@algolia/cache-common': 4.20.0 + dev: false + + /@algolia/cache-common@4.20.0: + resolution: {integrity: sha512-vCfxauaZutL3NImzB2G9LjLt36vKAckc6DhMp05An14kVo8F1Yofb6SIl6U3SaEz8pG2QOB9ptwM5c+zGevwIQ==} + dev: false + + /@algolia/cache-in-memory@4.20.0: + resolution: {integrity: sha512-Wm9ak/IaacAZXS4mB3+qF/KCoVSBV6aLgIGFEtQtJwjv64g4ePMapORGmCyulCFwfePaRAtcaTbMcJF+voc/bg==} + dependencies: + '@algolia/cache-common': 4.20.0 + dev: false + + /@algolia/client-account@4.20.0: + resolution: {integrity: sha512-GGToLQvrwo7am4zVkZTnKa72pheQeez/16sURDWm7Seyz+HUxKi3BM6fthVVPUEBhtJ0reyVtuK9ArmnaKl10Q==} + dependencies: + '@algolia/client-common': 4.20.0 + '@algolia/client-search': 4.20.0 + '@algolia/transporter': 4.20.0 + dev: false + + /@algolia/client-analytics@4.20.0: + resolution: {integrity: sha512-EIr+PdFMOallRdBTHHdKI3CstslgLORQG7844Mq84ib5oVFRVASuuPmG4bXBgiDbcsMLUeOC6zRVJhv1KWI0ug==} + dependencies: + '@algolia/client-common': 4.20.0 + '@algolia/client-search': 4.20.0 + '@algolia/requester-common': 4.20.0 + '@algolia/transporter': 4.20.0 + dev: false + + /@algolia/client-common@4.20.0: + resolution: {integrity: sha512-P3WgMdEss915p+knMMSd/fwiHRHKvDu4DYRrCRaBrsfFw7EQHon+EbRSm4QisS9NYdxbS04kcvNoavVGthyfqQ==} + dependencies: + '@algolia/requester-common': 4.20.0 + '@algolia/transporter': 4.20.0 + dev: false + + /@algolia/client-personalization@4.20.0: + resolution: {integrity: sha512-N9+zx0tWOQsLc3K4PVRDV8GUeOLAY0i445En79Pr3zWB+m67V+n/8w4Kw1C5LlbHDDJcyhMMIlqezh6BEk7xAQ==} + dependencies: + '@algolia/client-common': 4.20.0 + '@algolia/requester-common': 4.20.0 + '@algolia/transporter': 4.20.0 + dev: false + + /@algolia/client-search@4.20.0: + resolution: {integrity: sha512-zgwqnMvhWLdpzKTpd3sGmMlr4c+iS7eyyLGiaO51zDZWGMkpgoNVmltkzdBwxOVXz0RsFMznIxB9zuarUv4TZg==} + dependencies: + '@algolia/client-common': 4.20.0 + '@algolia/requester-common': 4.20.0 + '@algolia/transporter': 4.20.0 + dev: false + + /@algolia/events@4.0.1: + resolution: {integrity: sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==} + dev: false + + /@algolia/logger-common@4.20.0: + resolution: {integrity: sha512-xouigCMB5WJYEwvoWW5XDv7Z9f0A8VoXJc3VKwlHJw/je+3p2RcDXfksLI4G4lIVncFUYMZx30tP/rsdlvvzHQ==} + dev: false + + /@algolia/logger-console@4.20.0: + resolution: {integrity: sha512-THlIGG1g/FS63z0StQqDhT6bprUczBI8wnLT3JWvfAQDZX5P6fCg7dG+pIrUBpDIHGszgkqYEqECaKKsdNKOUA==} + dependencies: + '@algolia/logger-common': 4.20.0 + dev: false + + /@algolia/requester-browser-xhr@4.20.0: + resolution: {integrity: sha512-HbzoSjcjuUmYOkcHECkVTwAelmvTlgs48N6Owt4FnTOQdwn0b8pdht9eMgishvk8+F8bal354nhx/xOoTfwiAw==} + dependencies: + '@algolia/requester-common': 4.20.0 + dev: false + + /@algolia/requester-common@4.20.0: + resolution: {integrity: sha512-9h6ye6RY/BkfmeJp7Z8gyyeMrmmWsMOCRBXQDs4mZKKsyVlfIVICpcSibbeYcuUdurLhIlrOUkH3rQEgZzonng==} + dev: false + + /@algolia/requester-node-http@4.20.0: + resolution: {integrity: sha512-ocJ66L60ABSSTRFnCHIEZpNHv6qTxsBwJEPfYaSBsLQodm0F9ptvalFkHMpvj5DfE22oZrcrLbOYM2bdPJRHng==} + dependencies: + '@algolia/requester-common': 4.20.0 + dev: false + + /@algolia/transporter@4.20.0: + resolution: {integrity: sha512-Lsii1pGWOAISbzeyuf+r/GPhvHMPHSPrTDWNcIzOE1SG1inlJHICaVe2ikuoRjcpgxZNU54Jl+if15SUCsaTUg==} + dependencies: + '@algolia/cache-common': 4.20.0 + '@algolia/logger-common': 4.20.0 + '@algolia/requester-common': 4.20.0 + dev: false + + /@ampproject/remapping@2.2.1: + resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.20 + + /@azure/abort-controller@1.1.0: + resolution: {integrity: sha512-TrRLIoSQVzfAJX9H1JeFjzAoDGcoK1IYX1UImfceTZpsyYfWr09Ss1aHW1y5TrrR3iq6RZLBwJ3E24uwPhwahw==} + engines: {node: '>=12.0.0'} + dependencies: + tslib: 2.6.2 + dev: false + + /@azure/core-auth@1.5.0: + resolution: {integrity: sha512-udzoBuYG1VBoHVohDTrvKjyzel34zt77Bhp7dQntVGGD0ehVq48owENbBG8fIgkHRNUBQH5k1r0hpoMu5L8+kw==} + engines: {node: '>=14.0.0'} + dependencies: + '@azure/abort-controller': 1.1.0 + '@azure/core-util': 1.6.1 + tslib: 2.6.2 + dev: false + + /@azure/core-client@1.7.3: + resolution: {integrity: sha512-kleJ1iUTxcO32Y06dH9Pfi9K4U+Tlb111WXEnbt7R/ne+NLRwppZiTGJuTD5VVoxTMK5NTbEtm5t2vcdNCFe2g==} + engines: {node: '>=14.0.0'} + dependencies: + '@azure/abort-controller': 1.1.0 + '@azure/core-auth': 1.5.0 + '@azure/core-rest-pipeline': 1.12.2 + '@azure/core-tracing': 1.0.1 + '@azure/core-util': 1.6.1 + '@azure/logger': 1.0.4 + tslib: 2.6.2 + transitivePeerDependencies: + - supports-color + dev: false + + /@azure/core-http@3.0.3: + resolution: {integrity: sha512-QMib3wXotJMFhHgmJBPUF9YsyErw34H0XDFQd9CauH7TPB+RGcyl9Ayy7iURtJB04ngXhE6YwrQsWDXlSLrilg==} + engines: {node: '>=14.0.0'} + dependencies: + '@azure/abort-controller': 1.1.0 + '@azure/core-auth': 1.5.0 + '@azure/core-tracing': 1.0.0-preview.13 + '@azure/core-util': 1.6.1 + '@azure/logger': 1.0.4 + '@types/node-fetch': 2.6.8 + '@types/tunnel': 0.0.3 + form-data: 4.0.0 + node-fetch: 2.7.0 + process: 0.11.10 + tslib: 2.6.2 + tunnel: 0.0.6 + uuid: 8.3.2 + xml2js: 0.5.0 + transitivePeerDependencies: + - encoding + dev: false + + /@azure/core-lro@2.5.4: + resolution: {integrity: sha512-3GJiMVH7/10bulzOKGrrLeG/uCBH/9VtxqaMcB9lIqAeamI/xYQSHJL/KcsLDuH+yTjYpro/u6D/MuRe4dN70Q==} + engines: {node: '>=14.0.0'} + dependencies: + '@azure/abort-controller': 1.1.0 + '@azure/core-util': 1.6.1 + '@azure/logger': 1.0.4 + tslib: 2.6.2 + dev: false + + /@azure/core-paging@1.5.0: + resolution: {integrity: sha512-zqWdVIt+2Z+3wqxEOGzR5hXFZ8MGKK52x4vFLw8n58pR6ZfKRx3EXYTxTaYxYHc/PexPUTyimcTWFJbji9Z6Iw==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.6.2 + dev: false + + /@azure/core-rest-pipeline@1.12.2: + resolution: {integrity: sha512-wLLJQdL4v1yoqYtEtjKNjf8pJ/G/BqVomAWxcKOR1KbZJyCEnCv04yks7Y1NhJ3JzxbDs307W67uX0JzklFdCg==} + engines: {node: '>=16.0.0'} + dependencies: + '@azure/abort-controller': 1.1.0 + '@azure/core-auth': 1.5.0 + '@azure/core-tracing': 1.0.1 + '@azure/core-util': 1.6.1 + '@azure/logger': 1.0.4 + form-data: 4.0.0 + http-proxy-agent: 5.0.0 + https-proxy-agent: 5.0.1 + tslib: 2.6.2 + transitivePeerDependencies: + - supports-color + dev: false + + /@azure/core-tracing@1.0.0-preview.13: + resolution: {integrity: sha512-KxDlhXyMlh2Jhj2ykX6vNEU0Vou4nHr025KoSEiz7cS3BNiHNaZcdECk/DmLkEB0as5T7b/TpRcehJ5yV6NeXQ==} + engines: {node: '>=12.0.0'} + dependencies: + '@opentelemetry/api': 1.6.0 + tslib: 2.6.2 + dev: false + + /@azure/core-tracing@1.0.1: + resolution: {integrity: sha512-I5CGMoLtX+pI17ZdiFJZgxMJApsK6jjfm85hpgp3oazCdq5Wxgh4wMr7ge/TTWW1B5WBuvIOI1fMU/FrOAMKrw==} + engines: {node: '>=12.0.0'} + dependencies: + tslib: 2.6.2 + dev: false + + /@azure/core-util@1.6.1: + resolution: {integrity: sha512-h5taHeySlsV9qxuK64KZxy4iln1BtMYlNt5jbuEFN3UFSAd1EwKg/Gjl5a6tZ/W8t6li3xPnutOx7zbDyXnPmQ==} + engines: {node: '>=16.0.0'} + dependencies: + '@azure/abort-controller': 1.1.0 + tslib: 2.6.2 + dev: false + + /@azure/identity@3.3.2: + resolution: {integrity: sha512-aDLwgMXpNBEXOlfCP9r5Rn+inmbnTbadlOnrKI2dPS9Lpf4gHvpYBV+DEZKttakfJ+qn4iWWb7zONQSO3A4XSA==} + engines: {node: '>=14.0.0'} + dependencies: + '@azure/abort-controller': 1.1.0 + '@azure/core-auth': 1.5.0 + '@azure/core-client': 1.7.3 + '@azure/core-rest-pipeline': 1.12.2 + '@azure/core-tracing': 1.0.1 + '@azure/core-util': 1.6.1 + '@azure/logger': 1.0.4 + '@azure/msal-browser': 2.38.3 + '@azure/msal-common': 13.3.1 + '@azure/msal-node': 1.18.4 + events: 3.3.0 + jws: 4.0.0 + open: 8.4.2 + stoppable: 1.1.0 + tslib: 2.6.2 + uuid: 8.3.2 + transitivePeerDependencies: + - supports-color + dev: false + + /@azure/logger@1.0.4: + resolution: {integrity: sha512-ustrPY8MryhloQj7OWGe+HrYx+aoiOxzbXTtgblbV3xwCqpzUK36phH3XNHQKj3EPonyFUuDTfR3qFhTEAuZEg==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.6.2 + dev: false + + /@azure/msal-browser@2.38.3: + resolution: {integrity: sha512-2WuLFnWWPR1IdvhhysT18cBbkXx1z0YIchVss5AwVA95g7CU5CpT3d+5BcgVGNXDXbUU7/5p0xYHV99V5z8C/A==} + engines: {node: '>=0.8.0'} + dependencies: + '@azure/msal-common': 13.3.1 + dev: false + + /@azure/msal-common@13.3.1: + resolution: {integrity: sha512-Lrk1ozoAtaP/cp53May3v6HtcFSVxdFrg2Pa/1xu5oIvsIwhxW6zSPibKefCOVgd5osgykMi5jjcZHv8XkzZEQ==} + engines: {node: '>=0.8.0'} + dev: false + + /@azure/msal-node@1.18.4: + resolution: {integrity: sha512-Kc/dRvhZ9Q4+1FSfsTFDME/v6+R2Y1fuMty/TfwqE5p9GTPw08BPbKgeWinE8JRHRp+LemjQbUZsn4Q4l6Lszg==} + engines: {node: 10 || 12 || 14 || 16 || 18} + dependencies: + '@azure/msal-common': 13.3.1 + jsonwebtoken: 9.0.2 + uuid: 8.3.2 + dev: false + + /@azure/storage-blob@12.16.0: + resolution: {integrity: sha512-jz33rUSUGUB65FgYrTRgRDjG6hdPHwfvHe+g/UrwVG8MsyLqSxg9TaW7Yuhjxu1v1OZ5xam2NU6+IpCN0xJO8Q==} + engines: {node: '>=14.0.0'} + dependencies: + '@azure/abort-controller': 1.1.0 + '@azure/core-http': 3.0.3 + '@azure/core-lro': 2.5.4 + '@azure/core-paging': 1.5.0 + '@azure/core-tracing': 1.0.0-preview.13 + '@azure/logger': 1.0.4 + events: 3.3.0 + tslib: 2.6.2 + transitivePeerDependencies: + - encoding + dev: false + + /@babel/code-frame@7.12.11: + resolution: {integrity: sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==} + dependencies: + '@babel/highlight': 7.22.20 + dev: true + + /@babel/code-frame@7.16.7: + resolution: {integrity: sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.22.20 + dev: false + + /@babel/code-frame@7.18.6: + resolution: {integrity: sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.22.20 + dev: false + + /@babel/code-frame@7.22.13: + resolution: {integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.22.20 + chalk: 2.4.2 + + /@babel/compat-data@7.23.2: + resolution: {integrity: sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ==} + engines: {node: '>=6.9.0'} + + /@babel/core@7.23.2: + resolution: {integrity: sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.2.1 + '@babel/code-frame': 7.22.13 + '@babel/generator': 7.23.0 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.2) + '@babel/helpers': 7.23.2 + '@babel/parser': 7.23.0 + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.2 + '@babel/types': 7.23.0 + convert-source-map: 2.0.0 + debug: 4.3.4(supports-color@8.1.1) + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + /@babel/generator@7.23.0: + resolution: {integrity: sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.0 + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.20 + jsesc: 2.5.2 + + /@babel/helper-annotate-as-pure@7.22.5: + resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.0 + dev: false + + /@babel/helper-builder-binary-assignment-operator-visitor@7.22.15: + resolution: {integrity: sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.0 + dev: false + + /@babel/helper-compilation-targets@7.22.15: + resolution: {integrity: sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/compat-data': 7.23.2 + '@babel/helper-validator-option': 7.22.15 + browserslist: 4.22.1 + lru-cache: 5.1.1 + semver: 6.3.1 + + /@babel/helper-create-class-features-plugin@7.22.15(@babel/core@7.23.2): + resolution: {integrity: sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-member-expression-to-functions': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.2) + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + semver: 6.3.1 + dev: false + + /@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.23.2): + resolution: {integrity: sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-annotate-as-pure': 7.22.5 + regexpu-core: 5.3.2 + semver: 6.3.1 + dev: false + + /@babel/helper-define-polyfill-provider@0.4.3(@babel/core@7.23.2): + resolution: {integrity: sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + debug: 4.3.4(supports-color@8.1.1) + lodash.debounce: 4.0.8 + resolve: 1.22.8 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/helper-environment-visitor@7.22.20: + resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} + engines: {node: '>=6.9.0'} + + /@babel/helper-function-name@7.23.0: + resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.15 + '@babel/types': 7.23.0 + + /@babel/helper-hoist-variables@7.22.5: + resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.0 + + /@babel/helper-member-expression-to-functions@7.23.0: + resolution: {integrity: sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.0 + dev: false + + /@babel/helper-module-imports@7.22.15: + resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.0 + + /@babel/helper-module-transforms@7.23.0(@babel/core@7.23.2): + resolution: {integrity: sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.20 + + /@babel/helper-optimise-call-expression@7.22.5: + resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.0 + dev: false + + /@babel/helper-plugin-utils@7.22.5: + resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} + engines: {node: '>=6.9.0'} + + /@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.23.2): + resolution: {integrity: sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-wrap-function': 7.22.20 + dev: false + + /@babel/helper-replace-supers@7.22.20(@babel/core@7.23.2): + resolution: {integrity: sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-member-expression-to-functions': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 + dev: false + + /@babel/helper-simple-access@7.22.5: + resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.0 + + /@babel/helper-skip-transparent-expression-wrappers@7.22.5: + resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.0 + dev: false + + /@babel/helper-split-export-declaration@7.22.6: + resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.0 + + /@babel/helper-string-parser@7.22.5: + resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} + engines: {node: '>=6.9.0'} + + /@babel/helper-validator-identifier@7.22.20: + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + engines: {node: '>=6.9.0'} + + /@babel/helper-validator-option@7.22.15: + resolution: {integrity: sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==} + engines: {node: '>=6.9.0'} + + /@babel/helper-wrap-function@7.22.20: + resolution: {integrity: sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-function-name': 7.23.0 + '@babel/template': 7.22.15 + '@babel/types': 7.23.0 + dev: false + + /@babel/helpers@7.23.2: + resolution: {integrity: sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.2 + '@babel/types': 7.23.0 + transitivePeerDependencies: + - supports-color + + /@babel/highlight@7.22.20: + resolution: {integrity: sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.22.20 + chalk: 2.4.2 + js-tokens: 4.0.0 + + /@babel/parser@7.23.0: + resolution: {integrity: sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==} + engines: {node: '>=6.0.0'} + hasBin: true + + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.22.15(@babel/core@7.23.2): + resolution: {integrity: sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.22.15(@babel/core@7.23.2): + resolution: {integrity: sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/plugin-transform-optional-chaining': 7.23.0(@babel/core@7.23.2) + dev: false + + /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.2): + resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + dev: false + + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.2): + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.23.2): + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.23.2): + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.23.2): + resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.23.2): + resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-syntax-import-assertions@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-syntax-import-attributes@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.2): + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.23.2): + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.23.2): + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.23.2): + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.23.2): + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.23.2): + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.23.2): + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.23.2): + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.23.2): + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.23.2): + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-syntax-typescript@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.23.2): + resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.2) + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-arrow-functions@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-async-generator-functions@7.23.2(@babel/core@7.23.2): + resolution: {integrity: sha512-BBYVGxbDVHfoeXbOwcagAkOQAm9NxoTdMGfTqghu1GrvadSaw6iW3Je6IcL5PNOw8VwjxqBECXy50/iCQSY/lQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.2) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.2) + dev: false + + /@babel/plugin-transform-async-to-generator@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.2) + dev: false + + /@babel/plugin-transform-block-scoped-functions@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-block-scoping@7.23.0(@babel/core@7.23.2): + resolution: {integrity: sha512-cOsrbmIOXmf+5YbL99/S49Y3j46k/T16b9ml8bm9lP6N9US5iQ2yBK7gpui1pg0V/WMcXdkfKbTb7HXq9u+v4g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-class-properties@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.2) + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-class-static-block@7.22.11(@babel/core@7.23.2): + resolution: {integrity: sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.2) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.2) + dev: false + + /@babel/plugin-transform-classes@7.22.15(@babel/core@7.23.2): + resolution: {integrity: sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.2) + '@babel/helper-split-export-declaration': 7.22.6 + globals: 11.12.0 + dev: false + + /@babel/plugin-transform-computed-properties@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/template': 7.22.15 + dev: false + + /@babel/plugin-transform-destructuring@7.23.0(@babel/core@7.23.2): + resolution: {integrity: sha512-vaMdgNXFkYrB+8lbgniSYWHsgqK5gjaMNcc84bMIOMRLH0L9AqYq3hwMdvnyqj1OPqea8UtjPEuS/DCenah1wg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-dotall-regex@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.2) + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-duplicate-keys@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-dynamic-import@7.22.11(@babel/core@7.23.2): + resolution: {integrity: sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.2) + dev: false + + /@babel/plugin-transform-exponentiation-operator@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-export-namespace-from@7.22.11(@babel/core@7.23.2): + resolution: {integrity: sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.2) + dev: false + + /@babel/plugin-transform-for-of@7.22.15(@babel/core@7.23.2): + resolution: {integrity: sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-function-name@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-json-strings@7.22.11(@babel/core@7.23.2): + resolution: {integrity: sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.2) + dev: false + + /@babel/plugin-transform-literals@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-logical-assignment-operators@7.22.11(@babel/core@7.23.2): + resolution: {integrity: sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.2) + dev: false + + /@babel/plugin-transform-member-expression-literals@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-modules-amd@7.23.0(@babel/core@7.23.2): + resolution: {integrity: sha512-xWT5gefv2HGSm4QHtgc1sYPbseOyf+FFDo2JbpE25GWl5BqTGO9IMwTYJRoIdjsF85GE+VegHxSCUt5EvoYTAw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.2) + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-modules-commonjs@7.23.0(@babel/core@7.23.2): + resolution: {integrity: sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.2) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-simple-access': 7.22.5 + dev: false + + /@babel/plugin-transform-modules-systemjs@7.23.0(@babel/core@7.23.2): + resolution: {integrity: sha512-qBej6ctXZD2f+DhlOC9yO47yEYgUh5CZNz/aBoH4j/3NOlRfJXJbY7xDQCqQVf9KbrqGzIWER1f23doHGrIHFg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.2) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-validator-identifier': 7.22.20 + dev: false + + /@babel/plugin-transform-modules-umd@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.2) + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.2) + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-new-target@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-nullish-coalescing-operator@7.22.11(@babel/core@7.23.2): + resolution: {integrity: sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.2) + dev: false + + /@babel/plugin-transform-numeric-separator@7.22.11(@babel/core@7.23.2): + resolution: {integrity: sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.2) + dev: false + + /@babel/plugin-transform-object-rest-spread@7.22.15(@babel/core@7.23.2): + resolution: {integrity: sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.23.2 + '@babel/core': 7.23.2 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.2) + '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.23.2) + dev: false + + /@babel/plugin-transform-object-super@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.2) + dev: false + + /@babel/plugin-transform-optional-catch-binding@7.22.11(@babel/core@7.23.2): + resolution: {integrity: sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.2) + dev: false + + /@babel/plugin-transform-optional-chaining@7.23.0(@babel/core@7.23.2): + resolution: {integrity: sha512-sBBGXbLJjxTzLBF5rFWaikMnOGOk/BmK6vVByIdEggZ7Vn6CvWXZyRkkLFK6WE0IF8jSliyOkUN6SScFgzCM0g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.2) + dev: false + + /@babel/plugin-transform-parameters@7.22.15(@babel/core@7.23.2): + resolution: {integrity: sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-private-methods@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.2) + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-private-property-in-object@7.22.11(@babel/core@7.23.2): + resolution: {integrity: sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.2) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.2) + dev: false + + /@babel/plugin-transform-property-literals@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-react-constant-elements@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-BF5SXoO+nX3h5OhlN78XbbDrBOffv+AxPP2ENaJOVqjWCgBDeOY3WcaUcddutGSfoap+5NEQ/q/4I3WZIvgkXA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-react-display-name@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-PVk3WPYudRF5z4GKMEYUrLjPl38fJSKNaEOkFuoprioowGuWN6w2RKznuFNSlJx7pzzXXStPUnNSOEO0jL5EVw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-react-jsx-development@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/plugin-transform-react-jsx': 7.22.15(@babel/core@7.23.2) + dev: false + + /@babel/plugin-transform-react-jsx-self@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-nTh2ogNUtxbiSbxaT4Ds6aXnXEipHweN9YRgOX/oNXdf0cCrGn/+2LozFa3lnPV5D90MkjhgckCPBrsoSc1a7g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-react-jsx-source@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-react-jsx@7.22.15(@babel/core@7.23.2): + resolution: {integrity: sha512-oKckg2eZFa8771O/5vi7XeTvmM6+O9cxZu+kanTU7tD4sin5nO/G8jGJhq8Hvt2Z0kUoEDRayuZLaUlYl8QuGA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.23.2) + '@babel/types': 7.23.0 + dev: false + + /@babel/plugin-transform-react-pure-annotations@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-gP4k85wx09q+brArVinTXhWiyzLl9UpmGva0+mWyKxk6JZequ05x3eUcIUE+FyttPKJFRRVtAvQaJ6YF9h1ZpA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-regenerator@7.22.10(@babel/core@7.23.2): + resolution: {integrity: sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + regenerator-transform: 0.15.2 + dev: false + + /@babel/plugin-transform-reserved-words@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-runtime@7.23.2(@babel/core@7.23.2): + resolution: {integrity: sha512-XOntj6icgzMS58jPVtQpiuF6ZFWxQiJavISGx5KGjRj+3gqZr8+N6Kx+N9BApWzgS+DOjIZfXXj0ZesenOWDyA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + babel-plugin-polyfill-corejs2: 0.4.6(@babel/core@7.23.2) + babel-plugin-polyfill-corejs3: 0.8.6(@babel/core@7.23.2) + babel-plugin-polyfill-regenerator: 0.5.3(@babel/core@7.23.2) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/plugin-transform-shorthand-properties@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-spread@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + dev: false + + /@babel/plugin-transform-sticky-regex@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-template-literals@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-typeof-symbol@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-typescript@7.22.15(@babel/core@7.23.2): + resolution: {integrity: sha512-1uirS0TnijxvQLnlv5wQBwOX3E1wCFX7ITv+9pBV2wKEk4K+M5tqDaoNXnTH8tjEIYHLO98MwiTWO04Ggz4XuA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.2) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.23.2) + dev: false + + /@babel/plugin-transform-unicode-escapes@7.22.10(@babel/core@7.23.2): + resolution: {integrity: sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-unicode-property-regex@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.2) + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-unicode-regex@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.2) + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-unicode-sets-regex@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.2) + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/preset-env@7.23.2(@babel/core@7.23.2): + resolution: {integrity: sha512-BW3gsuDD+rvHL2VO2SjAUNTBe5YrjsTiDyqamPDWY723na3/yPQ65X5oQkFVJZ0o50/2d+svm1rkPoJeR1KxVQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.23.2 + '@babel/core': 7.23.2 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-validator-option': 7.22.15 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.22.15(@babel/core@7.23.2) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.22.15(@babel/core@7.23.2) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.2) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.2) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.23.2) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.2) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.2) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.2) + '@babel/plugin-syntax-import-assertions': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-syntax-import-attributes': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.23.2) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.2) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.2) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.2) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.2) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.2) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.2) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.2) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.2) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.23.2) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.23.2) + '@babel/plugin-transform-arrow-functions': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-async-generator-functions': 7.23.2(@babel/core@7.23.2) + '@babel/plugin-transform-async-to-generator': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-block-scoped-functions': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-block-scoping': 7.23.0(@babel/core@7.23.2) + '@babel/plugin-transform-class-properties': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-class-static-block': 7.22.11(@babel/core@7.23.2) + '@babel/plugin-transform-classes': 7.22.15(@babel/core@7.23.2) + '@babel/plugin-transform-computed-properties': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-destructuring': 7.23.0(@babel/core@7.23.2) + '@babel/plugin-transform-dotall-regex': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-duplicate-keys': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-dynamic-import': 7.22.11(@babel/core@7.23.2) + '@babel/plugin-transform-exponentiation-operator': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-export-namespace-from': 7.22.11(@babel/core@7.23.2) + '@babel/plugin-transform-for-of': 7.22.15(@babel/core@7.23.2) + '@babel/plugin-transform-function-name': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-json-strings': 7.22.11(@babel/core@7.23.2) + '@babel/plugin-transform-literals': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-logical-assignment-operators': 7.22.11(@babel/core@7.23.2) + '@babel/plugin-transform-member-expression-literals': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-modules-amd': 7.23.0(@babel/core@7.23.2) + '@babel/plugin-transform-modules-commonjs': 7.23.0(@babel/core@7.23.2) + '@babel/plugin-transform-modules-systemjs': 7.23.0(@babel/core@7.23.2) + '@babel/plugin-transform-modules-umd': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-new-target': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-nullish-coalescing-operator': 7.22.11(@babel/core@7.23.2) + '@babel/plugin-transform-numeric-separator': 7.22.11(@babel/core@7.23.2) + '@babel/plugin-transform-object-rest-spread': 7.22.15(@babel/core@7.23.2) + '@babel/plugin-transform-object-super': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-optional-catch-binding': 7.22.11(@babel/core@7.23.2) + '@babel/plugin-transform-optional-chaining': 7.23.0(@babel/core@7.23.2) + '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.23.2) + '@babel/plugin-transform-private-methods': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-private-property-in-object': 7.22.11(@babel/core@7.23.2) + '@babel/plugin-transform-property-literals': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-regenerator': 7.22.10(@babel/core@7.23.2) + '@babel/plugin-transform-reserved-words': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-shorthand-properties': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-spread': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-sticky-regex': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-template-literals': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-typeof-symbol': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-unicode-escapes': 7.22.10(@babel/core@7.23.2) + '@babel/plugin-transform-unicode-property-regex': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-unicode-regex': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-unicode-sets-regex': 7.22.5(@babel/core@7.23.2) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.23.2) + '@babel/types': 7.23.0 + babel-plugin-polyfill-corejs2: 0.4.6(@babel/core@7.23.2) + babel-plugin-polyfill-corejs3: 0.8.6(@babel/core@7.23.2) + babel-plugin-polyfill-regenerator: 0.5.3(@babel/core@7.23.2) + core-js-compat: 3.33.2 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.23.2): + resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} + peerDependencies: + '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/types': 7.23.0 + esutils: 2.0.3 + dev: false + + /@babel/preset-react@7.22.15(@babel/core@7.23.2): + resolution: {integrity: sha512-Csy1IJ2uEh/PecCBXXoZGAZBeCATTuePzCSB7dLYWS0vOEj6CNpjxIhW4duWwZodBNueH7QO14WbGn8YyeuN9w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-validator-option': 7.22.15 + '@babel/plugin-transform-react-display-name': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-react-jsx': 7.22.15(@babel/core@7.23.2) + '@babel/plugin-transform-react-jsx-development': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-react-pure-annotations': 7.22.5(@babel/core@7.23.2) + dev: false + + /@babel/preset-typescript@7.23.2(@babel/core@7.23.2): + resolution: {integrity: sha512-u4UJc1XsS1GhIGteM8rnGiIvf9rJpiVgMEeCnwlLA7WJPC+jcXWJAGxYmeqs5hOZD8BbAfnV5ezBOxQbb4OUxA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-validator-option': 7.22.15 + '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-modules-commonjs': 7.23.0(@babel/core@7.23.2) + '@babel/plugin-transform-typescript': 7.22.15(@babel/core@7.23.2) + dev: false + + /@babel/regjsgen@0.8.0: + resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} + dev: false + + /@babel/runtime-corejs3@7.23.2: + resolution: {integrity: sha512-54cIh74Z1rp4oIjsHjqN+WM4fMyCBYe+LpZ9jWm51CZ1fbH3SkAzQD/3XLoNkjbJ7YEmjobLXyvQrFypRHOrXw==} + engines: {node: '>=6.9.0'} + dependencies: + core-js-pure: 3.33.2 + regenerator-runtime: 0.14.0 + dev: false + + /@babel/runtime@7.23.2: + resolution: {integrity: sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.14.0 + + /@babel/template@7.22.15: + resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.22.13 + '@babel/parser': 7.23.0 + '@babel/types': 7.23.0 + + /@babel/traverse@7.23.2: + resolution: {integrity: sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.22.13 + '@babel/generator': 7.23.0 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.23.0 + '@babel/types': 7.23.0 + debug: 4.3.4(supports-color@8.1.1) + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + /@babel/types@7.23.0: + resolution: {integrity: sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.22.5 + '@babel/helper-validator-identifier': 7.22.20 + to-fast-properties: 2.0.0 + + /@bcoe/v8-coverage@0.2.3: + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + dev: true + + /@braintree/sanitize-url@6.0.4: + resolution: {integrity: sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A==} + + /@cadl-lang/compiler@0.37.0: + resolution: {integrity: sha512-jHMqPZmM4evQlu7oY9vj6PEM+f+OhnfPqAdwxALrU2gwsLcwYG1h8rkjX/iK2KfeewCbXuRT/hztOTo3pcbYWA==} + engines: {node: '>=16.0.0'} + hasBin: true + dependencies: + '@babel/code-frame': 7.16.7 + ajv: 8.9.0 + change-case: 4.1.2 + globby: 13.1.4 + js-yaml: 4.1.0 + mkdirp: 1.0.4 + mustache: 4.2.0 + node-fetch: 3.3.2 + node-watch: 0.7.4 + picocolors: 1.0.0 + prettier: 2.7.1 + prompts: 2.4.2 + vscode-languageserver: 7.0.0 + vscode-languageserver-textdocument: 1.0.11 + yargs: 17.3.1 + dev: false + + /@cadl-lang/compiler@0.38.5: + resolution: {integrity: sha512-jd6a8TEp9ApBzekTb39aBPocYrkuqzsQbLTDcc/c6tA47Wmr87463MAXpeB80ziEsr15sccI01j3g63jt5W0Aw==} + engines: {node: '>=16.0.0'} + hasBin: true + dependencies: + '@babel/code-frame': 7.18.6 + ajv: 8.11.2 + change-case: 4.1.2 + globby: 13.1.4 + js-yaml: 4.1.0 + mkdirp: 1.0.4 + mustache: 4.2.0 + node-fetch: 3.3.2 + node-watch: 0.7.4 + picocolors: 1.0.0 + prettier: 2.7.1 + prompts: 2.4.2 + vscode-languageserver: 8.0.2 + vscode-languageserver-textdocument: 1.0.11 + yargs: 17.6.2 + dev: false + + /@cadl-lang/compiler@0.40.0: + resolution: {integrity: sha512-4u/Dnm39Ma+8wH0SDu7ya1+2oBRDiNByiRoijwyScHRec26UWLyWvHMvvU89ISU6O8Vwtq0bpmbD7FeJTnlbHw==} + engines: {node: '>=16.0.0'} + hasBin: true + dependencies: + '@babel/code-frame': 7.18.6 + ajv: 8.11.2 + change-case: 4.1.2 + globby: 13.1.4 + js-yaml: 4.1.0 + mkdirp: 1.0.4 + mustache: 4.2.0 + node-fetch: 3.3.2 + node-watch: 0.7.4 + picocolors: 1.0.0 + prettier: 2.8.8 + prompts: 2.4.2 + vscode-languageserver: 8.0.2 + vscode-languageserver-textdocument: 1.0.11 + yargs: 17.6.2 + dev: false + + /@colors/colors@1.5.0: + resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} + engines: {node: '>=0.1.90'} + requiresBuild: true + dev: false + optional: true + + /@cspell/cspell-bundled-dicts@6.31.3: + resolution: {integrity: sha512-KXy3qKWYzXOGYwqOGMCXHem3fV39iEmoKLiNhoWWry/SFdvAafmeY+LIDcQTXAcOQLkMDCwP2/rY/NadcWnrjg==} + engines: {node: '>=14'} + dependencies: + '@cspell/dict-ada': 4.0.2 + '@cspell/dict-aws': 3.0.0 + '@cspell/dict-bash': 4.1.2 + '@cspell/dict-companies': 3.0.27 + '@cspell/dict-cpp': 5.0.9 + '@cspell/dict-cryptocurrencies': 3.0.1 + '@cspell/dict-csharp': 4.0.2 + '@cspell/dict-css': 4.0.12 + '@cspell/dict-dart': 2.0.3 + '@cspell/dict-django': 4.1.0 + '@cspell/dict-docker': 1.1.7 + '@cspell/dict-dotnet': 5.0.0 + '@cspell/dict-elixir': 4.0.3 + '@cspell/dict-en-common-misspellings': 1.0.2 + '@cspell/dict-en-gb': 1.1.33 + '@cspell/dict-en_us': 4.3.11 + '@cspell/dict-filetypes': 3.0.2 + '@cspell/dict-fonts': 3.0.2 + '@cspell/dict-fullstack': 3.1.5 + '@cspell/dict-gaming-terms': 1.0.4 + '@cspell/dict-git': 2.0.0 + '@cspell/dict-golang': 6.0.4 + '@cspell/dict-haskell': 4.0.1 + '@cspell/dict-html': 4.0.5 + '@cspell/dict-html-symbol-entities': 4.0.0 + '@cspell/dict-java': 5.0.6 + '@cspell/dict-k8s': 1.0.2 + '@cspell/dict-latex': 4.0.0 + '@cspell/dict-lorem-ipsum': 3.0.0 + '@cspell/dict-lua': 4.0.2 + '@cspell/dict-node': 4.0.3 + '@cspell/dict-npm': 5.0.12 + '@cspell/dict-php': 4.0.4 + '@cspell/dict-powershell': 5.0.2 + '@cspell/dict-public-licenses': 2.0.5 + '@cspell/dict-python': 4.1.10 + '@cspell/dict-r': 2.0.1 + '@cspell/dict-ruby': 5.0.1 + '@cspell/dict-rust': 4.0.1 + '@cspell/dict-scala': 5.0.0 + '@cspell/dict-software-terms': 3.3.9 + '@cspell/dict-sql': 2.1.2 + '@cspell/dict-svelte': 1.0.2 + '@cspell/dict-swift': 2.0.1 + '@cspell/dict-typescript': 3.1.2 + '@cspell/dict-vue': 3.0.0 + dev: false + + /@cspell/cspell-json-reporter@6.31.3: + resolution: {integrity: sha512-ZJwj2vT4lxncYxduXcxy0dCvjjMvXIfphbLSCN5CXvufrtupB4KlcjZUnOofCi4pfpp8qocCSn1lf2DU9xgUXA==} + engines: {node: '>=14'} + dependencies: + '@cspell/cspell-types': 6.31.3 + dev: false + + /@cspell/cspell-pipe@6.31.3: + resolution: {integrity: sha512-Lv/y4Ya/TJyU1pf66yl1te7LneFZd3lZg1bN5oe1cPrKSmfWdiX48v7plTRecWd/OWyLGd0yN807v79A+/0W7A==} + engines: {node: '>=14'} + dev: false + + /@cspell/cspell-service-bus@6.31.3: + resolution: {integrity: sha512-x5j8j3n39KN8EXOAlv75CpircdpF5WEMCC5pcO916o6GBmJBy8SrdzdsBGJhVcYGGilqy6pf8R9RCZ3yAmG8gQ==} + engines: {node: '>=14'} + dev: false + + /@cspell/cspell-types@6.31.3: + resolution: {integrity: sha512-wZ+t+lUsQJB65M31btZM4fH3K1CkRgE8pSeTiCwxYcnCL19pi4TMcEEMKdO8yFZMdocW4B7VRwzxNoQMw2ewBg==} + engines: {node: '>=14'} + dev: false + + /@cspell/dict-ada@4.0.2: + resolution: {integrity: sha512-0kENOWQeHjUlfyId/aCM/mKXtkEgV0Zu2RhUXCBr4hHo9F9vph+Uu8Ww2b0i5a4ZixoIkudGA+eJvyxrG1jUpA==} + dev: false + + /@cspell/dict-aws@3.0.0: + resolution: {integrity: sha512-O1W6nd5y3Z00AMXQMzfiYrIJ1sTd9fB1oLr+xf/UD7b3xeHeMeYE2OtcWbt9uyeHim4tk+vkSTcmYEBKJgS5bQ==} + dev: false + + /@cspell/dict-bash@4.1.2: + resolution: {integrity: sha512-AEBWjbaMaJEyAjOHW0F15P2izBjli2cNerG3NjuVH7xX/HUUeNoTj8FF1nwpMufKwGQCvuyO2hCmkVxhJ0y55Q==} + dev: false + + /@cspell/dict-companies@3.0.27: + resolution: {integrity: sha512-gaPR/luf+4oKGyxvW4GbxGGPdHiC5kj/QefnmQqrLFrLiCSXMZg5/NL+Lr4E5lcHsd35meX61svITQAvsT7lyQ==} + dev: false + + /@cspell/dict-cpp@5.0.9: + resolution: {integrity: sha512-ql9WPNp8c+fhdpVpjpZEUWmxBHJXs9CJuiVVfW/iwv5AX7VuMHyEwid+9/6nA8qnCxkUQ5pW83Ums1lLjn8ScA==} + dev: false + + /@cspell/dict-cryptocurrencies@3.0.1: + resolution: {integrity: sha512-Tdlr0Ahpp5yxtwM0ukC13V6+uYCI0p9fCRGMGZt36rWv8JQZHIuHfehNl7FB/Qc09NCF7p5ep0GXbL+sVTd/+w==} + dev: false + + /@cspell/dict-csharp@4.0.2: + resolution: {integrity: sha512-1JMofhLK+4p4KairF75D3A924m5ERMgd1GvzhwK2geuYgd2ZKuGW72gvXpIV7aGf52E3Uu1kDXxxGAiZ5uVG7g==} + dev: false + + /@cspell/dict-css@4.0.12: + resolution: {integrity: sha512-vGBgPM92MkHQF5/2jsWcnaahOZ+C6OE/fPvd5ScBP72oFY9tn5GLuomcyO0z8vWCr2e0nUSX1OGimPtcQAlvSw==} + dev: false + + /@cspell/dict-dart@2.0.3: + resolution: {integrity: sha512-cLkwo1KT5CJY5N5RJVHks2genFkNCl/WLfj+0fFjqNR+tk3tBI1LY7ldr9piCtSFSm4x9pO1x6IV3kRUY1lLiw==} + dev: false + + /@cspell/dict-data-science@1.0.11: + resolution: {integrity: sha512-TaHAZRVe0Zlcc3C23StZqqbzC0NrodRwoSAc8dis+5qLeLLnOCtagYQeROQvDlcDg3X/VVEO9Whh4W/z4PAmYQ==} + dev: false + + /@cspell/dict-django@4.1.0: + resolution: {integrity: sha512-bKJ4gPyrf+1c78Z0Oc4trEB9MuhcB+Yg+uTTWsvhY6O2ncFYbB/LbEZfqhfmmuK/XJJixXfI1laF2zicyf+l0w==} + dev: false + + /@cspell/dict-docker@1.1.7: + resolution: {integrity: sha512-XlXHAr822euV36GGsl2J1CkBIVg3fZ6879ZOg5dxTIssuhUOCiV2BuzKZmt6aIFmcdPmR14+9i9Xq+3zuxeX0A==} + dev: false + + /@cspell/dict-dotnet@5.0.0: + resolution: {integrity: sha512-EOwGd533v47aP5QYV8GlSSKkmM9Eq8P3G/eBzSpH3Nl2+IneDOYOBLEUraHuiCtnOkNsz0xtZHArYhAB2bHWAw==} + dev: false + + /@cspell/dict-elixir@4.0.3: + resolution: {integrity: sha512-g+uKLWvOp9IEZvrIvBPTr/oaO6619uH/wyqypqvwpmnmpjcfi8+/hqZH8YNKt15oviK8k4CkINIqNhyndG9d9Q==} + dev: false + + /@cspell/dict-en-common-misspellings@1.0.2: + resolution: {integrity: sha512-jg7ZQZpZH7+aAxNBlcAG4tGhYF6Ksy+QS5Df73Oo+XyckBjC9QS+PrRwLTeYoFIgXy5j3ICParK5r3MSSoL4gw==} + dev: false + + /@cspell/dict-en-gb@1.1.33: + resolution: {integrity: sha512-tKSSUf9BJEV+GJQAYGw5e+ouhEe2ZXE620S7BLKe3ZmpnjlNG9JqlnaBhkIMxKnNFkLY2BP/EARzw31AZnOv4g==} + dev: false + + /@cspell/dict-en_us@4.3.11: + resolution: {integrity: sha512-GhdavZFlS2YbUNcRtPbgJ9j6aUyq116LmDQ2/Q5SpQxJ5/6vVs8Yj5WxV1JD+Zh/Zim1NJDcneTOuLsUGi+Czw==} + dev: false + + /@cspell/dict-filetypes@3.0.2: + resolution: {integrity: sha512-StoC0wPmFNav6F6P8/FYFN1BpZfPgOmktb8gQ9wTauelWofPeBW+A0t5ncZt9hXHtnbGDA98v4ukacV+ucbnUg==} + dev: false + + /@cspell/dict-fonts@3.0.2: + resolution: {integrity: sha512-Z5QdbgEI7DV+KPXrAeDA6dDm/vTzyaW53SGlKqz6PI5VhkOjgkBXv3YtZjnxMZ4dY2ZIqq+RUK6qa9Pi8rQdGQ==} + dev: false + + /@cspell/dict-fullstack@3.1.5: + resolution: {integrity: sha512-6ppvo1dkXUZ3fbYn/wwzERxCa76RtDDl5Afzv2lijLoijGGUw5yYdLBKJnx8PJBGNLh829X352ftE7BElG4leA==} + dev: false + + /@cspell/dict-gaming-terms@1.0.4: + resolution: {integrity: sha512-hbDduNXlk4AOY0wFxcDMWBPpm34rpqJBeqaySeoUH70eKxpxm+dvjpoRLJgyu0TmymEICCQSl6lAHTHSDiWKZg==} + dev: false + + /@cspell/dict-git@2.0.0: + resolution: {integrity: sha512-n1AxyX5Kgxij/sZFkxFJlzn3K9y/sCcgVPg/vz4WNJ4K9YeTsUmyGLA2OQI7d10GJeiuAo2AP1iZf2A8j9aj2w==} + dev: false + + /@cspell/dict-golang@6.0.4: + resolution: {integrity: sha512-jOfewPEyN6U9Q80okE3b1PTYBfqZgHh7w4o271GSuAX+VKJ1lUDhdR4bPKRxSDdO5jHArw2u5C8nH2CWGuygbQ==} + dev: false + + /@cspell/dict-haskell@4.0.1: + resolution: {integrity: sha512-uRrl65mGrOmwT7NxspB4xKXFUenNC7IikmpRZW8Uzqbqcu7ZRCUfstuVH7T1rmjRgRkjcIjE4PC11luDou4wEQ==} + dev: false + + /@cspell/dict-html-symbol-entities@4.0.0: + resolution: {integrity: sha512-HGRu+48ErJjoweR5IbcixxETRewrBb0uxQBd6xFGcxbEYCX8CnQFTAmKI5xNaIt2PKaZiJH3ijodGSqbKdsxhw==} + dev: false + + /@cspell/dict-html@4.0.5: + resolution: {integrity: sha512-p0brEnRybzSSWi8sGbuVEf7jSTDmXPx7XhQUb5bgG6b54uj+Z0Qf0V2n8b/LWwIPJNd1GygaO9l8k3HTCy1h4w==} + dev: false + + /@cspell/dict-java@5.0.6: + resolution: {integrity: sha512-kdE4AHHHrixyZ5p6zyms1SLoYpaJarPxrz8Tveo6gddszBVVwIUZ+JkQE1bWNLK740GWzIXdkznpUfw1hP9nXw==} + dev: false + + /@cspell/dict-k8s@1.0.2: + resolution: {integrity: sha512-tLT7gZpNPnGa+IIFvK9SP1LrSpPpJ94a/DulzAPOb1Q2UBFwdpFd82UWhio0RNShduvKG/WiMZf/wGl98pn+VQ==} + dev: false + + /@cspell/dict-latex@4.0.0: + resolution: {integrity: sha512-LPY4y6D5oI7D3d+5JMJHK/wxYTQa2lJMSNxps2JtuF8hbAnBQb3igoWEjEbIbRRH1XBM0X8dQqemnjQNCiAtxQ==} + dev: false + + /@cspell/dict-lorem-ipsum@3.0.0: + resolution: {integrity: sha512-msEV24qEpzWZs2kcEicqYlhyBpR0amfDkJOs+iffC07si9ftqtQ+yP3lf1VFLpgqw3SQh1M1vtU7RD4sPrNlcQ==} + dev: false + + /@cspell/dict-lua@4.0.2: + resolution: {integrity: sha512-eeC20Q+UnHcTVBK6pgwhSjGIVugO2XqU7hv4ZfXp2F9DxGx1RME0+1sKX4qAGhdFGwOBsEzb2fwUsAEP6Mibpg==} + dev: false + + /@cspell/dict-node@4.0.3: + resolution: {integrity: sha512-sFlUNI5kOogy49KtPg8SMQYirDGIAoKBO3+cDLIwD4MLdsWy1q0upc7pzGht3mrjuyMiPRUV14Bb0rkVLrxOhg==} + dev: false + + /@cspell/dict-npm@5.0.12: + resolution: {integrity: sha512-T/+WeQmtbxo7ad6hrdI8URptYstKJP+kXyWJZfuVJJGWJQ7yubxrI5Z5AfM+Dh/ff4xHmdzapxD9adaEQ727uw==} + dev: false + + /@cspell/dict-php@4.0.4: + resolution: {integrity: sha512-fRlLV730fJbulDsLIouZxXoxHt3KIH6hcLFwxaupHL+iTXDg0lo7neRpbqD5MScr/J3idEr7i9G8XWzIikKFug==} + dev: false + + /@cspell/dict-powershell@5.0.2: + resolution: {integrity: sha512-IHfWLme3FXE7vnOmMncSBxOsMTdNWd1Vcyhag03WS8oANSgX8IZ+4lMI00mF0ptlgchf16/OU8WsV4pZfikEFw==} + dev: false + + /@cspell/dict-public-licenses@2.0.5: + resolution: {integrity: sha512-91HK4dSRri/HqzAypHgduRMarJAleOX5NugoI8SjDLPzWYkwZ1ftuCXSk+fy8DLc3wK7iOaFcZAvbjmnLhVs4A==} + dev: false + + /@cspell/dict-python@4.1.10: + resolution: {integrity: sha512-ErF/Ohcu6Xk4QVNzFgo8p7CxkxvAKAmFszvso41qOOhu8CVpB35ikBRpGVDw9gsCUtZzi15Yl0izi4do6WcLkA==} + dependencies: + '@cspell/dict-data-science': 1.0.11 + dev: false + + /@cspell/dict-r@2.0.1: + resolution: {integrity: sha512-KCmKaeYMLm2Ip79mlYPc8p+B2uzwBp4KMkzeLd5E6jUlCL93Y5Nvq68wV5fRLDRTf7N1LvofkVFWfDcednFOgA==} + dev: false + + /@cspell/dict-ruby@5.0.1: + resolution: {integrity: sha512-rruTm7Emhty/BSYavSm8ZxRuVw0OBqzJkwIFXcV0cX7To8D1qbmS9HFHRuRg8IL11+/nJvtdDz+lMFBSmPUagQ==} + dev: false + + /@cspell/dict-rust@4.0.1: + resolution: {integrity: sha512-xJSSzHDK2z6lSVaOmMxl3PTOtfoffaxMo7fTcbZUF+SCJzfKbO6vnN9TCGX2sx1RHFDz66Js6goz6SAZQdOwaw==} + dev: false + + /@cspell/dict-scala@5.0.0: + resolution: {integrity: sha512-ph0twaRoV+ylui022clEO1dZ35QbeEQaKTaV2sPOsdwIokABPIiK09oWwGK9qg7jRGQwVaRPEq0Vp+IG1GpqSQ==} + dev: false + + /@cspell/dict-software-terms@3.3.9: + resolution: {integrity: sha512-/O3EWe0SIznx18S7J3GAXPDe7sexn3uTsf4IlnGYK9WY6ZRuEywkXCB+5/USLTGf4+QC05pkHofphdvVSifDyA==} + dev: false + + /@cspell/dict-sql@2.1.2: + resolution: {integrity: sha512-Pi0hAcvsSGtZZeyyAN1VfGtQJbrXos5x2QjJU0niAQKhmITSOrXU/1II1Gogk+FYDjWyV9wP2De0U2f7EWs6oQ==} + dev: false + + /@cspell/dict-svelte@1.0.2: + resolution: {integrity: sha512-rPJmnn/GsDs0btNvrRBciOhngKV98yZ9SHmg8qI6HLS8hZKvcXc0LMsf9LLuMK1TmS2+WQFAan6qeqg6bBxL2Q==} + dev: false + + /@cspell/dict-swift@2.0.1: + resolution: {integrity: sha512-gxrCMUOndOk7xZFmXNtkCEeroZRnS2VbeaIPiymGRHj5H+qfTAzAKxtv7jJbVA3YYvEzWcVE2oKDP4wcbhIERw==} + dev: false + + /@cspell/dict-typescript@3.1.2: + resolution: {integrity: sha512-lcNOYWjLUvDZdLa0UMNd/LwfVdxhE9rKA+agZBGjL3lTA3uNvH7IUqSJM/IXhJoBpLLMVEOk8v1N9xi+vDuCdA==} + dev: false + + /@cspell/dict-vue@3.0.0: + resolution: {integrity: sha512-niiEMPWPV9IeRBRzZ0TBZmNnkK3olkOPYxC1Ny2AX4TGlYRajcW0WUtoSHmvvjZNfWLSg2L6ruiBeuPSbjnG6A==} + dev: false + + /@cspell/dynamic-import@6.31.3: + resolution: {integrity: sha512-A6sT00+6UNGFksQ5SxW2ohNl6vUutai8F4jwJMHTjZL/9vivQpU7y5V4PpsfoPZtx3WZcbrzuTvJ+tLfdbWc4A==} + engines: {node: '>=14'} + dependencies: + import-meta-resolve: 2.2.2 + dev: false + + /@cspell/strong-weak-map@6.31.3: + resolution: {integrity: sha512-znwc9IlgGUPioHGshP/zyM8HsuYg1OY5S7HSiVXARh5H8RqcyBsnyn8abc0PPhqPrfDy9Fh5xHsAEPZ55dl1vQ==} + engines: {node: '>=14.6'} + dev: false + + /@discoveryjs/json-ext@0.5.7: + resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} + engines: {node: '>=10.0.0'} + dev: false + + /@docsearch/css@3.5.2: + resolution: {integrity: sha512-SPiDHaWKQZpwR2siD0KQUwlStvIAnEyK6tAE2h2Wuoq8ue9skzhlyVQ1ddzOxX6khULnAALDiR/isSF3bnuciA==} + dev: false + + /@docsearch/react@3.5.2(@algolia/client-search@4.20.0)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.9.0): + resolution: {integrity: sha512-9Ahcrs5z2jq/DcAvYtvlqEBHImbm4YJI8M9y0x6Tqg598P40HTEkX7hsMcIuThI+hTFxRGZ9hll0Wygm2yEjng==} + peerDependencies: + '@types/react': '>= 16.8.0 < 19.0.0' + react: '>= 16.8.0 < 19.0.0' + react-dom: '>= 16.8.0 < 19.0.0' + search-insights: '>= 1 < 3' + peerDependenciesMeta: + '@types/react': + optional: true + react: + optional: true + react-dom: + optional: true + search-insights: + optional: true + dependencies: + '@algolia/autocomplete-core': 1.9.3(@algolia/client-search@4.20.0)(algoliasearch@4.20.0)(search-insights@2.9.0) + '@algolia/autocomplete-preset-algolia': 1.9.3(@algolia/client-search@4.20.0)(algoliasearch@4.20.0) + '@docsearch/css': 3.5.2 + '@types/react': 18.2.34 + algoliasearch: 4.20.0 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + search-insights: 2.9.0 + transitivePeerDependencies: + - '@algolia/client-search' + dev: false + + /@docusaurus/core@3.0.0(@docusaurus/types@3.0.0)(@swc/core@1.3.95)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2): + resolution: {integrity: sha512-bHWtY55tJTkd6pZhHrWz1MpWuwN4edZe0/UWgFF7PW/oJeDZvLSXKqwny3L91X1/LGGoypBGkeZn8EOuKeL4yQ==} + engines: {node: '>=18.0'} + hasBin: true + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + dependencies: + '@babel/core': 7.23.2 + '@babel/generator': 7.23.0 + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.2) + '@babel/plugin-transform-runtime': 7.23.2(@babel/core@7.23.2) + '@babel/preset-env': 7.23.2(@babel/core@7.23.2) + '@babel/preset-react': 7.22.15(@babel/core@7.23.2) + '@babel/preset-typescript': 7.23.2(@babel/core@7.23.2) + '@babel/runtime': 7.23.2 + '@babel/runtime-corejs3': 7.23.2 + '@babel/traverse': 7.23.2 + '@docusaurus/cssnano-preset': 3.0.0 + '@docusaurus/logger': 3.0.0 + '@docusaurus/mdx-loader': 3.0.0(@docusaurus/types@3.0.0)(@swc/core@1.3.95)(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/react-loadable': 5.5.2(react@18.2.0) + '@docusaurus/utils': 3.0.0(@docusaurus/types@3.0.0)(@swc/core@1.3.95) + '@docusaurus/utils-common': 3.0.0(@docusaurus/types@3.0.0) + '@docusaurus/utils-validation': 3.0.0(@docusaurus/types@3.0.0)(@swc/core@1.3.95) + '@slorber/static-site-generator-webpack-plugin': 4.0.7 + '@svgr/webpack': 6.5.1 + autoprefixer: 10.4.16(postcss@8.4.31) + babel-loader: 9.1.3(@babel/core@7.23.2)(webpack@5.89.0) + babel-plugin-dynamic-import-node: 2.3.3 + boxen: 6.2.1 + chalk: 4.1.2 + chokidar: 3.5.3 + clean-css: 5.3.2 + cli-table3: 0.6.3 + combine-promises: 1.2.0 + commander: 5.1.0 + copy-webpack-plugin: 11.0.0(webpack@5.89.0) + core-js: 3.33.2 + css-loader: 6.8.1(webpack@5.89.0) + css-minimizer-webpack-plugin: 4.2.2(clean-css@5.3.2)(webpack@5.89.0) + cssnano: 5.1.15(postcss@8.4.31) + del: 6.1.1 + detect-port: 1.5.1 + escape-html: 1.0.3 + eta: 2.2.0 + file-loader: 6.2.0(webpack@5.89.0) + fs-extra: 11.1.1 + html-minifier-terser: 7.2.0 + html-tags: 3.3.1 + html-webpack-plugin: 5.5.3(webpack@5.89.0) + leven: 3.1.0 + lodash: 4.17.21 + mini-css-extract-plugin: 2.7.6(webpack@5.89.0) + postcss: 8.4.31 + postcss-loader: 7.3.3(postcss@8.4.31)(typescript@5.2.2)(webpack@5.89.0) + prompts: 2.4.2 + react: 18.2.0 + react-dev-utils: 12.0.1(eslint@8.52.0)(typescript@5.2.2)(webpack@5.89.0) + react-dom: 18.2.0(react@18.2.0) + react-helmet-async: 1.3.0(react-dom@18.2.0)(react@18.2.0) + react-loadable: /@docusaurus/react-loadable@5.5.2(react@18.2.0) + react-loadable-ssr-addon-v5-slorber: 1.0.1(@docusaurus/react-loadable@5.5.2)(webpack@5.89.0) + react-router: 5.3.4(react@18.2.0) + react-router-config: 5.1.1(react-router@5.3.4)(react@18.2.0) + react-router-dom: 5.3.4(react@18.2.0) + rtl-detect: 1.1.2 + semver: 7.5.4 + serve-handler: 6.1.5 + shelljs: 0.8.5 + terser-webpack-plugin: 5.3.9(@swc/core@1.3.95)(webpack@5.89.0) + tslib: 2.6.2 + update-notifier: 6.0.2 + url-loader: 4.1.1(file-loader@6.2.0)(webpack@5.89.0) + wait-on: 7.0.1 + webpack: 5.89.0(@swc/core@1.3.95) + webpack-bundle-analyzer: 4.9.1 + webpack-dev-server: 4.15.1(webpack@5.89.0) + webpack-merge: 5.10.0 + webpackbar: 5.0.2(webpack@5.89.0) + transitivePeerDependencies: + - '@docusaurus/types' + - '@parcel/css' + - '@swc/core' + - '@swc/css' + - bufferutil + - csso + - debug + - esbuild + - eslint + - lightningcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - vue-template-compiler + - webpack-cli + dev: false + + /@docusaurus/core@3.0.0(@docusaurus/types@3.0.0)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2): + resolution: {integrity: sha512-bHWtY55tJTkd6pZhHrWz1MpWuwN4edZe0/UWgFF7PW/oJeDZvLSXKqwny3L91X1/LGGoypBGkeZn8EOuKeL4yQ==} + engines: {node: '>=18.0'} + hasBin: true + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + dependencies: + '@babel/core': 7.23.2 + '@babel/generator': 7.23.0 + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.2) + '@babel/plugin-transform-runtime': 7.23.2(@babel/core@7.23.2) + '@babel/preset-env': 7.23.2(@babel/core@7.23.2) + '@babel/preset-react': 7.22.15(@babel/core@7.23.2) + '@babel/preset-typescript': 7.23.2(@babel/core@7.23.2) + '@babel/runtime': 7.23.2 + '@babel/runtime-corejs3': 7.23.2 + '@babel/traverse': 7.23.2 + '@docusaurus/cssnano-preset': 3.0.0 + '@docusaurus/logger': 3.0.0 + '@docusaurus/mdx-loader': 3.0.0(@docusaurus/types@3.0.0)(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/react-loadable': 5.5.2(react@18.2.0) + '@docusaurus/utils': 3.0.0(@docusaurus/types@3.0.0) + '@docusaurus/utils-common': 3.0.0(@docusaurus/types@3.0.0) + '@docusaurus/utils-validation': 3.0.0(@docusaurus/types@3.0.0) + '@slorber/static-site-generator-webpack-plugin': 4.0.7 + '@svgr/webpack': 6.5.1 + autoprefixer: 10.4.16(postcss@8.4.31) + babel-loader: 9.1.3(@babel/core@7.23.2)(webpack@5.89.0) + babel-plugin-dynamic-import-node: 2.3.3 + boxen: 6.2.1 + chalk: 4.1.2 + chokidar: 3.5.3 + clean-css: 5.3.2 + cli-table3: 0.6.3 + combine-promises: 1.2.0 + commander: 5.1.0 + copy-webpack-plugin: 11.0.0(webpack@5.89.0) + core-js: 3.33.2 + css-loader: 6.8.1(webpack@5.89.0) + css-minimizer-webpack-plugin: 4.2.2(clean-css@5.3.2)(webpack@5.89.0) + cssnano: 5.1.15(postcss@8.4.31) + del: 6.1.1 + detect-port: 1.5.1 + escape-html: 1.0.3 + eta: 2.2.0 + file-loader: 6.2.0(webpack@5.89.0) + fs-extra: 11.1.1 + html-minifier-terser: 7.2.0 + html-tags: 3.3.1 + html-webpack-plugin: 5.5.3(webpack@5.89.0) + leven: 3.1.0 + lodash: 4.17.21 + mini-css-extract-plugin: 2.7.6(webpack@5.89.0) + postcss: 8.4.31 + postcss-loader: 7.3.3(postcss@8.4.31)(typescript@5.2.2)(webpack@5.89.0) + prompts: 2.4.2 + react: 18.2.0 + react-dev-utils: 12.0.1(eslint@8.52.0)(typescript@5.2.2)(webpack@5.89.0) + react-dom: 18.2.0(react@18.2.0) + react-helmet-async: 1.3.0(react-dom@18.2.0)(react@18.2.0) + react-loadable: /@docusaurus/react-loadable@5.5.2(react@18.2.0) + react-loadable-ssr-addon-v5-slorber: 1.0.1(@docusaurus/react-loadable@5.5.2)(webpack@5.89.0) + react-router: 5.3.4(react@18.2.0) + react-router-config: 5.1.1(react-router@5.3.4)(react@18.2.0) + react-router-dom: 5.3.4(react@18.2.0) + rtl-detect: 1.1.2 + semver: 7.5.4 + serve-handler: 6.1.5 + shelljs: 0.8.5 + terser-webpack-plugin: 5.3.9(webpack@5.89.0) + tslib: 2.6.2 + update-notifier: 6.0.2 + url-loader: 4.1.1(file-loader@6.2.0)(webpack@5.89.0) + wait-on: 7.0.1 + webpack: 5.89.0 + webpack-bundle-analyzer: 4.9.1 + webpack-dev-server: 4.15.1(webpack@5.89.0) + webpack-merge: 5.10.0 + webpackbar: 5.0.2(webpack@5.89.0) + transitivePeerDependencies: + - '@docusaurus/types' + - '@parcel/css' + - '@swc/core' + - '@swc/css' + - bufferutil + - csso + - debug + - esbuild + - eslint + - lightningcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - vue-template-compiler + - webpack-cli + dev: false + + /@docusaurus/cssnano-preset@3.0.0: + resolution: {integrity: sha512-FHiRfwmVvIVdIGsHcijUOaX7hMn0mugVYB7m4GkpYI6Mi56zwQV4lH5p7DxcW5CUYNWMVxz2loWSCiWEm5ikwA==} + engines: {node: '>=18.0'} + dependencies: + cssnano-preset-advanced: 5.3.10(postcss@8.4.31) + postcss: 8.4.31 + postcss-sort-media-queries: 4.4.1(postcss@8.4.31) + tslib: 2.6.2 + dev: false + + /@docusaurus/logger@3.0.0: + resolution: {integrity: sha512-6eX0eOfioMQCk+qgCnHvbLLuyIAA+r2lSID6d6JusiLtDKmYMfNp3F4yyE8bnb0Abmzt2w68XwptEFYyALSAXw==} + engines: {node: '>=18.0'} + dependencies: + chalk: 4.1.2 + tslib: 2.6.2 + dev: false + + /@docusaurus/mdx-loader@3.0.0(@docusaurus/types@3.0.0)(@swc/core@1.3.95)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-JkGge6WYDrwjNgMxwkb6kNQHnpISt5L1tMaBWFDBKeDToFr5Kj29IL35MIQm0RfrnoOfr/29RjSH4aRtvlAR0A==} + engines: {node: '>=18.0'} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + dependencies: + '@babel/parser': 7.23.0 + '@babel/traverse': 7.23.2 + '@docusaurus/logger': 3.0.0 + '@docusaurus/utils': 3.0.0(@docusaurus/types@3.0.0)(@swc/core@1.3.95) + '@docusaurus/utils-validation': 3.0.0(@docusaurus/types@3.0.0)(@swc/core@1.3.95) + '@mdx-js/mdx': 3.0.0 + '@slorber/remark-comment': 1.0.0 + escape-html: 1.0.3 + estree-util-value-to-estree: 3.0.1 + file-loader: 6.2.0(webpack@5.89.0) + fs-extra: 11.1.1 + image-size: 1.0.2 + mdast-util-mdx: 3.0.0 + mdast-util-to-string: 4.0.0 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + rehype-raw: 7.0.0 + remark-directive: 3.0.0 + remark-emoji: 4.0.1 + remark-frontmatter: 5.0.0 + remark-gfm: 4.0.0 + stringify-object: 3.3.0 + tslib: 2.6.2 + unified: 11.0.4 + unist-util-visit: 5.0.0 + url-loader: 4.1.1(file-loader@6.2.0)(webpack@5.89.0) + vfile: 6.0.1 + webpack: 5.89.0(@swc/core@1.3.95) + transitivePeerDependencies: + - '@docusaurus/types' + - '@swc/core' + - esbuild + - supports-color + - uglify-js + - webpack-cli + dev: false + + /@docusaurus/mdx-loader@3.0.0(@docusaurus/types@3.0.0)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-JkGge6WYDrwjNgMxwkb6kNQHnpISt5L1tMaBWFDBKeDToFr5Kj29IL35MIQm0RfrnoOfr/29RjSH4aRtvlAR0A==} + engines: {node: '>=18.0'} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + dependencies: + '@babel/parser': 7.23.0 + '@babel/traverse': 7.23.2 + '@docusaurus/logger': 3.0.0 + '@docusaurus/utils': 3.0.0(@docusaurus/types@3.0.0) + '@docusaurus/utils-validation': 3.0.0(@docusaurus/types@3.0.0) + '@mdx-js/mdx': 3.0.0 + '@slorber/remark-comment': 1.0.0 + escape-html: 1.0.3 + estree-util-value-to-estree: 3.0.1 + file-loader: 6.2.0(webpack@5.89.0) + fs-extra: 11.1.1 + image-size: 1.0.2 + mdast-util-mdx: 3.0.0 + mdast-util-to-string: 4.0.0 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + rehype-raw: 7.0.0 + remark-directive: 3.0.0 + remark-emoji: 4.0.1 + remark-frontmatter: 5.0.0 + remark-gfm: 4.0.0 + stringify-object: 3.3.0 + tslib: 2.6.2 + unified: 11.0.4 + unist-util-visit: 5.0.0 + url-loader: 4.1.1(file-loader@6.2.0)(webpack@5.89.0) + vfile: 6.0.1 + webpack: 5.89.0 + transitivePeerDependencies: + - '@docusaurus/types' + - '@swc/core' + - esbuild + - supports-color + - uglify-js + - webpack-cli + dev: false + + /@docusaurus/module-type-aliases@3.0.0(@swc/core@1.3.95)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-CfC6CgN4u/ce+2+L1JdsHNyBd8yYjl4De2B2CBj2a9F7WuJ5RjV1ciuU7KDg8uyju+NRVllRgvJvxVUjCdkPiw==} + peerDependencies: + react: '*' + react-dom: '*' + dependencies: + '@docusaurus/react-loadable': 5.5.2(react@18.2.0) + '@docusaurus/types': 3.0.0(@swc/core@1.3.95)(react-dom@18.2.0)(react@18.2.0) + '@types/history': 4.7.11 + '@types/react': 18.2.34 + '@types/react-router-config': 5.0.9 + '@types/react-router-dom': 5.3.3 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-helmet-async: 1.3.0(react-dom@18.2.0)(react@18.2.0) + react-loadable: /@docusaurus/react-loadable@5.5.2(react@18.2.0) + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + - webpack-cli + + /@docusaurus/module-type-aliases@3.0.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-CfC6CgN4u/ce+2+L1JdsHNyBd8yYjl4De2B2CBj2a9F7WuJ5RjV1ciuU7KDg8uyju+NRVllRgvJvxVUjCdkPiw==} + peerDependencies: + react: '*' + react-dom: '*' + dependencies: + '@docusaurus/react-loadable': 5.5.2(react@18.2.0) + '@docusaurus/types': 3.0.0(react-dom@18.2.0)(react@18.2.0) + '@types/history': 4.7.11 + '@types/react': 18.2.34 + '@types/react-router-config': 5.0.9 + '@types/react-router-dom': 5.3.3 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-helmet-async: 1.3.0(react-dom@18.2.0)(react@18.2.0) + react-loadable: /@docusaurus/react-loadable@5.5.2(react@18.2.0) + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + - webpack-cli + + /@docusaurus/plugin-content-blog@3.0.0(@swc/core@1.3.95)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2): + resolution: {integrity: sha512-iA8Wc3tIzVnROJxrbIsU/iSfixHW16YeW9RWsBw7hgEk4dyGsip9AsvEDXobnRq3lVv4mfdgoS545iGWf1Ip9w==} + engines: {node: '>=18.0'} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + dependencies: + '@docusaurus/core': 3.0.0(@docusaurus/types@3.0.0)(@swc/core@1.3.95)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/logger': 3.0.0 + '@docusaurus/mdx-loader': 3.0.0(@docusaurus/types@3.0.0)(@swc/core@1.3.95)(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/types': 3.0.0(@swc/core@1.3.95)(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/utils': 3.0.0(@docusaurus/types@3.0.0)(@swc/core@1.3.95) + '@docusaurus/utils-common': 3.0.0(@docusaurus/types@3.0.0) + '@docusaurus/utils-validation': 3.0.0(@docusaurus/types@3.0.0)(@swc/core@1.3.95) + cheerio: 1.0.0-rc.12 + feed: 4.2.2 + fs-extra: 11.1.1 + lodash: 4.17.21 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + reading-time: 1.5.0 + srcset: 4.0.0 + tslib: 2.6.2 + unist-util-visit: 5.0.0 + utility-types: 3.10.0 + webpack: 5.89.0(@swc/core@1.3.95) + transitivePeerDependencies: + - '@parcel/css' + - '@swc/core' + - '@swc/css' + - bufferutil + - csso + - debug + - esbuild + - eslint + - lightningcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - vue-template-compiler + - webpack-cli + dev: false + + /@docusaurus/plugin-content-blog@3.0.0(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2): + resolution: {integrity: sha512-iA8Wc3tIzVnROJxrbIsU/iSfixHW16YeW9RWsBw7hgEk4dyGsip9AsvEDXobnRq3lVv4mfdgoS545iGWf1Ip9w==} + engines: {node: '>=18.0'} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + dependencies: + '@docusaurus/core': 3.0.0(@docusaurus/types@3.0.0)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/logger': 3.0.0 + '@docusaurus/mdx-loader': 3.0.0(@docusaurus/types@3.0.0)(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/types': 3.0.0(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/utils': 3.0.0(@docusaurus/types@3.0.0) + '@docusaurus/utils-common': 3.0.0(@docusaurus/types@3.0.0) + '@docusaurus/utils-validation': 3.0.0(@docusaurus/types@3.0.0) + cheerio: 1.0.0-rc.12 + feed: 4.2.2 + fs-extra: 11.1.1 + lodash: 4.17.21 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + reading-time: 1.5.0 + srcset: 4.0.0 + tslib: 2.6.2 + unist-util-visit: 5.0.0 + utility-types: 3.10.0 + webpack: 5.89.0 + transitivePeerDependencies: + - '@parcel/css' + - '@swc/core' + - '@swc/css' + - bufferutil + - csso + - debug + - esbuild + - eslint + - lightningcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - vue-template-compiler + - webpack-cli + dev: false + + /@docusaurus/plugin-content-docs@3.0.0(@swc/core@1.3.95)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2): + resolution: {integrity: sha512-MFZsOSwmeJ6rvoZMLieXxPuJsA9M9vn7/mUZmfUzSUTeHAeq+fEqvLltFOxcj4DVVDTYlQhgWYd+PISIWgamKw==} + engines: {node: '>=18.0'} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + dependencies: + '@docusaurus/core': 3.0.0(@docusaurus/types@3.0.0)(@swc/core@1.3.95)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/logger': 3.0.0 + '@docusaurus/mdx-loader': 3.0.0(@docusaurus/types@3.0.0)(@swc/core@1.3.95)(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/module-type-aliases': 3.0.0(@swc/core@1.3.95)(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/types': 3.0.0(@swc/core@1.3.95)(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/utils': 3.0.0(@docusaurus/types@3.0.0)(@swc/core@1.3.95) + '@docusaurus/utils-validation': 3.0.0(@docusaurus/types@3.0.0)(@swc/core@1.3.95) + '@types/react-router-config': 5.0.9 + combine-promises: 1.2.0 + fs-extra: 11.1.1 + js-yaml: 4.1.0 + lodash: 4.17.21 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + tslib: 2.6.2 + utility-types: 3.10.0 + webpack: 5.89.0(@swc/core@1.3.95) + transitivePeerDependencies: + - '@parcel/css' + - '@swc/core' + - '@swc/css' + - bufferutil + - csso + - debug + - esbuild + - eslint + - lightningcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - vue-template-compiler + - webpack-cli + dev: false + + /@docusaurus/plugin-content-docs@3.0.0(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2): + resolution: {integrity: sha512-MFZsOSwmeJ6rvoZMLieXxPuJsA9M9vn7/mUZmfUzSUTeHAeq+fEqvLltFOxcj4DVVDTYlQhgWYd+PISIWgamKw==} + engines: {node: '>=18.0'} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + dependencies: + '@docusaurus/core': 3.0.0(@docusaurus/types@3.0.0)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/logger': 3.0.0 + '@docusaurus/mdx-loader': 3.0.0(@docusaurus/types@3.0.0)(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/module-type-aliases': 3.0.0(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/types': 3.0.0(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/utils': 3.0.0(@docusaurus/types@3.0.0) + '@docusaurus/utils-validation': 3.0.0(@docusaurus/types@3.0.0) + '@types/react-router-config': 5.0.9 + combine-promises: 1.2.0 + fs-extra: 11.1.1 + js-yaml: 4.1.0 + lodash: 4.17.21 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + tslib: 2.6.2 + utility-types: 3.10.0 + webpack: 5.89.0 + transitivePeerDependencies: + - '@parcel/css' + - '@swc/core' + - '@swc/css' + - bufferutil + - csso + - debug + - esbuild + - eslint + - lightningcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - vue-template-compiler + - webpack-cli + dev: false + + /@docusaurus/plugin-content-pages@3.0.0(@swc/core@1.3.95)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2): + resolution: {integrity: sha512-EXYHXK2Ea1B5BUmM0DgSwaOYt8EMSzWtYUToNo62Q/EoWxYOQFdWglYnw3n7ZEGyw5Kog4LHaRwlazAdmDomvQ==} + engines: {node: '>=18.0'} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + dependencies: + '@docusaurus/core': 3.0.0(@docusaurus/types@3.0.0)(@swc/core@1.3.95)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/mdx-loader': 3.0.0(@docusaurus/types@3.0.0)(@swc/core@1.3.95)(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/types': 3.0.0(@swc/core@1.3.95)(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/utils': 3.0.0(@docusaurus/types@3.0.0)(@swc/core@1.3.95) + '@docusaurus/utils-validation': 3.0.0(@docusaurus/types@3.0.0)(@swc/core@1.3.95) + fs-extra: 11.1.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + tslib: 2.6.2 + webpack: 5.89.0(@swc/core@1.3.95) + transitivePeerDependencies: + - '@parcel/css' + - '@swc/core' + - '@swc/css' + - bufferutil + - csso + - debug + - esbuild + - eslint + - lightningcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - vue-template-compiler + - webpack-cli + dev: false + + /@docusaurus/plugin-content-pages@3.0.0(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2): + resolution: {integrity: sha512-EXYHXK2Ea1B5BUmM0DgSwaOYt8EMSzWtYUToNo62Q/EoWxYOQFdWglYnw3n7ZEGyw5Kog4LHaRwlazAdmDomvQ==} + engines: {node: '>=18.0'} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + dependencies: + '@docusaurus/core': 3.0.0(@docusaurus/types@3.0.0)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/mdx-loader': 3.0.0(@docusaurus/types@3.0.0)(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/types': 3.0.0(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/utils': 3.0.0(@docusaurus/types@3.0.0) + '@docusaurus/utils-validation': 3.0.0(@docusaurus/types@3.0.0) + fs-extra: 11.1.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + tslib: 2.6.2 + webpack: 5.89.0 + transitivePeerDependencies: + - '@parcel/css' + - '@swc/core' + - '@swc/css' + - bufferutil + - csso + - debug + - esbuild + - eslint + - lightningcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - vue-template-compiler + - webpack-cli + dev: false + + /@docusaurus/plugin-debug@3.0.0(@swc/core@1.3.95)(@types/react@18.2.34)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2): + resolution: {integrity: sha512-gSV07HfQgnUboVEb3lucuVyv5pEoy33E7QXzzn++3kSc/NLEimkjXh3sSnTGOishkxCqlFV9BHfY/VMm5Lko5g==} + engines: {node: '>=18.0'} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + dependencies: + '@docusaurus/core': 3.0.0(@docusaurus/types@3.0.0)(@swc/core@1.3.95)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/types': 3.0.0(@swc/core@1.3.95)(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/utils': 3.0.0(@docusaurus/types@3.0.0)(@swc/core@1.3.95) + '@microlink/react-json-view': 1.23.0(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + fs-extra: 11.1.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + tslib: 2.6.2 + transitivePeerDependencies: + - '@parcel/css' + - '@swc/core' + - '@swc/css' + - '@types/react' + - bufferutil + - csso + - debug + - encoding + - esbuild + - eslint + - lightningcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - vue-template-compiler + - webpack-cli + dev: false + + /@docusaurus/plugin-debug@3.0.0(@types/react@18.2.34)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2): + resolution: {integrity: sha512-gSV07HfQgnUboVEb3lucuVyv5pEoy33E7QXzzn++3kSc/NLEimkjXh3sSnTGOishkxCqlFV9BHfY/VMm5Lko5g==} + engines: {node: '>=18.0'} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + dependencies: + '@docusaurus/core': 3.0.0(@docusaurus/types@3.0.0)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/types': 3.0.0(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/utils': 3.0.0(@docusaurus/types@3.0.0) + '@microlink/react-json-view': 1.23.0(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + fs-extra: 11.1.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + tslib: 2.6.2 + transitivePeerDependencies: + - '@parcel/css' + - '@swc/core' + - '@swc/css' + - '@types/react' + - bufferutil + - csso + - debug + - encoding + - esbuild + - eslint + - lightningcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - vue-template-compiler + - webpack-cli + dev: false + + /@docusaurus/plugin-google-analytics@3.0.0(@swc/core@1.3.95)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2): + resolution: {integrity: sha512-0zcLK8w+ohmSm1fjUQCqeRsjmQc0gflvXnaVA/QVVCtm2yCiBtkrSGQXqt4MdpD7Xq8mwo3qVd5nhIcvrcebqw==} + engines: {node: '>=18.0'} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + dependencies: + '@docusaurus/core': 3.0.0(@docusaurus/types@3.0.0)(@swc/core@1.3.95)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/types': 3.0.0(@swc/core@1.3.95)(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/utils-validation': 3.0.0(@docusaurus/types@3.0.0)(@swc/core@1.3.95) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + tslib: 2.6.2 + transitivePeerDependencies: + - '@parcel/css' + - '@swc/core' + - '@swc/css' + - bufferutil + - csso + - debug + - esbuild + - eslint + - lightningcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - vue-template-compiler + - webpack-cli + dev: false + + /@docusaurus/plugin-google-analytics@3.0.0(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2): + resolution: {integrity: sha512-0zcLK8w+ohmSm1fjUQCqeRsjmQc0gflvXnaVA/QVVCtm2yCiBtkrSGQXqt4MdpD7Xq8mwo3qVd5nhIcvrcebqw==} + engines: {node: '>=18.0'} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + dependencies: + '@docusaurus/core': 3.0.0(@docusaurus/types@3.0.0)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/types': 3.0.0(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/utils-validation': 3.0.0(@docusaurus/types@3.0.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + tslib: 2.6.2 + transitivePeerDependencies: + - '@parcel/css' + - '@swc/core' + - '@swc/css' + - bufferutil + - csso + - debug + - esbuild + - eslint + - lightningcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - vue-template-compiler + - webpack-cli + dev: false + + /@docusaurus/plugin-google-gtag@3.0.0(@swc/core@1.3.95)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2): + resolution: {integrity: sha512-asEKavw8fczUqvXu/s9kG2m1epLnHJ19W6CCCRZEmpnkZUZKiM8rlkDiEmxApwIc2JDDbIMk+Y2TMkJI8mInbQ==} + engines: {node: '>=18.0'} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + dependencies: + '@docusaurus/core': 3.0.0(@docusaurus/types@3.0.0)(@swc/core@1.3.95)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/types': 3.0.0(@swc/core@1.3.95)(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/utils-validation': 3.0.0(@docusaurus/types@3.0.0)(@swc/core@1.3.95) + '@types/gtag.js': 0.0.12 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + tslib: 2.6.2 + transitivePeerDependencies: + - '@parcel/css' + - '@swc/core' + - '@swc/css' + - bufferutil + - csso + - debug + - esbuild + - eslint + - lightningcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - vue-template-compiler + - webpack-cli + dev: false + + /@docusaurus/plugin-google-gtag@3.0.0(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2): + resolution: {integrity: sha512-asEKavw8fczUqvXu/s9kG2m1epLnHJ19W6CCCRZEmpnkZUZKiM8rlkDiEmxApwIc2JDDbIMk+Y2TMkJI8mInbQ==} + engines: {node: '>=18.0'} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + dependencies: + '@docusaurus/core': 3.0.0(@docusaurus/types@3.0.0)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/types': 3.0.0(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/utils-validation': 3.0.0(@docusaurus/types@3.0.0) + '@types/gtag.js': 0.0.12 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + tslib: 2.6.2 + transitivePeerDependencies: + - '@parcel/css' + - '@swc/core' + - '@swc/css' + - bufferutil + - csso + - debug + - esbuild + - eslint + - lightningcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - vue-template-compiler + - webpack-cli + dev: false + + /@docusaurus/plugin-google-tag-manager@3.0.0(@swc/core@1.3.95)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2): + resolution: {integrity: sha512-lytgu2eyn+7p4WklJkpMGRhwC29ezj4IjPPmVJ8vGzcSl6JkR1sADTHLG5xWOMuci420xZl9dGEiLTQ8FjCRyA==} + engines: {node: '>=18.0'} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + dependencies: + '@docusaurus/core': 3.0.0(@docusaurus/types@3.0.0)(@swc/core@1.3.95)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/types': 3.0.0(@swc/core@1.3.95)(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/utils-validation': 3.0.0(@docusaurus/types@3.0.0)(@swc/core@1.3.95) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + tslib: 2.6.2 + transitivePeerDependencies: + - '@parcel/css' + - '@swc/core' + - '@swc/css' + - bufferutil + - csso + - debug + - esbuild + - eslint + - lightningcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - vue-template-compiler + - webpack-cli + dev: false + + /@docusaurus/plugin-google-tag-manager@3.0.0(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2): + resolution: {integrity: sha512-lytgu2eyn+7p4WklJkpMGRhwC29ezj4IjPPmVJ8vGzcSl6JkR1sADTHLG5xWOMuci420xZl9dGEiLTQ8FjCRyA==} + engines: {node: '>=18.0'} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + dependencies: + '@docusaurus/core': 3.0.0(@docusaurus/types@3.0.0)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/types': 3.0.0(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/utils-validation': 3.0.0(@docusaurus/types@3.0.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + tslib: 2.6.2 + transitivePeerDependencies: + - '@parcel/css' + - '@swc/core' + - '@swc/css' + - bufferutil + - csso + - debug + - esbuild + - eslint + - lightningcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - vue-template-compiler + - webpack-cli + dev: false + + /@docusaurus/plugin-sitemap@3.0.0(@swc/core@1.3.95)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2): + resolution: {integrity: sha512-cfcONdWku56Oi7Hdus2uvUw/RKRRlIGMViiHLjvQ21CEsEqnQ297MRoIgjU28kL7/CXD/+OiANSq3T1ezAiMhA==} + engines: {node: '>=18.0'} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + dependencies: + '@docusaurus/core': 3.0.0(@docusaurus/types@3.0.0)(@swc/core@1.3.95)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/logger': 3.0.0 + '@docusaurus/types': 3.0.0(@swc/core@1.3.95)(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/utils': 3.0.0(@docusaurus/types@3.0.0)(@swc/core@1.3.95) + '@docusaurus/utils-common': 3.0.0(@docusaurus/types@3.0.0) + '@docusaurus/utils-validation': 3.0.0(@docusaurus/types@3.0.0)(@swc/core@1.3.95) + fs-extra: 11.1.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + sitemap: 7.1.1 + tslib: 2.6.2 + transitivePeerDependencies: + - '@parcel/css' + - '@swc/core' + - '@swc/css' + - bufferutil + - csso + - debug + - esbuild + - eslint + - lightningcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - vue-template-compiler + - webpack-cli + dev: false + + /@docusaurus/plugin-sitemap@3.0.0(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2): + resolution: {integrity: sha512-cfcONdWku56Oi7Hdus2uvUw/RKRRlIGMViiHLjvQ21CEsEqnQ297MRoIgjU28kL7/CXD/+OiANSq3T1ezAiMhA==} + engines: {node: '>=18.0'} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + dependencies: + '@docusaurus/core': 3.0.0(@docusaurus/types@3.0.0)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/logger': 3.0.0 + '@docusaurus/types': 3.0.0(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/utils': 3.0.0(@docusaurus/types@3.0.0) + '@docusaurus/utils-common': 3.0.0(@docusaurus/types@3.0.0) + '@docusaurus/utils-validation': 3.0.0(@docusaurus/types@3.0.0) + fs-extra: 11.1.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + sitemap: 7.1.1 + tslib: 2.6.2 + transitivePeerDependencies: + - '@parcel/css' + - '@swc/core' + - '@swc/css' + - bufferutil + - csso + - debug + - esbuild + - eslint + - lightningcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - vue-template-compiler + - webpack-cli + dev: false + + /@docusaurus/preset-classic@3.0.0(@algolia/client-search@4.20.0)(@swc/core@1.3.95)(@types/react@18.2.34)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.9.0)(typescript@5.2.2): + resolution: {integrity: sha512-90aOKZGZdi0+GVQV+wt8xx4M4GiDrBRke8NO8nWwytMEXNrxrBxsQYFRD1YlISLJSCiHikKf3Z/MovMnQpnZyg==} + engines: {node: '>=18.0'} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + dependencies: + '@docusaurus/core': 3.0.0(@docusaurus/types@3.0.0)(@swc/core@1.3.95)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/plugin-content-blog': 3.0.0(@swc/core@1.3.95)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/plugin-content-docs': 3.0.0(@swc/core@1.3.95)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/plugin-content-pages': 3.0.0(@swc/core@1.3.95)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/plugin-debug': 3.0.0(@swc/core@1.3.95)(@types/react@18.2.34)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/plugin-google-analytics': 3.0.0(@swc/core@1.3.95)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/plugin-google-gtag': 3.0.0(@swc/core@1.3.95)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/plugin-google-tag-manager': 3.0.0(@swc/core@1.3.95)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/plugin-sitemap': 3.0.0(@swc/core@1.3.95)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/theme-classic': 3.0.0(@swc/core@1.3.95)(@types/react@18.2.34)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/theme-common': 3.0.0(@docusaurus/types@3.0.0)(@swc/core@1.3.95)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/theme-search-algolia': 3.0.0(@algolia/client-search@4.20.0)(@docusaurus/types@3.0.0)(@swc/core@1.3.95)(@types/react@18.2.34)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.9.0)(typescript@5.2.2) + '@docusaurus/types': 3.0.0(@swc/core@1.3.95)(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + transitivePeerDependencies: + - '@algolia/client-search' + - '@parcel/css' + - '@swc/core' + - '@swc/css' + - '@types/react' + - bufferutil + - csso + - debug + - encoding + - esbuild + - eslint + - lightningcss + - search-insights + - supports-color + - typescript + - uglify-js + - utf-8-validate + - vue-template-compiler + - webpack-cli + dev: false + + /@docusaurus/preset-classic@3.0.0(@algolia/client-search@4.20.0)(@types/react@18.2.34)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.9.0)(typescript@5.2.2): + resolution: {integrity: sha512-90aOKZGZdi0+GVQV+wt8xx4M4GiDrBRke8NO8nWwytMEXNrxrBxsQYFRD1YlISLJSCiHikKf3Z/MovMnQpnZyg==} + engines: {node: '>=18.0'} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + dependencies: + '@docusaurus/core': 3.0.0(@docusaurus/types@3.0.0)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/plugin-content-blog': 3.0.0(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/plugin-content-docs': 3.0.0(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/plugin-content-pages': 3.0.0(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/plugin-debug': 3.0.0(@types/react@18.2.34)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/plugin-google-analytics': 3.0.0(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/plugin-google-gtag': 3.0.0(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/plugin-google-tag-manager': 3.0.0(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/plugin-sitemap': 3.0.0(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/theme-classic': 3.0.0(@types/react@18.2.34)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/theme-common': 3.0.0(@docusaurus/types@3.0.0)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/theme-search-algolia': 3.0.0(@algolia/client-search@4.20.0)(@docusaurus/types@3.0.0)(@types/react@18.2.34)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.9.0)(typescript@5.2.2) + '@docusaurus/types': 3.0.0(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + transitivePeerDependencies: + - '@algolia/client-search' + - '@parcel/css' + - '@swc/core' + - '@swc/css' + - '@types/react' + - bufferutil + - csso + - debug + - encoding + - esbuild + - eslint + - lightningcss + - search-insights + - supports-color + - typescript + - uglify-js + - utf-8-validate + - vue-template-compiler + - webpack-cli + dev: false + + /@docusaurus/react-loadable@5.5.2(react@18.2.0): + resolution: {integrity: sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ==} + peerDependencies: + react: '*' + dependencies: + '@types/react': 18.2.34 + prop-types: 15.8.1 + react: 18.2.0 + + /@docusaurus/theme-classic@3.0.0(@swc/core@1.3.95)(@types/react@18.2.34)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2): + resolution: {integrity: sha512-wWOHSrKMn7L4jTtXBsb5iEJ3xvTddBye5PjYBnWiCkTAlhle2yMdc4/qRXW35Ot+OV/VXu6YFG8XVUJEl99z0A==} + engines: {node: '>=18.0'} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + dependencies: + '@docusaurus/core': 3.0.0(@docusaurus/types@3.0.0)(@swc/core@1.3.95)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/mdx-loader': 3.0.0(@docusaurus/types@3.0.0)(@swc/core@1.3.95)(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/module-type-aliases': 3.0.0(@swc/core@1.3.95)(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/plugin-content-blog': 3.0.0(@swc/core@1.3.95)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/plugin-content-docs': 3.0.0(@swc/core@1.3.95)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/plugin-content-pages': 3.0.0(@swc/core@1.3.95)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/theme-common': 3.0.0(@docusaurus/types@3.0.0)(@swc/core@1.3.95)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/theme-translations': 3.0.0 + '@docusaurus/types': 3.0.0(@swc/core@1.3.95)(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/utils': 3.0.0(@docusaurus/types@3.0.0)(@swc/core@1.3.95) + '@docusaurus/utils-common': 3.0.0(@docusaurus/types@3.0.0) + '@docusaurus/utils-validation': 3.0.0(@docusaurus/types@3.0.0)(@swc/core@1.3.95) + '@mdx-js/react': 3.0.0(@types/react@18.2.34)(react@18.2.0) + clsx: 1.2.1 + copy-text-to-clipboard: 3.2.0 + infima: 0.2.0-alpha.43 + lodash: 4.17.21 + nprogress: 0.2.0 + postcss: 8.4.31 + prism-react-renderer: 2.1.0(react@18.2.0) + prismjs: 1.29.0 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-router-dom: 5.3.4(react@18.2.0) + rtlcss: 4.1.1 + tslib: 2.6.2 + utility-types: 3.10.0 + transitivePeerDependencies: + - '@parcel/css' + - '@swc/core' + - '@swc/css' + - '@types/react' + - bufferutil + - csso + - debug + - esbuild + - eslint + - lightningcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - vue-template-compiler + - webpack-cli + dev: false + + /@docusaurus/theme-classic@3.0.0(@types/react@18.2.34)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2): + resolution: {integrity: sha512-wWOHSrKMn7L4jTtXBsb5iEJ3xvTddBye5PjYBnWiCkTAlhle2yMdc4/qRXW35Ot+OV/VXu6YFG8XVUJEl99z0A==} + engines: {node: '>=18.0'} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + dependencies: + '@docusaurus/core': 3.0.0(@docusaurus/types@3.0.0)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/mdx-loader': 3.0.0(@docusaurus/types@3.0.0)(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/module-type-aliases': 3.0.0(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/plugin-content-blog': 3.0.0(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/plugin-content-docs': 3.0.0(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/plugin-content-pages': 3.0.0(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/theme-common': 3.0.0(@docusaurus/types@3.0.0)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/theme-translations': 3.0.0 + '@docusaurus/types': 3.0.0(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/utils': 3.0.0(@docusaurus/types@3.0.0) + '@docusaurus/utils-common': 3.0.0(@docusaurus/types@3.0.0) + '@docusaurus/utils-validation': 3.0.0(@docusaurus/types@3.0.0) + '@mdx-js/react': 3.0.0(@types/react@18.2.34)(react@18.2.0) + clsx: 1.2.1 + copy-text-to-clipboard: 3.2.0 + infima: 0.2.0-alpha.43 + lodash: 4.17.21 + nprogress: 0.2.0 + postcss: 8.4.31 + prism-react-renderer: 2.1.0(react@18.2.0) + prismjs: 1.29.0 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-router-dom: 5.3.4(react@18.2.0) + rtlcss: 4.1.1 + tslib: 2.6.2 + utility-types: 3.10.0 + transitivePeerDependencies: + - '@parcel/css' + - '@swc/core' + - '@swc/css' + - '@types/react' + - bufferutil + - csso + - debug + - esbuild + - eslint + - lightningcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - vue-template-compiler + - webpack-cli + dev: false + + /@docusaurus/theme-common@3.0.0(@docusaurus/types@3.0.0)(@swc/core@1.3.95)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2): + resolution: {integrity: sha512-PahRpCLRK5owCMEqcNtUeTMOkTUCzrJlKA+HLu7f+8osYOni617YurXvHASCsSTxurjXaLz/RqZMnASnqATxIA==} + engines: {node: '>=18.0'} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + dependencies: + '@docusaurus/mdx-loader': 3.0.0(@docusaurus/types@3.0.0)(@swc/core@1.3.95)(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/module-type-aliases': 3.0.0(@swc/core@1.3.95)(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/plugin-content-blog': 3.0.0(@swc/core@1.3.95)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/plugin-content-docs': 3.0.0(@swc/core@1.3.95)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/plugin-content-pages': 3.0.0(@swc/core@1.3.95)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/utils': 3.0.0(@docusaurus/types@3.0.0)(@swc/core@1.3.95) + '@docusaurus/utils-common': 3.0.0(@docusaurus/types@3.0.0) + '@types/history': 4.7.11 + '@types/react': 18.2.34 + '@types/react-router-config': 5.0.9 + clsx: 1.2.1 + parse-numeric-range: 1.3.0 + prism-react-renderer: 2.1.0(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + tslib: 2.6.2 + utility-types: 3.10.0 + transitivePeerDependencies: + - '@docusaurus/types' + - '@parcel/css' + - '@swc/core' + - '@swc/css' + - bufferutil + - csso + - debug + - esbuild + - eslint + - lightningcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - vue-template-compiler + - webpack-cli + dev: false + + /@docusaurus/theme-common@3.0.0(@docusaurus/types@3.0.0)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2): + resolution: {integrity: sha512-PahRpCLRK5owCMEqcNtUeTMOkTUCzrJlKA+HLu7f+8osYOni617YurXvHASCsSTxurjXaLz/RqZMnASnqATxIA==} + engines: {node: '>=18.0'} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + dependencies: + '@docusaurus/mdx-loader': 3.0.0(@docusaurus/types@3.0.0)(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/module-type-aliases': 3.0.0(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/plugin-content-blog': 3.0.0(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/plugin-content-docs': 3.0.0(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/plugin-content-pages': 3.0.0(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/utils': 3.0.0(@docusaurus/types@3.0.0) + '@docusaurus/utils-common': 3.0.0(@docusaurus/types@3.0.0) + '@types/history': 4.7.11 + '@types/react': 18.2.34 + '@types/react-router-config': 5.0.9 + clsx: 1.2.1 + parse-numeric-range: 1.3.0 + prism-react-renderer: 2.1.0(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + tslib: 2.6.2 + utility-types: 3.10.0 + transitivePeerDependencies: + - '@docusaurus/types' + - '@parcel/css' + - '@swc/core' + - '@swc/css' + - bufferutil + - csso + - debug + - esbuild + - eslint + - lightningcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - vue-template-compiler + - webpack-cli + dev: false + + /@docusaurus/theme-mermaid@3.0.0(@swc/core@1.3.95)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2): + resolution: {integrity: sha512-e5uoGmow5kk5AeiyYFHYGsM5LFg4ClCIIQQcBrD9zs1E8yxTDNX524MylO6klqqCn3TmxJ34RogEg78QnthRng==} + engines: {node: '>=18.0'} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + dependencies: + '@docusaurus/core': 3.0.0(@docusaurus/types@3.0.0)(@swc/core@1.3.95)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/module-type-aliases': 3.0.0(@swc/core@1.3.95)(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/theme-common': 3.0.0(@docusaurus/types@3.0.0)(@swc/core@1.3.95)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/types': 3.0.0(@swc/core@1.3.95)(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/utils-validation': 3.0.0(@docusaurus/types@3.0.0)(@swc/core@1.3.95) + mermaid: 10.4.0 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + tslib: 2.6.2 + transitivePeerDependencies: + - '@parcel/css' + - '@swc/core' + - '@swc/css' + - bufferutil + - csso + - debug + - esbuild + - eslint + - lightningcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - vue-template-compiler + - webpack-cli + dev: false + + /@docusaurus/theme-search-algolia@3.0.0(@algolia/client-search@4.20.0)(@docusaurus/types@3.0.0)(@swc/core@1.3.95)(@types/react@18.2.34)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.9.0)(typescript@5.2.2): + resolution: {integrity: sha512-PyMUNIS9yu0dx7XffB13ti4TG47pJq3G2KE/INvOFb6M0kWh+wwCnucPg4WAOysHOPh+SD9fjlXILoLQstgEIA==} + engines: {node: '>=18.0'} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + dependencies: + '@docsearch/react': 3.5.2(@algolia/client-search@4.20.0)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.9.0) + '@docusaurus/core': 3.0.0(@docusaurus/types@3.0.0)(@swc/core@1.3.95)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/logger': 3.0.0 + '@docusaurus/plugin-content-docs': 3.0.0(@swc/core@1.3.95)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/theme-common': 3.0.0(@docusaurus/types@3.0.0)(@swc/core@1.3.95)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/theme-translations': 3.0.0 + '@docusaurus/utils': 3.0.0(@docusaurus/types@3.0.0)(@swc/core@1.3.95) + '@docusaurus/utils-validation': 3.0.0(@docusaurus/types@3.0.0)(@swc/core@1.3.95) + algoliasearch: 4.20.0 + algoliasearch-helper: 3.15.0(algoliasearch@4.20.0) + clsx: 1.2.1 + eta: 2.2.0 + fs-extra: 11.1.1 + lodash: 4.17.21 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + tslib: 2.6.2 + utility-types: 3.10.0 + transitivePeerDependencies: + - '@algolia/client-search' + - '@docusaurus/types' + - '@parcel/css' + - '@swc/core' + - '@swc/css' + - '@types/react' + - bufferutil + - csso + - debug + - esbuild + - eslint + - lightningcss + - search-insights + - supports-color + - typescript + - uglify-js + - utf-8-validate + - vue-template-compiler + - webpack-cli + dev: false + + /@docusaurus/theme-search-algolia@3.0.0(@algolia/client-search@4.20.0)(@docusaurus/types@3.0.0)(@types/react@18.2.34)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.9.0)(typescript@5.2.2): + resolution: {integrity: sha512-PyMUNIS9yu0dx7XffB13ti4TG47pJq3G2KE/INvOFb6M0kWh+wwCnucPg4WAOysHOPh+SD9fjlXILoLQstgEIA==} + engines: {node: '>=18.0'} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + dependencies: + '@docsearch/react': 3.5.2(@algolia/client-search@4.20.0)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.9.0) + '@docusaurus/core': 3.0.0(@docusaurus/types@3.0.0)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/logger': 3.0.0 + '@docusaurus/plugin-content-docs': 3.0.0(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/theme-common': 3.0.0(@docusaurus/types@3.0.0)(eslint@8.52.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/theme-translations': 3.0.0 + '@docusaurus/utils': 3.0.0(@docusaurus/types@3.0.0) + '@docusaurus/utils-validation': 3.0.0(@docusaurus/types@3.0.0) + algoliasearch: 4.20.0 + algoliasearch-helper: 3.15.0(algoliasearch@4.20.0) + clsx: 1.2.1 + eta: 2.2.0 + fs-extra: 11.1.1 + lodash: 4.17.21 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + tslib: 2.6.2 + utility-types: 3.10.0 + transitivePeerDependencies: + - '@algolia/client-search' + - '@docusaurus/types' + - '@parcel/css' + - '@swc/core' + - '@swc/css' + - '@types/react' + - bufferutil + - csso + - debug + - esbuild + - eslint + - lightningcss + - search-insights + - supports-color + - typescript + - uglify-js + - utf-8-validate + - vue-template-compiler + - webpack-cli + dev: false + + /@docusaurus/theme-translations@3.0.0: + resolution: {integrity: sha512-p/H3+5LdnDtbMU+csYukA6601U1ld2v9knqxGEEV96qV27HsHfP63J9Ta2RBZUrNhQAgrwFzIc9GdDO8P1Baag==} + engines: {node: '>=18.0'} + dependencies: + fs-extra: 11.1.1 + tslib: 2.6.2 + dev: false + + /@docusaurus/tsconfig@3.0.0: + resolution: {integrity: sha512-yR9sng4izFudS+v1xV5yboNfc1hATMDpYp9iYfWggbBDwKSm0J1IdIgkygRnqC/AWs1ARUQUpG0gFotPCE/4Ew==} + dev: true + + /@docusaurus/types@3.0.0(@swc/core@1.3.95)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-Qb+l/hmCOVemReuzvvcFdk84bUmUFyD0Zi81y651ie3VwMrXqC7C0E7yZLKMOsLj/vkqsxHbtkAuYMI89YzNzg==} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + dependencies: + '@types/history': 4.7.11 + '@types/react': 18.2.34 + commander: 5.1.0 + joi: 17.11.0 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-helmet-async: 1.3.0(react-dom@18.2.0)(react@18.2.0) + utility-types: 3.10.0 + webpack: 5.89.0(@swc/core@1.3.95) + webpack-merge: 5.10.0 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + - webpack-cli + + /@docusaurus/types@3.0.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-Qb+l/hmCOVemReuzvvcFdk84bUmUFyD0Zi81y651ie3VwMrXqC7C0E7yZLKMOsLj/vkqsxHbtkAuYMI89YzNzg==} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + dependencies: + '@types/history': 4.7.11 + '@types/react': 18.2.34 + commander: 5.1.0 + joi: 17.11.0 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-helmet-async: 1.3.0(react-dom@18.2.0)(react@18.2.0) + utility-types: 3.10.0 + webpack: 5.89.0 + webpack-merge: 5.10.0 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + - webpack-cli + + /@docusaurus/utils-common@3.0.0(@docusaurus/types@3.0.0): + resolution: {integrity: sha512-7iJWAtt4AHf4PFEPlEPXko9LZD/dbYnhLe0q8e3GRK1EXZyRASah2lznpMwB3lLmVjq/FR6ZAKF+E0wlmL5j0g==} + engines: {node: '>=18.0'} + peerDependencies: + '@docusaurus/types': '*' + peerDependenciesMeta: + '@docusaurus/types': + optional: true + dependencies: + '@docusaurus/types': 3.0.0(@swc/core@1.3.95)(react-dom@18.2.0)(react@18.2.0) + tslib: 2.6.2 + dev: false + + /@docusaurus/utils-validation@3.0.0(@docusaurus/types@3.0.0): + resolution: {integrity: sha512-MlIGUspB/HBW5CYgHvRhmkZbeMiUWKbyVoCQYvbGN8S19SSzVgzyy97KRpcjCOYYeEdkhmRCUwFBJBlLg3IoNQ==} + engines: {node: '>=18.0'} + dependencies: + '@docusaurus/logger': 3.0.0 + '@docusaurus/utils': 3.0.0(@docusaurus/types@3.0.0) + joi: 17.11.0 + js-yaml: 4.1.0 + tslib: 2.6.2 + transitivePeerDependencies: + - '@docusaurus/types' + - '@swc/core' + - esbuild + - supports-color + - uglify-js + - webpack-cli + dev: false + + /@docusaurus/utils-validation@3.0.0(@docusaurus/types@3.0.0)(@swc/core@1.3.95): + resolution: {integrity: sha512-MlIGUspB/HBW5CYgHvRhmkZbeMiUWKbyVoCQYvbGN8S19SSzVgzyy97KRpcjCOYYeEdkhmRCUwFBJBlLg3IoNQ==} + engines: {node: '>=18.0'} + dependencies: + '@docusaurus/logger': 3.0.0 + '@docusaurus/utils': 3.0.0(@docusaurus/types@3.0.0)(@swc/core@1.3.95) + joi: 17.11.0 + js-yaml: 4.1.0 + tslib: 2.6.2 + transitivePeerDependencies: + - '@docusaurus/types' + - '@swc/core' + - esbuild + - supports-color + - uglify-js + - webpack-cli + dev: false + + /@docusaurus/utils@3.0.0(@docusaurus/types@3.0.0): + resolution: {integrity: sha512-JwGjh5mtjG9XIAESyPxObL6CZ6LO/yU4OSTpq7Q0x+jN25zi/AMbvLjpSyZzWy+qm5uQiFiIhqFaOxvy+82Ekg==} + engines: {node: '>=18.0'} + peerDependencies: + '@docusaurus/types': '*' + peerDependenciesMeta: + '@docusaurus/types': + optional: true + dependencies: + '@docusaurus/logger': 3.0.0 + '@docusaurus/types': 3.0.0(react-dom@18.2.0)(react@18.2.0) + '@svgr/webpack': 6.5.1 + escape-string-regexp: 4.0.0 + file-loader: 6.2.0(webpack@5.89.0) + fs-extra: 11.1.1 + github-slugger: 1.5.0 + globby: 11.1.0 + gray-matter: 4.0.3 + jiti: 1.21.0 + js-yaml: 4.1.0 + lodash: 4.17.21 + micromatch: 4.0.5 + resolve-pathname: 3.0.0 + shelljs: 0.8.5 + tslib: 2.6.2 + url-loader: 4.1.1(file-loader@6.2.0)(webpack@5.89.0) + webpack: 5.89.0 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - supports-color + - uglify-js + - webpack-cli + dev: false + + /@docusaurus/utils@3.0.0(@docusaurus/types@3.0.0)(@swc/core@1.3.95): + resolution: {integrity: sha512-JwGjh5mtjG9XIAESyPxObL6CZ6LO/yU4OSTpq7Q0x+jN25zi/AMbvLjpSyZzWy+qm5uQiFiIhqFaOxvy+82Ekg==} + engines: {node: '>=18.0'} + peerDependencies: + '@docusaurus/types': '*' + peerDependenciesMeta: + '@docusaurus/types': + optional: true + dependencies: + '@docusaurus/logger': 3.0.0 + '@docusaurus/types': 3.0.0(@swc/core@1.3.95)(react-dom@18.2.0)(react@18.2.0) + '@svgr/webpack': 6.5.1 + escape-string-regexp: 4.0.0 + file-loader: 6.2.0(webpack@5.89.0) + fs-extra: 11.1.1 + github-slugger: 1.5.0 + globby: 11.1.0 + gray-matter: 4.0.3 + jiti: 1.21.0 + js-yaml: 4.1.0 + lodash: 4.17.21 + micromatch: 4.0.5 + resolve-pathname: 3.0.0 + shelljs: 0.8.5 + tslib: 2.6.2 + url-loader: 4.1.1(file-loader@6.2.0)(webpack@5.89.0) + webpack: 5.89.0(@swc/core@1.3.95) + transitivePeerDependencies: + - '@swc/core' + - esbuild + - supports-color + - uglify-js + - webpack-cli + dev: false + + /@emotion/babel-plugin@11.11.0: + resolution: {integrity: sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==} + dependencies: + '@babel/helper-module-imports': 7.22.15 + '@babel/runtime': 7.23.2 + '@emotion/hash': 0.9.1 + '@emotion/memoize': 0.8.1 + '@emotion/serialize': 1.1.2 + babel-plugin-macros: 3.1.0 + convert-source-map: 1.9.0 + escape-string-regexp: 4.0.0 + find-root: 1.1.0 + source-map: 0.5.7 + stylis: 4.2.0 + dev: false + + /@emotion/cache@11.11.0: + resolution: {integrity: sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==} + dependencies: + '@emotion/memoize': 0.8.1 + '@emotion/sheet': 1.2.2 + '@emotion/utils': 1.2.1 + '@emotion/weak-memoize': 0.3.1 + stylis: 4.2.0 + dev: false + + /@emotion/hash@0.9.1: + resolution: {integrity: sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==} + dev: false + + /@emotion/memoize@0.8.1: + resolution: {integrity: sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==} + dev: false + + /@emotion/react@11.11.1(@types/react@18.2.34)(react@18.2.0): + resolution: {integrity: sha512-5mlW1DquU5HaxjLkfkGN1GA/fvVGdyHURRiX/0FHl2cfIfRxSOfmxEH5YS43edp0OldZrZ+dkBKbngxcNCdZvA==} + peerDependencies: + '@types/react': '*' + react: '>=16.8.0' + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.23.2 + '@emotion/babel-plugin': 11.11.0 + '@emotion/cache': 11.11.0 + '@emotion/serialize': 1.1.2 + '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.2.0) + '@emotion/utils': 1.2.1 + '@emotion/weak-memoize': 0.3.1 + '@types/react': 18.2.34 + hoist-non-react-statics: 3.3.2 + react: 18.2.0 + dev: false + + /@emotion/serialize@1.1.2: + resolution: {integrity: sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA==} + dependencies: + '@emotion/hash': 0.9.1 + '@emotion/memoize': 0.8.1 + '@emotion/unitless': 0.8.1 + '@emotion/utils': 1.2.1 + csstype: 3.1.2 + dev: false + + /@emotion/sheet@1.2.2: + resolution: {integrity: sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==} + dev: false + + /@emotion/unitless@0.8.1: + resolution: {integrity: sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==} + dev: false + + /@emotion/use-insertion-effect-with-fallbacks@1.0.1(react@18.2.0): + resolution: {integrity: sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==} + peerDependencies: + react: '>=16.8.0' + dependencies: + react: 18.2.0 + dev: false + + /@emotion/utils@1.2.1: + resolution: {integrity: sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==} + dev: false + + /@emotion/weak-memoize@0.3.1: + resolution: {integrity: sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==} + dev: false + + /@esbuild/android-arm64@0.18.20: + resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + optional: true + + /@esbuild/android-arm@0.18.20: + resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + optional: true + + /@esbuild/android-x64@0.18.20: + resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + optional: true + + /@esbuild/darwin-arm64@0.18.20: + resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + optional: true + + /@esbuild/darwin-x64@0.18.20: + resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + optional: true + + /@esbuild/freebsd-arm64@0.18.20: + resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + optional: true + + /@esbuild/freebsd-x64@0.18.20: + resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + optional: true + + /@esbuild/linux-arm64@0.18.20: + resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-arm@0.18.20: + resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-ia32@0.18.20: + resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-loong64@0.18.20: + resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-mips64el@0.18.20: + resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-ppc64@0.18.20: + resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-riscv64@0.18.20: + resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-s390x@0.18.20: + resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-x64@0.18.20: + resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/netbsd-x64@0.18.20: + resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + optional: true + + /@esbuild/openbsd-x64@0.18.20: + resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + optional: true + + /@esbuild/sunos-x64@0.18.20: + resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + optional: true + + /@esbuild/win32-arm64@0.18.20: + resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + optional: true + + /@esbuild/win32-ia32@0.18.20: + resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + optional: true + + /@esbuild/win32-x64@0.18.20: + resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + optional: true + + /@esfx/async-canceltoken@1.0.0: + resolution: {integrity: sha512-3Ps/4NPd7qFltmHL+CYXCjZtNXcQGV9BZmpzu8Rt3/0SZMtbQve0gtX0uJDJGvAWa6w3IB4HrKVP12VPoFONmA==} + dependencies: + '@esfx/cancelable': 1.0.0 + '@esfx/canceltoken': 1.0.0 + '@esfx/disposable': 1.0.0 + tslib: 2.6.2 + dev: true + + /@esfx/cancelable@1.0.0: + resolution: {integrity: sha512-2dry/TuOT9ydpw86f396v09cyi/gLeGPIZSH4Gx+V/qKQaS/OXCRurCY+Cn8zkBfTAgFsjk9NE15d+LPo2kt9A==} + dependencies: + '@esfx/disposable': 1.0.0 + dev: true + + /@esfx/canceltoken@1.0.0: + resolution: {integrity: sha512-/TgdzC5O89w5v0TgwE2wcdtampWNAFOxzurCtb4RxYVr3m72yk3Bg82vMdznx+H9nnf28zVDR0PtpZO9FxmOkw==} + dependencies: + '@esfx/cancelable': 1.0.0 + '@esfx/disposable': 1.0.0 + tslib: 2.6.2 + dev: true + + /@esfx/disposable@1.0.0: + resolution: {integrity: sha512-hu7EI+YxlEWEKrb2himbS13HNaq5mlUePASf99KeQqkiNeqiAZbKqG4w59uDcLZs8JrV3qJqS/NYib5ZMhbfTQ==} + dev: true + + /@eslint-community/eslint-utils@4.4.0(eslint@8.52.0): + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 8.52.0 + eslint-visitor-keys: 3.4.3 + + /@eslint-community/regexpp@4.10.0: + resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + /@eslint/eslintrc@2.1.2: + resolution: {integrity: sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + ajv: 6.12.6 + debug: 4.3.4(supports-color@8.1.1) + espree: 9.6.1 + globals: 13.23.0 + ignore: 5.2.4 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + /@eslint/js@8.52.0: + resolution: {integrity: sha512-mjZVbpaeMZludF2fsWLD0Z9gCref1Tk4i9+wddjRvpUNqqcndPkBD09N/Mapey0b3jaXbLm2kICwFv2E64QinA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + /@fastify/busboy@2.0.0: + resolution: {integrity: sha512-JUFJad5lv7jxj926GPgymrWQxxjPYuJNiNjNMzqT+HiuP6Vl3dk5xzG+8sTX96np0ZAluvaMzPsjhHZ5rNuNQQ==} + engines: {node: '>=14'} + dev: false + + /@floating-ui/core@1.5.0: + resolution: {integrity: sha512-kK1h4m36DQ0UHGj5Ah4db7R0rHemTqqO0QLvUqi1/mUUp3LuAWbWxdxSIf/XsnH9VS6rRVPLJCncjRzUvyCLXg==} + dependencies: + '@floating-ui/utils': 0.1.6 + dev: false + + /@floating-ui/dom@1.5.3: + resolution: {integrity: sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==} + dependencies: + '@floating-ui/core': 1.5.0 + '@floating-ui/utils': 0.1.6 + dev: false + + /@floating-ui/utils@0.1.6: + resolution: {integrity: sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==} + dev: false + + /@fluentui/keyboard-keys@9.0.6: + resolution: {integrity: sha512-WvJrCKvt8Om04S+IwypeJ3FG2tP2TSNFMSMYouDdeKspKD1EmQyQybs7YA9+Fh98X5ERF14zBCurgtNjpDH6gQ==} + dependencies: + '@swc/helpers': 0.5.3 + dev: false + + /@fluentui/priority-overflow@9.1.8: + resolution: {integrity: sha512-wd6WvS30LAFfMsQ6MLCunX+qTd9fmVMuyutefD5ogZanois62GzLQoPF9JQUmOY/tN0a51k5dfM9tQrKQgsT+Q==} + dependencies: + '@swc/helpers': 0.5.3 + dev: false + + /@fluentui/react-accordion@9.3.26(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2): + resolution: {integrity: sha512-iE17EGkmSUrYX7ekpIRJWX1G5JD3HWaQdwtAn+0uv+KUEh/FGc4ghUPV+7SxvgEBqMg8VNdWhjtlql8i+dsEFw==} + peerDependencies: + '@types/react': '>=16.14.0 <19.0.0' + '@types/react-dom': '>=16.14.0 <19.0.0' + react: '>=16.14.0 <19.0.0' + react-dom: '>=16.14.0 <19.0.0' + scheduler: ^0.19.0 || ^0.20.0 + dependencies: + '@fluentui/react-aria': 9.3.43(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@fluentui/react-context-selector': 9.1.41(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2) + '@fluentui/react-icons': 2.0.221(react@18.2.0) + '@fluentui/react-jsx-runtime': 9.0.18(@types/react@18.2.34)(react@18.2.0) + '@fluentui/react-shared-contexts': 9.11.1(@types/react@18.2.34)(react@18.2.0) + '@fluentui/react-tabster': 9.12.9(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@fluentui/react-theme': 9.1.15 + '@fluentui/react-utilities': 9.15.1(@types/react@18.2.34)(react@18.2.0) + '@griffel/react': 1.5.17(react@18.2.0) + '@swc/helpers': 0.5.3 + '@types/react': 18.2.34 + '@types/react-dom': 18.2.14 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + scheduler: 0.20.2 + dev: false + + /@fluentui/react-alert@9.0.0-beta.80(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2): + resolution: {integrity: sha512-DZJ7y8V0ig4yRht7r0OLvgMisSTjWjy6Pr0HPOvppTbRAvboPfJMhPNQXdFb56Lnt0k54FCdcuCCc8euBoGTVg==} + peerDependencies: + '@types/react': '>=16.14.0 <19.0.0' + '@types/react-dom': '>=16.14.0 <19.0.0' + react: '>=16.14.0 <19.0.0' + react-dom: '>=16.14.0 <19.0.0' + dependencies: + '@fluentui/react-avatar': 9.5.44(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2) + '@fluentui/react-button': 9.3.53(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@fluentui/react-icons': 2.0.221(react@18.2.0) + '@fluentui/react-jsx-runtime': 9.0.18(@types/react@18.2.34)(react@18.2.0) + '@fluentui/react-tabster': 9.12.9(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@fluentui/react-theme': 9.1.15 + '@fluentui/react-utilities': 9.15.1(@types/react@18.2.34)(react@18.2.0) + '@griffel/react': 1.5.17(react@18.2.0) + '@swc/helpers': 0.5.3 + '@types/react': 18.2.34 + '@types/react-dom': 18.2.14 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + transitivePeerDependencies: + - scheduler + dev: false + + /@fluentui/react-aria@9.3.43(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-LO/u3ea4IgZUlXePO4V/ufwMZnoSILTT8FEgsxkcgauzMxmIRwijtJ9fYImifndu95Npl3OlA77CmMZwFsLsDQ==} + peerDependencies: + '@types/react': '>=16.14.0 <19.0.0' + '@types/react-dom': '>=16.14.0 <19.0.0' + react: '>=16.14.0 <19.0.0' + react-dom: '>=16.14.0 <19.0.0' + dependencies: + '@fluentui/keyboard-keys': 9.0.6 + '@fluentui/react-utilities': 9.15.1(@types/react@18.2.34)(react@18.2.0) + '@swc/helpers': 0.5.3 + '@types/react': 18.2.34 + '@types/react-dom': 18.2.14 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@fluentui/react-avatar@9.5.44(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2): + resolution: {integrity: sha512-oR48tpzw2r4k1OPHPiKi/DK4rGvw/dwnsIBaZeNHe+UkIUP+EpZUkWOkdnQhDmuiGMHrd0knfFePhbk1Bc9DrQ==} + peerDependencies: + '@types/react': '>=16.14.0 <19.0.0' + '@types/react-dom': '>=16.14.0 <19.0.0' + react: '>=16.14.0 <19.0.0' + react-dom: '>=16.14.0 <19.0.0' + scheduler: ^0.19.0 || ^0.20.0 + dependencies: + '@fluentui/react-badge': 9.2.12(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@fluentui/react-context-selector': 9.1.41(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2) + '@fluentui/react-icons': 2.0.221(react@18.2.0) + '@fluentui/react-jsx-runtime': 9.0.18(@types/react@18.2.34)(react@18.2.0) + '@fluentui/react-popover': 9.8.19(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2) + '@fluentui/react-shared-contexts': 9.11.1(@types/react@18.2.34)(react@18.2.0) + '@fluentui/react-tabster': 9.12.9(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@fluentui/react-theme': 9.1.15 + '@fluentui/react-tooltip': 9.3.20(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@fluentui/react-utilities': 9.15.1(@types/react@18.2.34)(react@18.2.0) + '@griffel/react': 1.5.17(react@18.2.0) + '@swc/helpers': 0.5.3 + '@types/react': 18.2.34 + '@types/react-dom': 18.2.14 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + scheduler: 0.20.2 + dev: false + + /@fluentui/react-badge@9.2.12(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-zbBp7RV1dcnGmsI8yj68XQt3yaD8My787Y4fivfTt9fUbHaUIcMf2Fc7MfGCH4H6nwYeaWZ43FHQfKlcwzguUQ==} + peerDependencies: + '@types/react': '>=16.14.0 <19.0.0' + '@types/react-dom': '>=16.14.0 <19.0.0' + react: '>=16.14.0 <19.0.0' + react-dom: '>=16.14.0 <19.0.0' + dependencies: + '@fluentui/react-icons': 2.0.221(react@18.2.0) + '@fluentui/react-jsx-runtime': 9.0.18(@types/react@18.2.34)(react@18.2.0) + '@fluentui/react-shared-contexts': 9.11.1(@types/react@18.2.34)(react@18.2.0) + '@fluentui/react-theme': 9.1.15 + '@fluentui/react-utilities': 9.15.1(@types/react@18.2.34)(react@18.2.0) + '@griffel/react': 1.5.17(react@18.2.0) + '@swc/helpers': 0.5.3 + '@types/react': 18.2.34 + '@types/react-dom': 18.2.14 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@fluentui/react-button@9.3.53(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-ZWvohqaQd/MlbhtAimdEQhOUxxtO1/RCGIInaymTmEIJr/c0D+CHsMPMSCBGS+C/W1IwKFhQ0qWjHZwwNZ9fvg==} + peerDependencies: + '@types/react': '>=16.14.0 <19.0.0' + '@types/react-dom': '>=16.14.0 <19.0.0' + react: '>=16.14.0 <19.0.0' + react-dom: '>=16.14.0 <19.0.0' + dependencies: + '@fluentui/keyboard-keys': 9.0.6 + '@fluentui/react-aria': 9.3.43(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@fluentui/react-icons': 2.0.221(react@18.2.0) + '@fluentui/react-jsx-runtime': 9.0.18(@types/react@18.2.34)(react@18.2.0) + '@fluentui/react-shared-contexts': 9.11.1(@types/react@18.2.34)(react@18.2.0) + '@fluentui/react-tabster': 9.12.9(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@fluentui/react-theme': 9.1.15 + '@fluentui/react-utilities': 9.15.1(@types/react@18.2.34)(react@18.2.0) + '@griffel/react': 1.5.17(react@18.2.0) + '@swc/helpers': 0.5.3 + '@types/react': 18.2.34 + '@types/react-dom': 18.2.14 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@fluentui/react-card@9.0.52(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-jOcWjGBrwWACrxYs+HoBgmykrC7NAOKAFujhJYJAUJPIHbrC8/8fiNNE1hxOCC49ddSkyVkspQ/qI9mgw6k7hw==} + peerDependencies: + '@types/react': '>=16.14.0 <19.0.0' + '@types/react-dom': '>=16.14.0 <19.0.0' + react: '>=16.14.0 <19.0.0' + react-dom: '>=16.14.0 <19.0.0' + dependencies: + '@fluentui/keyboard-keys': 9.0.6 + '@fluentui/react-jsx-runtime': 9.0.18(@types/react@18.2.34)(react@18.2.0) + '@fluentui/react-tabster': 9.12.9(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@fluentui/react-theme': 9.1.15 + '@fluentui/react-utilities': 9.15.1(@types/react@18.2.34)(react@18.2.0) + '@griffel/react': 1.5.17(react@18.2.0) + '@swc/helpers': 0.5.3 + '@types/react': 18.2.34 + '@types/react-dom': 18.2.14 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@fluentui/react-checkbox@9.1.54(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2): + resolution: {integrity: sha512-QhkguMBfkdMqHo49IyDSsV9ShaJOs6Ve5PNY/Ksj3b5qkV21N1ry6w9UJgnIuLm+tE2DpEXk5CikIkMkcrP8Dw==} + peerDependencies: + '@types/react': '>=16.14.0 <19.0.0' + '@types/react-dom': '>=16.14.0 <19.0.0' + react: '>=16.14.0 <19.0.0' + react-dom: '>=16.14.0 <19.0.0' + dependencies: + '@fluentui/react-field': 9.1.40(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2) + '@fluentui/react-icons': 2.0.221(react@18.2.0) + '@fluentui/react-jsx-runtime': 9.0.18(@types/react@18.2.34)(react@18.2.0) + '@fluentui/react-label': 9.1.48(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@fluentui/react-shared-contexts': 9.11.1(@types/react@18.2.34)(react@18.2.0) + '@fluentui/react-tabster': 9.12.9(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@fluentui/react-theme': 9.1.15 + '@fluentui/react-utilities': 9.15.1(@types/react@18.2.34)(react@18.2.0) + '@griffel/react': 1.5.17(react@18.2.0) + '@swc/helpers': 0.5.3 + '@types/react': 18.2.34 + '@types/react-dom': 18.2.14 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + transitivePeerDependencies: + - scheduler + dev: false + + /@fluentui/react-combobox@9.5.28(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2): + resolution: {integrity: sha512-DSZFJj8aWNWXfbVMZH6KVEPnMZYPKXZBfypHmrU3669qx9UvOX3JyKzhLj6tS9t9wdogM5kx/CVJ503ejQWfFA==} + peerDependencies: + '@types/react': '>=16.14.0 <19.0.0' + '@types/react-dom': '>=16.14.0 <19.0.0' + react: '>=16.14.0 <19.0.0' + react-dom: '>=16.14.0 <19.0.0' + scheduler: ^0.19.0 || ^0.20.0 + dependencies: + '@fluentui/keyboard-keys': 9.0.6 + '@fluentui/react-context-selector': 9.1.41(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2) + '@fluentui/react-field': 9.1.40(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2) + '@fluentui/react-icons': 2.0.221(react@18.2.0) + '@fluentui/react-jsx-runtime': 9.0.18(@types/react@18.2.34)(react@18.2.0) + '@fluentui/react-portal': 9.3.27(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@fluentui/react-positioning': 9.9.23(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@fluentui/react-shared-contexts': 9.11.1(@types/react@18.2.34)(react@18.2.0) + '@fluentui/react-theme': 9.1.15 + '@fluentui/react-utilities': 9.15.1(@types/react@18.2.34)(react@18.2.0) + '@griffel/react': 1.5.17(react@18.2.0) + '@swc/helpers': 0.5.3 + '@types/react': 18.2.34 + '@types/react-dom': 18.2.14 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + scheduler: 0.20.2 + dev: false + + /@fluentui/react-components@9.32.3(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2): + resolution: {integrity: sha512-B5Vnlj1LMcONu+Yae8N6JGpyacQdiLuQc9QiJe2b9HkA4fuxT+oMI9bCAMS13oftONv8VlAH/8pe5XCrbl8d2g==} + peerDependencies: + '@types/react': '>=16.14.0 <19.0.0' + '@types/react-dom': '>=16.14.0 <19.0.0' + react: '>=16.14.0 <19.0.0' + react-dom: '>=16.14.0 <19.0.0' + scheduler: ^0.19.0 || ^0.20.0 + dependencies: + '@fluentui/react-accordion': 9.3.26(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2) + '@fluentui/react-alert': 9.0.0-beta.80(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2) + '@fluentui/react-avatar': 9.5.44(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2) + '@fluentui/react-badge': 9.2.12(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@fluentui/react-button': 9.3.53(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@fluentui/react-card': 9.0.52(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@fluentui/react-checkbox': 9.1.54(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2) + '@fluentui/react-combobox': 9.5.28(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2) + '@fluentui/react-dialog': 9.8.2(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2) + '@fluentui/react-divider': 9.2.48(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@fluentui/react-drawer': 9.0.0-beta.29(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2) + '@fluentui/react-field': 9.1.40(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2) + '@fluentui/react-image': 9.1.45(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@fluentui/react-infobutton': 9.0.0-beta.64(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2) + '@fluentui/react-input': 9.4.50(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2) + '@fluentui/react-label': 9.1.48(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@fluentui/react-link': 9.1.32(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@fluentui/react-menu': 9.12.30(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2) + '@fluentui/react-overflow': 9.0.42(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2) + '@fluentui/react-persona': 9.2.54(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2) + '@fluentui/react-popover': 9.8.19(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2) + '@fluentui/react-portal': 9.3.27(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@fluentui/react-positioning': 9.9.23(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@fluentui/react-progress': 9.1.50(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2) + '@fluentui/react-provider': 9.11.1(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@fluentui/react-radio': 9.1.54(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2) + '@fluentui/react-select': 9.1.50(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2) + '@fluentui/react-shared-contexts': 9.11.1(@types/react@18.2.34)(react@18.2.0) + '@fluentui/react-skeleton': 9.0.38(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2) + '@fluentui/react-slider': 9.1.54(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2) + '@fluentui/react-spinbutton': 9.2.50(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2) + '@fluentui/react-spinner': 9.3.28(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@fluentui/react-switch': 9.1.54(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2) + '@fluentui/react-table': 9.10.9(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2) + '@fluentui/react-tabs': 9.3.55(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2) + '@fluentui/react-tabster': 9.12.9(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@fluentui/react-text': 9.3.45(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@fluentui/react-textarea': 9.3.50(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2) + '@fluentui/react-theme': 9.1.15 + '@fluentui/react-toast': 9.3.15(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@fluentui/react-toolbar': 9.1.54(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2) + '@fluentui/react-tooltip': 9.3.20(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@fluentui/react-tree': 9.4.11(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2) + '@fluentui/react-utilities': 9.15.1(@types/react@18.2.34)(react@18.2.0) + '@fluentui/react-virtualizer': 9.0.0-alpha.46(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@griffel/react': 1.5.17(react@18.2.0) + '@swc/helpers': 0.5.3 + '@types/react': 18.2.34 + '@types/react-dom': 18.2.14 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + scheduler: 0.20.2 + dev: false + + /@fluentui/react-context-selector@9.1.41(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2): + resolution: {integrity: sha512-Q0Gbem5rz7hK9uBrWLOhD4TWzCSqYzA+TNpd8vYE2/9GHFTc16EvKEg1gsnvlA0lNHwTR0JwT0QT8d2KsNHa4w==} + peerDependencies: + '@types/react': '>=16.14.0 <19.0.0' + '@types/react-dom': '>=16.14.0 <19.0.0' + react: '>=16.14.0 <19.0.0' + react-dom: '>=16.14.0 <19.0.0' + scheduler: ^0.19.0 || ^0.20.0 + dependencies: + '@fluentui/react-utilities': 9.15.1(@types/react@18.2.34)(react@18.2.0) + '@swc/helpers': 0.5.3 + '@types/react': 18.2.34 + '@types/react-dom': 18.2.14 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + scheduler: 0.20.2 + dev: false + + /@fluentui/react-dialog@9.8.2(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2): + resolution: {integrity: sha512-wn5NcOLkwx1nvRYANJeiH4wpzUiYdMshpFKADaitMYOme3DM/xoH3WVZfbjO9imNChwZAvfGwDoPn1eOnzJZCg==} + peerDependencies: + '@types/react': '>=16.14.0 <19.0.0' + '@types/react-dom': '>=16.14.0 <19.0.0' + react: '>=16.14.0 <19.0.0' + react-dom: '>=16.14.0 <19.0.0' + dependencies: + '@fluentui/keyboard-keys': 9.0.6 + '@fluentui/react-aria': 9.3.43(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@fluentui/react-context-selector': 9.1.41(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2) + '@fluentui/react-icons': 2.0.221(react@18.2.0) + '@fluentui/react-jsx-runtime': 9.0.18(@types/react@18.2.34)(react@18.2.0) + '@fluentui/react-portal': 9.3.27(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@fluentui/react-shared-contexts': 9.11.1(@types/react@18.2.34)(react@18.2.0) + '@fluentui/react-tabster': 9.12.9(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@fluentui/react-theme': 9.1.15 + '@fluentui/react-utilities': 9.15.1(@types/react@18.2.34)(react@18.2.0) + '@griffel/react': 1.5.17(react@18.2.0) + '@swc/helpers': 0.5.3 + '@types/react': 18.2.34 + '@types/react-dom': 18.2.14 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-transition-group: 4.4.5(react-dom@18.2.0)(react@18.2.0) + transitivePeerDependencies: + - scheduler + dev: false + + /@fluentui/react-divider@9.2.48(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-XK2Cc+BulDfIb9pWjWMG0NHFp2wTx0OyXSs+pHJ2qT6F5LXiF615+q+AOGqOnHcl0z+flrhCC8fH14O3/xdz7Q==} + peerDependencies: + '@types/react': '>=16.14.0 <19.0.0' + '@types/react-dom': '>=16.14.0 <19.0.0' + react: '>=16.14.0 <19.0.0' + react-dom: '>=16.14.0 <19.0.0' + dependencies: + '@fluentui/react-jsx-runtime': 9.0.18(@types/react@18.2.34)(react@18.2.0) + '@fluentui/react-shared-contexts': 9.11.1(@types/react@18.2.34)(react@18.2.0) + '@fluentui/react-theme': 9.1.15 + '@fluentui/react-utilities': 9.15.1(@types/react@18.2.34)(react@18.2.0) + '@griffel/react': 1.5.17(react@18.2.0) + '@swc/helpers': 0.5.3 + '@types/react': 18.2.34 + '@types/react-dom': 18.2.14 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@fluentui/react-drawer@9.0.0-beta.29(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2): + resolution: {integrity: sha512-v0NQOKRLEXnQUS2yHAj6ygYGrKxzzkkPyWjanq2v4XR/F4bXH5sU11uKbPFIkQo2FDiGVuJgp09bT7m54GPl0Q==} + peerDependencies: + '@types/react': '>=16.14.0 <19.0.0' + '@types/react-dom': '>=16.14.0 <19.0.0' + react: '>=16.14.0 <19.0.0' + react-dom: '>=16.14.0 <19.0.0' + dependencies: + '@fluentui/react-dialog': 9.8.2(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2) + '@fluentui/react-jsx-runtime': 9.0.18(@types/react@18.2.34)(react@18.2.0) + '@fluentui/react-motion-preview': 0.2.10(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@fluentui/react-shared-contexts': 9.11.1(@types/react@18.2.34)(react@18.2.0) + '@fluentui/react-theme': 9.1.15 + '@fluentui/react-utilities': 9.15.1(@types/react@18.2.34)(react@18.2.0) + '@griffel/react': 1.5.17(react@18.2.0) + '@swc/helpers': 0.5.3 + '@types/react': 18.2.34 + '@types/react-dom': 18.2.14 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + transitivePeerDependencies: + - scheduler + dev: false + + /@fluentui/react-field@9.1.40(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2): + resolution: {integrity: sha512-ijm6t+sWGa6mJhvGpJn+ye6/MfyCf4B5I4oTQthCS45xSsKGZEup4E8XubhoZHowCHFaDSnr/Xj8eWtLHvm2xw==} + peerDependencies: + '@types/react': '>=16.14.0 <19.0.0' + '@types/react-dom': '>=16.14.0 <19.0.0' + react: '>=16.14.0 <19.0.0' + react-dom: '>=16.14.0 <19.0.0' + dependencies: + '@fluentui/react-context-selector': 9.1.41(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2) + '@fluentui/react-icons': 2.0.221(react@18.2.0) + '@fluentui/react-jsx-runtime': 9.0.18(@types/react@18.2.34)(react@18.2.0) + '@fluentui/react-label': 9.1.48(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@fluentui/react-theme': 9.1.15 + '@fluentui/react-utilities': 9.15.1(@types/react@18.2.34)(react@18.2.0) + '@griffel/react': 1.5.17(react@18.2.0) + '@swc/helpers': 0.5.3 + '@types/react': 18.2.34 + '@types/react-dom': 18.2.14 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + transitivePeerDependencies: + - scheduler + dev: false + + /@fluentui/react-icons@2.0.221(react@18.2.0): + resolution: {integrity: sha512-Dj5ihpaE4y3gWs81SJGuu8Pz3rPR6ioHHbqz8eETkbhpAW8Q3dRITFcfdYQV/ZEsj33/uSiis8iLMdhY/xWMMw==} + peerDependencies: + react: '>=16.8.0 <19.0.0' + dependencies: + '@griffel/react': 1.5.17(react@18.2.0) + react: 18.2.0 + tslib: 2.6.2 + dev: false + + /@fluentui/react-image@9.1.45(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-rzoP1d8MLSoL7UAuWNlglYY0gLhm+t1dMVbOdxd/njKkhwxRtTGCYH0ZToaqaV9q7qAzNe9AfGhjtySxtsO8sA==} + peerDependencies: + '@types/react': '>=16.14.0 <19.0.0' + '@types/react-dom': '>=16.14.0 <19.0.0' + react: '>=16.14.0 <19.0.0' + react-dom: '>=16.14.0 <19.0.0' + dependencies: + '@fluentui/react-jsx-runtime': 9.0.18(@types/react@18.2.34)(react@18.2.0) + '@fluentui/react-shared-contexts': 9.11.1(@types/react@18.2.34)(react@18.2.0) + '@fluentui/react-theme': 9.1.15 + '@fluentui/react-utilities': 9.15.1(@types/react@18.2.34)(react@18.2.0) + '@griffel/react': 1.5.17(react@18.2.0) + '@swc/helpers': 0.5.3 + '@types/react': 18.2.34 + '@types/react-dom': 18.2.14 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@fluentui/react-infobutton@9.0.0-beta.64(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2): + resolution: {integrity: sha512-DywjDpwmVQ7HBGiAxXSzy11Wc2wJ/nz5yHRTxieFP164FyDr1lnXkFCi4p2UzTrFr2ct8JqQiUZv2kFNBO441w==} + peerDependencies: + '@types/react': '>=16.14.0 <19.0.0' + '@types/react-dom': '>=16.14.0 <19.0.0' + react: '>=16.14.0 <19.0.0' + react-dom: '>=16.14.0 <19.0.0' + dependencies: + '@fluentui/react-icons': 2.0.221(react@18.2.0) + '@fluentui/react-jsx-runtime': 9.0.18(@types/react@18.2.34)(react@18.2.0) + '@fluentui/react-label': 9.1.48(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@fluentui/react-popover': 9.8.19(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2) + '@fluentui/react-portal': 9.3.27(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@fluentui/react-tabster': 9.12.9(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@fluentui/react-theme': 9.1.15 + '@fluentui/react-utilities': 9.15.1(@types/react@18.2.34)(react@18.2.0) + '@griffel/react': 1.5.17(react@18.2.0) + '@swc/helpers': 0.5.3 + '@types/react': 18.2.34 + '@types/react-dom': 18.2.14 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + transitivePeerDependencies: + - scheduler + dev: false + + /@fluentui/react-input@9.4.50(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2): + resolution: {integrity: sha512-LvNqY4VnUJnDgTsOsCf/41jaupba/HYKV3wGoQ8VsvaIjwi+2T1V9DvDbu9OU6zfx2mG4MFT/+xrsNJuzHm91w==} + peerDependencies: + '@types/react': '>=16.14.0 <19.0.0' + '@types/react-dom': '>=16.14.0 <19.0.0' + react: '>=16.14.0 <19.0.0' + react-dom: '>=16.14.0 <19.0.0' + dependencies: + '@fluentui/react-field': 9.1.40(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2) + '@fluentui/react-jsx-runtime': 9.0.18(@types/react@18.2.34)(react@18.2.0) + '@fluentui/react-shared-contexts': 9.11.1(@types/react@18.2.34)(react@18.2.0) + '@fluentui/react-theme': 9.1.15 + '@fluentui/react-utilities': 9.15.1(@types/react@18.2.34)(react@18.2.0) + '@griffel/react': 1.5.17(react@18.2.0) + '@swc/helpers': 0.5.3 + '@types/react': 18.2.34 + '@types/react-dom': 18.2.14 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + transitivePeerDependencies: + - scheduler + dev: false + + /@fluentui/react-jsx-runtime@9.0.18(@types/react@18.2.34)(react@18.2.0): + resolution: {integrity: sha512-uGuVSWwnNa6LrsPmTcqrF5xkjfc4RffUERART2Z4ojfn1wq7rhLOdWmCcEBnbYl1AhPvD1ohOLc8EqDrlrYPHw==} + peerDependencies: + '@types/react': '>=16.14.0 <19.0.0' + react: '>=16.14.0 <19.0.0' + dependencies: + '@fluentui/react-utilities': 9.15.1(@types/react@18.2.34)(react@18.2.0) + '@swc/helpers': 0.5.3 + '@types/react': 18.2.34 + react: 18.2.0 + react-is: 17.0.2 + dev: false + + /@fluentui/react-label@9.1.48(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-JQdAmJ0AYhNLj9itiLsTFLocwFT8tyeFVQaCLhduAadvCCNhZ9xjyFNJe1YmcIpRYEoFQ0Lhd0S5CA+u/QEIlA==} + peerDependencies: + '@types/react': '>=16.14.0 <19.0.0' + '@types/react-dom': '>=16.14.0 <19.0.0' + react: '>=16.14.0 <19.0.0' + react-dom: '>=16.14.0 <19.0.0' + dependencies: + '@fluentui/react-jsx-runtime': 9.0.18(@types/react@18.2.34)(react@18.2.0) + '@fluentui/react-shared-contexts': 9.11.1(@types/react@18.2.34)(react@18.2.0) + '@fluentui/react-theme': 9.1.15 + '@fluentui/react-utilities': 9.15.1(@types/react@18.2.34)(react@18.2.0) + '@griffel/react': 1.5.17(react@18.2.0) + '@swc/helpers': 0.5.3 + '@types/react': 18.2.34 + '@types/react-dom': 18.2.14 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@fluentui/react-link@9.1.32(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-VvPKze6qpwDAidaJaMfDv3pkCz34LM2GUnubvZbl1e36GtJ6JNsm6Zzz3TKS6WvjVXeGk9H+5dFrdBp8wwQkXQ==} + peerDependencies: + '@types/react': '>=16.14.0 <19.0.0' + '@types/react-dom': '>=16.14.0 <19.0.0' + react: '>=16.14.0 <19.0.0' + react-dom: '>=16.14.0 <19.0.0' + dependencies: + '@fluentui/keyboard-keys': 9.0.6 + '@fluentui/react-jsx-runtime': 9.0.18(@types/react@18.2.34)(react@18.2.0) + '@fluentui/react-shared-contexts': 9.11.1(@types/react@18.2.34)(react@18.2.0) + '@fluentui/react-tabster': 9.12.9(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@fluentui/react-theme': 9.1.15 + '@fluentui/react-utilities': 9.15.1(@types/react@18.2.34)(react@18.2.0) + '@griffel/react': 1.5.17(react@18.2.0) + '@swc/helpers': 0.5.3 + '@types/react': 18.2.34 + '@types/react-dom': 18.2.14 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@fluentui/react-menu@9.12.30(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2): + resolution: {integrity: sha512-h1Et2so/ktoTw4Qc2UduJwDywZ3ULjRLmdyGgsqLjP3xfFaII+CikEZEBAwR+HvFvlACAVTjDpVT/xOfzwK8SQ==} + peerDependencies: + '@types/react': '>=16.14.0 <19.0.0' + '@types/react-dom': '>=16.14.0 <19.0.0' + react: '>=16.14.0 <19.0.0' + react-dom: '>=16.14.0 <19.0.0' + scheduler: ^0.19.0 || ^0.20.0 + dependencies: + '@fluentui/keyboard-keys': 9.0.6 + '@fluentui/react-aria': 9.3.43(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@fluentui/react-context-selector': 9.1.41(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2) + '@fluentui/react-icons': 2.0.221(react@18.2.0) + '@fluentui/react-jsx-runtime': 9.0.18(@types/react@18.2.34)(react@18.2.0) + '@fluentui/react-portal': 9.3.27(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@fluentui/react-positioning': 9.9.23(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@fluentui/react-shared-contexts': 9.11.1(@types/react@18.2.34)(react@18.2.0) + '@fluentui/react-tabster': 9.12.9(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@fluentui/react-theme': 9.1.15 + '@fluentui/react-utilities': 9.15.1(@types/react@18.2.34)(react@18.2.0) + '@griffel/react': 1.5.17(react@18.2.0) + '@swc/helpers': 0.5.3 + '@types/react': 18.2.34 + '@types/react-dom': 18.2.14 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + scheduler: 0.20.2 + dev: false + + /@fluentui/react-motion-preview@0.2.10(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-8vc83HqT7TQEczd7TjKvVFNsvBt+5IvayVOLOFqVJ5pUF6WDFZ8q1cdgGgPrQ4nHgptIjyNqhMwCL4nvPbr9LA==} + peerDependencies: + '@types/react': '>=16.14.0 <19.0.0' + '@types/react-dom': '>=16.14.0 <19.0.0' + react: '>=16.14.0 <19.0.0' + react-dom: '>=16.14.0 <19.0.0' + dependencies: + '@fluentui/react-jsx-runtime': 9.0.18(@types/react@18.2.34)(react@18.2.0) + '@fluentui/react-shared-contexts': 9.11.1(@types/react@18.2.34)(react@18.2.0) + '@fluentui/react-theme': 9.1.15 + '@fluentui/react-utilities': 9.15.1(@types/react@18.2.34)(react@18.2.0) + '@griffel/react': 1.5.17(react@18.2.0) + '@swc/helpers': 0.5.3 + '@types/react': 18.2.34 + '@types/react-dom': 18.2.14 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@fluentui/react-overflow@9.0.42(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2): + resolution: {integrity: sha512-nem9GsBarcAB1SqKlX7ZA0kz1spdsmllyZVKvy9QmrBgB8xmWdH93xidUMiNEhu1x9hhVEV9BgLWRxvaN7yeLA==} + peerDependencies: + '@types/react': '>=16.14.0 <19.0.0' + '@types/react-dom': '>=16.14.0 <19.0.0' + react: '>=16.14.0 <19.0.0' + react-dom: '>=16.14.0 <19.0.0' + scheduler: ^0.19.0 || ^0.20.0 + dependencies: + '@fluentui/priority-overflow': 9.1.8 + '@fluentui/react-context-selector': 9.1.41(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2) + '@fluentui/react-theme': 9.1.15 + '@fluentui/react-utilities': 9.15.1(@types/react@18.2.34)(react@18.2.0) + '@griffel/react': 1.5.17(react@18.2.0) + '@swc/helpers': 0.5.3 + '@types/react': 18.2.34 + '@types/react-dom': 18.2.14 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + scheduler: 0.20.2 + dev: false + + /@fluentui/react-persona@9.2.54(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2): + resolution: {integrity: sha512-R5zhokpibbMPmq8iUWd14T/L5SceDs3PPz1GHtrjtvypVoOgwr2p4+AP5XmhVzBJAEWuuCtChjsmxDUgErH1pQ==} + peerDependencies: + '@types/react': '>=16.14.0 <19.0.0' + '@types/react-dom': '>=16.14.0 <19.0.0' + react: '>=16.14.0 <19.0.0' + react-dom: '>=16.14.0 <19.0.0' + dependencies: + '@fluentui/react-avatar': 9.5.44(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2) + '@fluentui/react-badge': 9.2.12(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@fluentui/react-jsx-runtime': 9.0.18(@types/react@18.2.34)(react@18.2.0) + '@fluentui/react-shared-contexts': 9.11.1(@types/react@18.2.34)(react@18.2.0) + '@fluentui/react-theme': 9.1.15 + '@fluentui/react-utilities': 9.15.1(@types/react@18.2.34)(react@18.2.0) + '@griffel/react': 1.5.17(react@18.2.0) + '@swc/helpers': 0.5.3 + '@types/react': 18.2.34 + '@types/react-dom': 18.2.14 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + transitivePeerDependencies: + - scheduler + dev: false + + /@fluentui/react-popover@9.8.19(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2): + resolution: {integrity: sha512-/MR/9gb3WDNyR2fLzWIoiyuaBJJLpb4oWAHhyto2EgWlsXZHzE7eeBiw48JSNWHQz187Ujt5aZBqov9ZmrsCfg==} + peerDependencies: + '@types/react': '>=16.14.0 <19.0.0' + '@types/react-dom': '>=16.14.0 <19.0.0' + react: '>=16.14.0 <19.0.0' + react-dom: '>=16.14.0 <19.0.0' + scheduler: ^0.19.0 || ^0.20.0 + dependencies: + '@fluentui/keyboard-keys': 9.0.6 + '@fluentui/react-aria': 9.3.43(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@fluentui/react-context-selector': 9.1.41(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2) + '@fluentui/react-jsx-runtime': 9.0.18(@types/react@18.2.34)(react@18.2.0) + '@fluentui/react-portal': 9.3.27(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@fluentui/react-positioning': 9.9.23(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@fluentui/react-shared-contexts': 9.11.1(@types/react@18.2.34)(react@18.2.0) + '@fluentui/react-tabster': 9.12.9(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@fluentui/react-theme': 9.1.15 + '@fluentui/react-utilities': 9.15.1(@types/react@18.2.34)(react@18.2.0) + '@griffel/react': 1.5.17(react@18.2.0) + '@swc/helpers': 0.5.3 + '@types/react': 18.2.34 + '@types/react-dom': 18.2.14 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + scheduler: 0.20.2 + dev: false + + /@fluentui/react-portal@9.3.27(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-qzjfevg3uFhaFTrPL+K/zheaD33sTwwq65O54HMwCd1Hyr+r7uw0Tw3H2Lin1qc/P4v9Fzu5/E9kRiffVWhr1w==} + peerDependencies: + '@types/react': '>=16.14.0 <19.0.0' + '@types/react-dom': '>=16.14.0 <19.0.0' + react: '>=16.14.0 <19.0.0' + react-dom: '>=16.14.0 <19.0.0' + dependencies: + '@fluentui/react-shared-contexts': 9.11.1(@types/react@18.2.34)(react@18.2.0) + '@fluentui/react-tabster': 9.12.9(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@fluentui/react-utilities': 9.15.1(@types/react@18.2.34)(react@18.2.0) + '@griffel/react': 1.5.17(react@18.2.0) + '@swc/helpers': 0.5.3 + '@types/react': 18.2.34 + '@types/react-dom': 18.2.14 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + use-disposable: 1.0.2(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + dev: false + + /@fluentui/react-positioning@9.9.23(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-OKqqgIGcVZGdIF33H6RejKUY9kF4MaAJTwPr0cO5numrUtH0i0lBUKQ1vm3oFoFcjovXxEhnHITYePSOzE/GAA==} + peerDependencies: + '@types/react': '>=16.14.0 <19.0.0' + '@types/react-dom': '>=16.14.0 <19.0.0' + react: '>=16.14.0 <19.0.0' + react-dom: '>=16.14.0 <19.0.0' + dependencies: + '@floating-ui/dom': 1.5.3 + '@fluentui/react-shared-contexts': 9.11.1(@types/react@18.2.34)(react@18.2.0) + '@fluentui/react-theme': 9.1.15 + '@fluentui/react-utilities': 9.15.1(@types/react@18.2.34)(react@18.2.0) + '@griffel/react': 1.5.17(react@18.2.0) + '@swc/helpers': 0.5.3 + '@types/react': 18.2.34 + '@types/react-dom': 18.2.14 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@fluentui/react-progress@9.1.50(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2): + resolution: {integrity: sha512-buXSyskkvNSx4aycEFU+PqSgtsD9HvNPQkZgjMfQkao+XHt2YMWs1hkMUk33W35dcV6m7ICjEOcRpo10hwpaWA==} + peerDependencies: + '@types/react': '>=16.14.0 <19.0.0' + '@types/react-dom': '>=16.14.0 <19.0.0' + react: '>=16.14.0 <19.0.0' + react-dom: '>=16.14.0 <19.0.0' + dependencies: + '@fluentui/react-field': 9.1.40(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2) + '@fluentui/react-jsx-runtime': 9.0.18(@types/react@18.2.34)(react@18.2.0) + '@fluentui/react-shared-contexts': 9.11.1(@types/react@18.2.34)(react@18.2.0) + '@fluentui/react-theme': 9.1.15 + '@fluentui/react-utilities': 9.15.1(@types/react@18.2.34)(react@18.2.0) + '@griffel/react': 1.5.17(react@18.2.0) + '@swc/helpers': 0.5.3 + '@types/react': 18.2.34 + '@types/react-dom': 18.2.14 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + transitivePeerDependencies: + - scheduler + dev: false + + /@fluentui/react-provider@9.11.1(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-PU+XSWdAdSanKZe4q6ZGz4+xYP2+6jaroYTBjQjgqjaZglvVU5lrQrwuNUROxLPJKO2rimi+tdLDvN568AA0Eg==} + peerDependencies: + '@types/react': '>=16.14.0 <19.0.0' + '@types/react-dom': '>=16.14.0 <19.0.0' + react: '>=16.14.0 <19.0.0' + react-dom: '>=16.14.0 <19.0.0' + dependencies: + '@fluentui/react-icons': 2.0.221(react@18.2.0) + '@fluentui/react-jsx-runtime': 9.0.18(@types/react@18.2.34)(react@18.2.0) + '@fluentui/react-shared-contexts': 9.11.1(@types/react@18.2.34)(react@18.2.0) + '@fluentui/react-tabster': 9.12.9(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@fluentui/react-theme': 9.1.15 + '@fluentui/react-utilities': 9.15.1(@types/react@18.2.34)(react@18.2.0) + '@griffel/core': 1.14.4 + '@griffel/react': 1.5.17(react@18.2.0) + '@swc/helpers': 0.5.3 + '@types/react': 18.2.34 + '@types/react-dom': 18.2.14 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@fluentui/react-radio@9.1.54(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2): + resolution: {integrity: sha512-SwZKQArF6BneQadBcZbIavDXnwqdDVqkzm/0r93uThlFFs/WZ+vlC8/fB2IkeZ44mimaHfA1ppic7vx7gnTapA==} + peerDependencies: + '@types/react': '>=16.14.0 <19.0.0' + '@types/react-dom': '>=16.14.0 <19.0.0' + react: '>=16.14.0 <19.0.0' + react-dom: '>=16.14.0 <19.0.0' + scheduler: ^0.19.0 || ^0.20.0 + dependencies: + '@fluentui/react-field': 9.1.40(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2) + '@fluentui/react-icons': 2.0.221(react@18.2.0) + '@fluentui/react-jsx-runtime': 9.0.18(@types/react@18.2.34)(react@18.2.0) + '@fluentui/react-label': 9.1.48(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@fluentui/react-shared-contexts': 9.11.1(@types/react@18.2.34)(react@18.2.0) + '@fluentui/react-tabster': 9.12.9(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@fluentui/react-theme': 9.1.15 + '@fluentui/react-utilities': 9.15.1(@types/react@18.2.34)(react@18.2.0) + '@griffel/react': 1.5.17(react@18.2.0) + '@swc/helpers': 0.5.3 + '@types/react': 18.2.34 + '@types/react-dom': 18.2.14 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + scheduler: 0.20.2 + dev: false + + /@fluentui/react-select@9.1.50(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2): + resolution: {integrity: sha512-K/ZpyXI5tNUgFdlvOEJsh5Dst5Z6/mxDRQ8a14RCEZlmeOwknDu/FJwtc+z6OjK5IqNPShd4S6x7t/Q/TkBfmA==} + peerDependencies: + '@types/react': '>=16.14.0 <19.0.0' + '@types/react-dom': '>=16.14.0 <19.0.0' + react: '>=16.14.0 <19.0.0' + react-dom: '>=16.14.0 <19.0.0' + dependencies: + '@fluentui/react-field': 9.1.40(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2) + '@fluentui/react-icons': 2.0.221(react@18.2.0) + '@fluentui/react-jsx-runtime': 9.0.18(@types/react@18.2.34)(react@18.2.0) + '@fluentui/react-shared-contexts': 9.11.1(@types/react@18.2.34)(react@18.2.0) + '@fluentui/react-theme': 9.1.15 + '@fluentui/react-utilities': 9.15.1(@types/react@18.2.34)(react@18.2.0) + '@griffel/react': 1.5.17(react@18.2.0) + '@swc/helpers': 0.5.3 + '@types/react': 18.2.34 + '@types/react-dom': 18.2.14 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + transitivePeerDependencies: + - scheduler + dev: false + + /@fluentui/react-shared-contexts@9.11.1(@types/react@18.2.34)(react@18.2.0): + resolution: {integrity: sha512-THP1ZNEgcGYC/7BBtReLJ+YuGxTt/3Z0JmIGfGwqNJelI7Wtm7mcynY5J0g04+NEHG9UtA9i2egt1qxfxknZ2Q==} + peerDependencies: + '@types/react': '>=16.14.0 <19.0.0' + react: '>=16.14.0 <19.0.0' + dependencies: + '@fluentui/react-theme': 9.1.15 + '@swc/helpers': 0.5.3 + '@types/react': 18.2.34 + react: 18.2.0 + dev: false + + /@fluentui/react-skeleton@9.0.38(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2): + resolution: {integrity: sha512-VQ3IzkVe4uBUEGS9s8CNoU8tHZtSnxmVmDwxQ4zGe4xCnzNXWrllB7lX83o6qY/BQNrwH+ZSIn6AXFSGSDaQzA==} + peerDependencies: + '@types/react': '>=16.14.0 <19.0.0' + '@types/react-dom': '>=16.14.0 <19.0.0' + react: '>=16.14.0 <19.0.0' + react-dom: '>=16.14.0 <19.0.0' + dependencies: + '@fluentui/react-field': 9.1.40(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2) + '@fluentui/react-jsx-runtime': 9.0.18(@types/react@18.2.34)(react@18.2.0) + '@fluentui/react-shared-contexts': 9.11.1(@types/react@18.2.34)(react@18.2.0) + '@fluentui/react-theme': 9.1.15 + '@fluentui/react-utilities': 9.15.1(@types/react@18.2.34)(react@18.2.0) + '@griffel/react': 1.5.17(react@18.2.0) + '@swc/helpers': 0.5.3 + '@types/react': 18.2.34 + '@types/react-dom': 18.2.14 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + transitivePeerDependencies: + - scheduler + dev: false + + /@fluentui/react-slider@9.1.54(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2): + resolution: {integrity: sha512-YgC58qqTwBbNI0b2oR3eYOGsQXFLbiwbTq8qP1nWY4D7jXjzZ587ceHND18Irjx6sSFaYfU1gm395mdvf2tQ/w==} + peerDependencies: + '@types/react': '>=16.14.0 <19.0.0' + '@types/react-dom': '>=16.14.0 <19.0.0' + react: '>=16.14.0 <19.0.0' + react-dom: '>=16.14.0 <19.0.0' + dependencies: + '@fluentui/react-field': 9.1.40(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2) + '@fluentui/react-jsx-runtime': 9.0.18(@types/react@18.2.34)(react@18.2.0) + '@fluentui/react-shared-contexts': 9.11.1(@types/react@18.2.34)(react@18.2.0) + '@fluentui/react-tabster': 9.12.9(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@fluentui/react-theme': 9.1.15 + '@fluentui/react-utilities': 9.15.1(@types/react@18.2.34)(react@18.2.0) + '@griffel/react': 1.5.17(react@18.2.0) + '@swc/helpers': 0.5.3 + '@types/react': 18.2.34 + '@types/react-dom': 18.2.14 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + transitivePeerDependencies: + - scheduler + dev: false + + /@fluentui/react-spinbutton@9.2.50(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2): + resolution: {integrity: sha512-kl+aLgUbPFOcKe2QBEDV2mYt5i3WnkjAuxG798MPnoARJNnG8kngCX/7CFfGaKlfpI+ASLFpcFuGZ8UqC+bNHw==} + peerDependencies: + '@types/react': '>=16.14.0 <19.0.0' + '@types/react-dom': '>=16.14.0 <19.0.0' + react: '>=16.14.0 <19.0.0' + react-dom: '>=16.14.0 <19.0.0' + dependencies: + '@fluentui/keyboard-keys': 9.0.6 + '@fluentui/react-field': 9.1.40(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2) + '@fluentui/react-icons': 2.0.221(react@18.2.0) + '@fluentui/react-jsx-runtime': 9.0.18(@types/react@18.2.34)(react@18.2.0) + '@fluentui/react-shared-contexts': 9.11.1(@types/react@18.2.34)(react@18.2.0) + '@fluentui/react-theme': 9.1.15 + '@fluentui/react-utilities': 9.15.1(@types/react@18.2.34)(react@18.2.0) + '@griffel/react': 1.5.17(react@18.2.0) + '@swc/helpers': 0.5.3 + '@types/react': 18.2.34 + '@types/react-dom': 18.2.14 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + transitivePeerDependencies: + - scheduler + dev: false + + /@fluentui/react-spinner@9.3.28(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-96a1P2M3USs/jGBSFJBzkKzFi9jskcgr0gH+YvCeuffi6Ht6aY/2KVKmlJbA9jpznMgn/9hStfFgGNRPbCpPyQ==} + peerDependencies: + '@types/react': '>=16.14.0 <19.0.0' + '@types/react-dom': '>=16.14.0 <19.0.0' + react: '>=16.14.0 <19.0.0' + react-dom: '>=16.14.0 <19.0.0' + dependencies: + '@fluentui/react-jsx-runtime': 9.0.18(@types/react@18.2.34)(react@18.2.0) + '@fluentui/react-label': 9.1.48(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@fluentui/react-shared-contexts': 9.11.1(@types/react@18.2.34)(react@18.2.0) + '@fluentui/react-theme': 9.1.15 + '@fluentui/react-utilities': 9.15.1(@types/react@18.2.34)(react@18.2.0) + '@griffel/react': 1.5.17(react@18.2.0) + '@swc/helpers': 0.5.3 + '@types/react': 18.2.34 + '@types/react-dom': 18.2.14 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@fluentui/react-switch@9.1.54(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2): + resolution: {integrity: sha512-WH9xOuggdgcti9js6jkmiixBmh6/TrWiMqTySpl9YO1fSVAvWju5hFJdxAsYoMoaJllSb4euuT4/knVGdtfjMA==} + peerDependencies: + '@types/react': '>=16.14.0 <19.0.0' + '@types/react-dom': '>=16.14.0 <19.0.0' + react: '>=16.14.0 <19.0.0' + react-dom: '>=16.14.0 <19.0.0' + dependencies: + '@fluentui/react-field': 9.1.40(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2) + '@fluentui/react-icons': 2.0.221(react@18.2.0) + '@fluentui/react-jsx-runtime': 9.0.18(@types/react@18.2.34)(react@18.2.0) + '@fluentui/react-label': 9.1.48(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@fluentui/react-shared-contexts': 9.11.1(@types/react@18.2.34)(react@18.2.0) + '@fluentui/react-tabster': 9.12.9(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@fluentui/react-theme': 9.1.15 + '@fluentui/react-utilities': 9.15.1(@types/react@18.2.34)(react@18.2.0) + '@griffel/react': 1.5.17(react@18.2.0) + '@swc/helpers': 0.5.3 + '@types/react': 18.2.34 + '@types/react-dom': 18.2.14 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + transitivePeerDependencies: + - scheduler + dev: false + + /@fluentui/react-table@9.10.9(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2): + resolution: {integrity: sha512-P3cKDgUwpQprBPPu79Fbm4+4n1QWDJc3fnMTo+yilOLC70bUqnkDN1FEN2Mp2l+O/4p9fWwNrsAkbjMbsfCniQ==} + peerDependencies: + '@types/react': '>=16.14.0 <19.0.0' + '@types/react-dom': '>=16.14.0 <19.0.0' + react: '>=16.14.0 <19.0.0' + react-dom: '>=16.14.0 <19.0.0' + dependencies: + '@fluentui/keyboard-keys': 9.0.6 + '@fluentui/react-aria': 9.3.43(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@fluentui/react-avatar': 9.5.44(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2) + '@fluentui/react-checkbox': 9.1.54(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2) + '@fluentui/react-context-selector': 9.1.41(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2) + '@fluentui/react-icons': 2.0.221(react@18.2.0) + '@fluentui/react-jsx-runtime': 9.0.18(@types/react@18.2.34)(react@18.2.0) + '@fluentui/react-radio': 9.1.54(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2) + '@fluentui/react-shared-contexts': 9.11.1(@types/react@18.2.34)(react@18.2.0) + '@fluentui/react-tabster': 9.12.9(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@fluentui/react-theme': 9.1.15 + '@fluentui/react-utilities': 9.15.1(@types/react@18.2.34)(react@18.2.0) + '@griffel/react': 1.5.17(react@18.2.0) + '@swc/helpers': 0.5.3 + '@types/react': 18.2.34 + '@types/react-dom': 18.2.14 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + transitivePeerDependencies: + - scheduler + dev: false + + /@fluentui/react-tabs@9.3.55(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2): + resolution: {integrity: sha512-RVzDJgqsvrt9SbgmnsNSE3tK2FJjHyZyyVs0ea2bsD2YmnmLA++56Ve/7oRe0qBLCBdhd38TZhaRpRAEtlSi7w==} + peerDependencies: + '@types/react': '>=16.14.0 <19.0.0' + '@types/react-dom': '>=16.14.0 <19.0.0' + react: '>=16.14.0 <19.0.0' + react-dom: '>=16.14.0 <19.0.0' + scheduler: ^0.19.0 || ^0.20.0 + dependencies: + '@fluentui/react-context-selector': 9.1.41(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2) + '@fluentui/react-jsx-runtime': 9.0.18(@types/react@18.2.34)(react@18.2.0) + '@fluentui/react-shared-contexts': 9.11.1(@types/react@18.2.34)(react@18.2.0) + '@fluentui/react-tabster': 9.12.9(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@fluentui/react-theme': 9.1.15 + '@fluentui/react-utilities': 9.15.1(@types/react@18.2.34)(react@18.2.0) + '@griffel/react': 1.5.17(react@18.2.0) + '@swc/helpers': 0.5.3 + '@types/react': 18.2.34 + '@types/react-dom': 18.2.14 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + scheduler: 0.20.2 + dev: false + + /@fluentui/react-tabster@9.12.9(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-OGWfedJWRmbwe6YBdTdwbmyUseJKFL7GNOmAcLoGRit8Nchbe/cGS2dHwby0u4WeyWDH8LDG6AawlYiM6iXmWA==} + peerDependencies: + '@types/react': '>=16.14.0 <19.0.0' + '@types/react-dom': '>=16.14.0 <19.0.0' + react: '>=16.14.0 <19.0.0' + react-dom: '>=16.14.0 <19.0.0' + dependencies: + '@fluentui/react-shared-contexts': 9.11.1(@types/react@18.2.34)(react@18.2.0) + '@fluentui/react-theme': 9.1.15 + '@fluentui/react-utilities': 9.15.1(@types/react@18.2.34)(react@18.2.0) + '@griffel/react': 1.5.17(react@18.2.0) + '@swc/helpers': 0.5.3 + '@types/react': 18.2.34 + '@types/react-dom': 18.2.14 + keyborg: 2.1.0 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + tabster: 4.7.0 + dev: false + + /@fluentui/react-text@9.3.45(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-SQ7/EzD0+QIOJwbpAHrl1GwF3yaQixF7R1yj+UH/mT/FB6IZlfS4Ec11o6dOhjxt7Ai2fyWhAvCecIE2sfuXEw==} + peerDependencies: + '@types/react': '>=16.14.0 <19.0.0' + '@types/react-dom': '>=16.14.0 <19.0.0' + react: '>=16.14.0 <19.0.0' + react-dom: '>=16.14.0 <19.0.0' + dependencies: + '@fluentui/react-jsx-runtime': 9.0.18(@types/react@18.2.34)(react@18.2.0) + '@fluentui/react-shared-contexts': 9.11.1(@types/react@18.2.34)(react@18.2.0) + '@fluentui/react-theme': 9.1.15 + '@fluentui/react-utilities': 9.15.1(@types/react@18.2.34)(react@18.2.0) + '@griffel/react': 1.5.17(react@18.2.0) + '@swc/helpers': 0.5.3 + '@types/react': 18.2.34 + '@types/react-dom': 18.2.14 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@fluentui/react-textarea@9.3.50(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2): + resolution: {integrity: sha512-lBlhU3RFlQYQn3/HRMskW2UzrKL3pEnAQaSCnzKTmLAXZnoJpAFUgfbuatZbpjzmT2L41GeBArGcgN6FF3izcg==} + peerDependencies: + '@types/react': '>=16.14.0 <19.0.0' + '@types/react-dom': '>=16.14.0 <19.0.0' + react: '>=16.14.0 <19.0.0' + react-dom: '>=16.14.0 <19.0.0' + dependencies: + '@fluentui/react-field': 9.1.40(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2) + '@fluentui/react-jsx-runtime': 9.0.18(@types/react@18.2.34)(react@18.2.0) + '@fluentui/react-shared-contexts': 9.11.1(@types/react@18.2.34)(react@18.2.0) + '@fluentui/react-theme': 9.1.15 + '@fluentui/react-utilities': 9.15.1(@types/react@18.2.34)(react@18.2.0) + '@griffel/react': 1.5.17(react@18.2.0) + '@swc/helpers': 0.5.3 + '@types/react': 18.2.34 + '@types/react-dom': 18.2.14 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + transitivePeerDependencies: + - scheduler + dev: false + + /@fluentui/react-theme@9.1.15: + resolution: {integrity: sha512-WT8U9uFeS37TNCpiKRldq98jiy7jSuHuZO9SljRwmir5edQ2TTUqX4VL/aXVIl4B5iIU1dEeZXjnNfXl8f4s7w==} + dependencies: + '@fluentui/tokens': 1.0.0-alpha.12 + '@swc/helpers': 0.5.3 + dev: false + + /@fluentui/react-toast@9.3.15(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-LquLqBnveDgU2Df+rf3zniAc3rCrlbiKrg+FaYjIo2FryVWnXq44t4RHpi0JSUpn7R7XmcTjqddhD9AlFLElPQ==} + peerDependencies: + '@types/react': '>=16.14.0 <19.0.0' + '@types/react-dom': '>=16.14.0 <19.0.0' + react: '>=16.14.0 <19.0.0' + react-dom: '>=16.14.0 <19.0.0' + dependencies: + '@fluentui/keyboard-keys': 9.0.6 + '@fluentui/react-aria': 9.3.43(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@fluentui/react-icons': 2.0.221(react@18.2.0) + '@fluentui/react-jsx-runtime': 9.0.18(@types/react@18.2.34)(react@18.2.0) + '@fluentui/react-portal': 9.3.27(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@fluentui/react-shared-contexts': 9.11.1(@types/react@18.2.34)(react@18.2.0) + '@fluentui/react-tabster': 9.12.9(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@fluentui/react-theme': 9.1.15 + '@fluentui/react-utilities': 9.15.1(@types/react@18.2.34)(react@18.2.0) + '@griffel/react': 1.5.17(react@18.2.0) + '@swc/helpers': 0.5.3 + '@types/react': 18.2.34 + '@types/react-dom': 18.2.14 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-transition-group: 4.4.5(react-dom@18.2.0)(react@18.2.0) + dev: false + + /@fluentui/react-toolbar@9.1.54(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2): + resolution: {integrity: sha512-l+/k/TtHGOoc1sY25OqHiDPar4CDhDtnHP9Yd7iu7QW3PJgYZqv2nhyoocXZSk1pwZdkYICmOFSSORR/84gzHA==} + peerDependencies: + '@types/react': '>=16.14.0 <19.0.0' + '@types/react-dom': '>=16.14.0 <19.0.0' + react: '>=16.14.0 <19.0.0' + react-dom: '>=16.14.0 <19.0.0' + dependencies: + '@fluentui/react-button': 9.3.53(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@fluentui/react-context-selector': 9.1.41(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2) + '@fluentui/react-divider': 9.2.48(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@fluentui/react-jsx-runtime': 9.0.18(@types/react@18.2.34)(react@18.2.0) + '@fluentui/react-radio': 9.1.54(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2) + '@fluentui/react-shared-contexts': 9.11.1(@types/react@18.2.34)(react@18.2.0) + '@fluentui/react-tabster': 9.12.9(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@fluentui/react-theme': 9.1.15 + '@fluentui/react-utilities': 9.15.1(@types/react@18.2.34)(react@18.2.0) + '@griffel/react': 1.5.17(react@18.2.0) + '@swc/helpers': 0.5.3 + '@types/react': 18.2.34 + '@types/react-dom': 18.2.14 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + transitivePeerDependencies: + - scheduler + dev: false + + /@fluentui/react-tooltip@9.3.20(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-pQ/GcThSPIKqRMBAr9Dqcw94nvlCjkVaDKaNaA32rEh+IBKsUI0tUkkkAiZb+tHxW2EIt+Kv1XXuYAzKeIYhqg==} + peerDependencies: + '@types/react': '>=16.14.0 <19.0.0' + '@types/react-dom': '>=16.14.0 <19.0.0' + react: '>=16.14.0 <19.0.0' + react-dom: '>=16.14.0 <19.0.0' + dependencies: + '@fluentui/keyboard-keys': 9.0.6 + '@fluentui/react-jsx-runtime': 9.0.18(@types/react@18.2.34)(react@18.2.0) + '@fluentui/react-portal': 9.3.27(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@fluentui/react-positioning': 9.9.23(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@fluentui/react-shared-contexts': 9.11.1(@types/react@18.2.34)(react@18.2.0) + '@fluentui/react-theme': 9.1.15 + '@fluentui/react-utilities': 9.15.1(@types/react@18.2.34)(react@18.2.0) + '@griffel/react': 1.5.17(react@18.2.0) + '@swc/helpers': 0.5.3 + '@types/react': 18.2.34 + '@types/react-dom': 18.2.14 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@fluentui/react-tree@9.4.11(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2): + resolution: {integrity: sha512-gqmRpFwBmFvb7rk0PJTyEGeLLl8KoLDV+omF1EsqnQGCSAo3X9xlPJJpY59znyOgjWV5Ezcqstu/OrN1rslKUA==} + peerDependencies: + '@types/react': '>=16.14.0 <19.0.0' + '@types/react-dom': '>=16.14.0 <19.0.0' + react: '>=16.14.0 <19.0.0' + react-dom: '>=16.14.0 <19.0.0' + dependencies: + '@fluentui/keyboard-keys': 9.0.6 + '@fluentui/react-aria': 9.3.43(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@fluentui/react-avatar': 9.5.44(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2) + '@fluentui/react-button': 9.3.53(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@fluentui/react-checkbox': 9.1.54(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2) + '@fluentui/react-context-selector': 9.1.41(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2) + '@fluentui/react-icons': 2.0.221(react@18.2.0) + '@fluentui/react-jsx-runtime': 9.0.18(@types/react@18.2.34)(react@18.2.0) + '@fluentui/react-radio': 9.1.54(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(scheduler@0.20.2) + '@fluentui/react-shared-contexts': 9.11.1(@types/react@18.2.34)(react@18.2.0) + '@fluentui/react-tabster': 9.12.9(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@fluentui/react-theme': 9.1.15 + '@fluentui/react-utilities': 9.15.1(@types/react@18.2.34)(react@18.2.0) + '@griffel/react': 1.5.17(react@18.2.0) + '@swc/helpers': 0.5.3 + '@types/react': 18.2.34 + '@types/react-dom': 18.2.14 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + transitivePeerDependencies: + - scheduler + dev: false + + /@fluentui/react-utilities@9.15.1(@types/react@18.2.34)(react@18.2.0): + resolution: {integrity: sha512-BQz4SIcdORTJyVrl1KyiKKqawy9SUj+/m4raxIllLHSZyfFgnDHDVLv4YFlZjTRqaqtx16V53atyUu2MtsU3DA==} + peerDependencies: + '@types/react': '>=16.14.0 <19.0.0' + react: '>=16.14.0 <19.0.0' + dependencies: + '@fluentui/keyboard-keys': 9.0.6 + '@swc/helpers': 0.5.3 + '@types/react': 18.2.34 + react: 18.2.0 + dev: false + + /@fluentui/react-virtualizer@9.0.0-alpha.46(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-mpU4Wj3XtKvAgbfteicfXUgmJEHAuvuIM4/lPPGkOMzeiPByFUmJT3+CB96SreDjhDS9K3Psoa2PlPDAWzxOyg==} + peerDependencies: + '@types/react': '>=16.14.0 <19.0.0' + '@types/react-dom': '>=16.14.0 <19.0.0' + react: '>=16.14.0 <19.0.0' + react-dom: '>=16.14.0 <19.0.0' + dependencies: + '@fluentui/react-jsx-runtime': 9.0.18(@types/react@18.2.34)(react@18.2.0) + '@fluentui/react-utilities': 9.15.1(@types/react@18.2.34)(react@18.2.0) + '@griffel/react': 1.5.17(react@18.2.0) + '@swc/helpers': 0.5.3 + '@types/react': 18.2.34 + '@types/react-dom': 18.2.14 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@fluentui/tokens@1.0.0-alpha.12: + resolution: {integrity: sha512-eqVatgwkdmnXoGhBM7JwKzuR9cGQ9LhG2Oa8SImea5Dzz/1JqDkrAsngefXaDXpDfLN59QTR17Bm6YMOAAz0mA==} + dependencies: + '@swc/helpers': 0.5.3 + dev: false + + /@griffel/core@1.14.4: + resolution: {integrity: sha512-swhiBgod4BJWE874AWEVnRdsYo9id0p9dWxGOcQXJglu9uDu30SAjiO3o/rirtHe9h5kYTjqzIg2mMHpoEYagg==} + dependencies: + '@emotion/hash': 0.9.1 + '@griffel/style-types': 1.0.2 + csstype: 3.1.2 + rtl-css-js: 1.16.1 + stylis: 4.3.0 + tslib: 2.6.2 + dev: false + + /@griffel/react@1.5.17(react@18.2.0): + resolution: {integrity: sha512-vaS2uiGXOH1flN2OY5DpcMpnmn0d05N0mbEk2ZTjFzMgp2hkyuHa8P87aWrAouGXMxjCLbpweutP1SqoebSgUg==} + peerDependencies: + react: '>=16.8.0 <19.0.0' + dependencies: + '@griffel/core': 1.14.4 + react: 18.2.0 + tslib: 2.6.2 + dev: false + + /@griffel/style-types@1.0.2: + resolution: {integrity: sha512-ka/Tpl1WU8js88LObwB/4EvpgXzx/EEJfbHhAr4ZNt29hrQKgL93X1zSY6M/FRhMhWrGIawauWkZP6/y6w/WiQ==} + dependencies: + csstype: 3.1.2 + dev: false + + /@hapi/hoek@9.3.0: + resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} + + /@hapi/topo@5.1.0: + resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==} + dependencies: + '@hapi/hoek': 9.3.0 + + /@humanwhocodes/config-array@0.11.13: + resolution: {integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==} + engines: {node: '>=10.10.0'} + dependencies: + '@humanwhocodes/object-schema': 2.0.1 + debug: 4.3.4(supports-color@8.1.1) + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + /@humanwhocodes/module-importer@1.0.1: + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + /@humanwhocodes/object-schema@2.0.1: + resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==} + + /@isaacs/cliui@8.0.2: + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + dependencies: + string-width: 5.1.2 + string-width-cjs: /string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: /strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: /wrap-ansi@7.0.0 + dev: true + + /@istanbuljs/schema@0.1.3: + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + dev: true + + /@jest/schemas@29.6.3: + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@sinclair/typebox': 0.27.8 + dev: false + + /@jest/types@29.6.3: + resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/schemas': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.5 + '@types/istanbul-reports': 3.0.3 + '@types/node': 18.11.19 + '@types/yargs': 17.0.29 + chalk: 4.1.2 + dev: false + + /@jridgewell/gen-mapping@0.3.3: + resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.20 + + /@jridgewell/resolve-uri@3.1.1: + resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} + engines: {node: '>=6.0.0'} + + /@jridgewell/set-array@1.1.2: + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} + + /@jridgewell/source-map@0.3.5: + resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.20 + + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + + /@jridgewell/trace-mapping@0.3.20: + resolution: {integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==} + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 + + /@leichtgewicht/ip-codec@2.0.4: + resolution: {integrity: sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==} + dev: false + + /@mdx-js/mdx@3.0.0: + resolution: {integrity: sha512-Icm0TBKBLYqroYbNW3BPnzMGn+7mwpQOK310aZ7+fkCtiU3aqv2cdcX+nd0Ydo3wI5Rx8bX2Z2QmGb/XcAClCw==} + dependencies: + '@types/estree': 1.0.4 + '@types/estree-jsx': 1.0.2 + '@types/hast': 3.0.2 + '@types/mdx': 2.0.9 + collapse-white-space: 2.1.0 + devlop: 1.1.0 + estree-util-build-jsx: 3.0.1 + estree-util-is-identifier-name: 3.0.0 + estree-util-to-js: 2.0.0 + estree-walker: 3.0.3 + hast-util-to-estree: 3.1.0 + hast-util-to-jsx-runtime: 2.2.0 + markdown-extensions: 2.0.0 + periscopic: 3.1.0 + remark-mdx: 3.0.0 + remark-parse: 11.0.0 + remark-rehype: 11.0.0 + source-map: 0.7.4 + unified: 11.0.4 + unist-util-position-from-estree: 2.0.0 + unist-util-stringify-position: 4.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.1 + transitivePeerDependencies: + - supports-color + dev: false + + /@mdx-js/react@3.0.0(@types/react@18.2.34)(react@18.2.0): + resolution: {integrity: sha512-nDctevR9KyYFyV+m+/+S4cpzCWHqj+iHDHq3QrsWezcC+B17uZdIWgCguESUkwFhM3n/56KxWVE3V6EokrmONQ==} + peerDependencies: + '@types/react': '>=16' + react: '>=16' + dependencies: + '@types/mdx': 2.0.9 + '@types/react': 18.2.34 + react: 18.2.0 + dev: false + + /@microlink/react-json-view@1.23.0(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-HYJ1nsfO4/qn8afnAMhuk7+5a1vcjEaS8Gm5Vpr1SqdHDY0yLBJGpA+9DvKyxyVKaUkXzKXt3Mif9RcmFSdtYg==} + peerDependencies: + react: '>= 15' + react-dom: '>= 15' + dependencies: + flux: 4.0.4(react@18.2.0) + react: 18.2.0 + react-base16-styling: 0.6.0 + react-dom: 18.2.0(react@18.2.0) + react-lifecycles-compat: 3.0.4 + react-textarea-autosize: 8.3.4(@types/react@18.2.34)(react@18.2.0) + transitivePeerDependencies: + - '@types/react' + - encoding + dev: false + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.15.0 + + /@opentelemetry/api@1.6.0: + resolution: {integrity: sha512-OWlrQAnWn9577PhVgqjUvMr1pg57Bc4jv0iL4w0PRuOSRvq67rvHW9Ie/dZVMvCzhSCB+UxhcY/PmCmFj33Q+g==} + engines: {node: '>=8.0.0'} + dev: false + + /@pkgjs/parseargs@0.11.0: + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + requiresBuild: true + dev: true + optional: true + + /@pkgr/utils@2.4.2: + resolution: {integrity: sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + dependencies: + cross-spawn: 7.0.3 + fast-glob: 3.3.1 + is-glob: 4.0.3 + open: 9.1.0 + picocolors: 1.0.0 + tslib: 2.6.2 + dev: false + + /@playwright/test@1.39.0: + resolution: {integrity: sha512-3u1iFqgzl7zr004bGPYiN/5EZpRUSFddQBra8Rqll5N0/vfpqlP9I9EXqAoGacuAbX6c9Ulg/Cjqglp5VkK6UQ==} + engines: {node: '>=16'} + hasBin: true + dependencies: + playwright: 1.39.0 + dev: true + + /@pnpm/config.env-replace@1.1.0: + resolution: {integrity: sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==} + engines: {node: '>=12.22.0'} + dev: false + + /@pnpm/network.ca-file@1.0.2: + resolution: {integrity: sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==} + engines: {node: '>=12.22.0'} + dependencies: + graceful-fs: 4.2.10 + dev: false + + /@pnpm/npm-conf@2.2.2: + resolution: {integrity: sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==} + engines: {node: '>=12'} + dependencies: + '@pnpm/config.env-replace': 1.1.0 + '@pnpm/network.ca-file': 1.0.2 + config-chain: 1.1.13 + dev: false + + /@polka/url@1.0.0-next.23: + resolution: {integrity: sha512-C16M+IYz0rgRhWZdCmK+h58JMv8vijAA61gmz2rspCSwKwzBebpdcsiUmwrtJRdphuY30i6BSLEOP8ppbNLyLg==} + dev: false + + /@rollup/plugin-alias@5.0.1(rollup@3.29.4): + resolution: {integrity: sha512-JObvbWdOHoMy9W7SU0lvGhDtWq9PllP5mjpAy+TUslZG/WzOId9u80Hsqq1vCUn9pFJ0cxpdcnAv+QzU2zFH3Q==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + rollup: 3.29.4 + slash: 4.0.0 + dev: false + + /@rollup/plugin-commonjs@25.0.7(rollup@3.29.4): + resolution: {integrity: sha512-nEvcR+LRjEjsaSsc4x3XZfCCvZIaSMenZu/OiwOKGN2UhQpAYI7ru7czFvyWbErlpoGjnSX3D5Ch5FcMA3kRWQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.68.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@rollup/pluginutils': 5.0.5(rollup@3.29.4) + commondir: 1.0.1 + estree-walker: 2.0.2 + glob: 8.1.0 + is-reference: 1.2.1 + magic-string: 0.30.5 + rollup: 3.29.4 + + /@rollup/plugin-json@6.0.1(rollup@3.29.4): + resolution: {integrity: sha512-RgVfl5hWMkxN1h/uZj8FVESvPuBJ/uf6ly6GTj0GONnkfoBN5KC0MSz+PN2OLDgYXMhtG0mWpTrkiOjoxAIevw==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@rollup/pluginutils': 5.0.5(rollup@3.29.4) + rollup: 3.29.4 + + /@rollup/plugin-multi-entry@6.0.1(rollup@3.29.4): + resolution: {integrity: sha512-AXm6toPyTSfbYZWghQGbom1Uh7dHXlrGa+HoiYNhQtDUE3Q7LqoUYdVQx9E1579QWS1uOiu+cZRSE4okO7ySgw==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@rollup/plugin-virtual': 3.0.2(rollup@3.29.4) + matched: 5.0.1 + rollup: 3.29.4 + dev: false + + /@rollup/plugin-node-resolve@15.2.3(rollup@3.29.4): + resolution: {integrity: sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.78.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@rollup/pluginutils': 5.0.5(rollup@3.29.4) + '@types/resolve': 1.20.2 + deepmerge: 4.3.1 + is-builtin-module: 3.2.1 + is-module: 1.0.0 + resolve: 1.22.8 + rollup: 3.29.4 + + /@rollup/plugin-replace@5.0.5(rollup@3.29.4): + resolution: {integrity: sha512-rYO4fOi8lMaTg/z5Jb+hKnrHHVn8j2lwkqwyS4kTRhKyWOLf2wST2sWXr4WzWiTcoHTp2sTjqUbqIj2E39slKQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@rollup/pluginutils': 5.0.5(rollup@3.29.4) + magic-string: 0.30.5 + rollup: 3.29.4 + dev: true + + /@rollup/plugin-typescript@11.1.5(rollup@3.29.4)(typescript@5.2.2): + resolution: {integrity: sha512-rnMHrGBB0IUEv69Q8/JGRD/n4/n6b3nfpufUu26axhUcboUzv/twfZU8fIBbTOphRAe0v8EyxzeDpKXqGHfyDA==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.14.0||^3.0.0||^4.0.0 + tslib: '*' + typescript: '>=3.7.0' + peerDependenciesMeta: + rollup: + optional: true + tslib: + optional: true + dependencies: + '@rollup/pluginutils': 5.0.5(rollup@3.29.4) + resolve: 1.22.8 + rollup: 3.29.4 + typescript: 5.2.2 + dev: true + + /@rollup/plugin-virtual@3.0.2(rollup@3.29.4): + resolution: {integrity: sha512-10monEYsBp3scM4/ND4LNH5Rxvh3e/cVeL3jWTgZ2SrQ+BmUoQcopVQvnaMcOnykb1VkxUFuDAN+0FnpTFRy2A==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + rollup: 3.29.4 + dev: false + + /@rollup/pluginutils@5.0.5(rollup@3.29.4): + resolution: {integrity: sha512-6aEYR910NyP73oHiJglti74iRyOwgFU4x3meH/H8OJx6Ry0j6cOVZ5X/wTvub7G7Ao6qaHBEaNsV3GLJkSsF+Q==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@types/estree': 1.0.4 + estree-walker: 2.0.2 + picomatch: 2.3.1 + rollup: 3.29.4 + + /@rushstack/eslint-patch@1.3.2: + resolution: {integrity: sha512-V+MvGwaHH03hYhY+k6Ef/xKd6RYlc4q8WBx+2ANmipHJcKuktNcI/NgEsJgdSUF6Lw32njT6OnrRsKYCdgHjYw==} + dev: false + + /@sideway/address@4.1.4: + resolution: {integrity: sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==} + dependencies: + '@hapi/hoek': 9.3.0 + + /@sideway/formula@3.0.1: + resolution: {integrity: sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==} + + /@sideway/pinpoint@2.0.0: + resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==} + + /@sinclair/typebox@0.27.8: + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + dev: false + + /@sindresorhus/is@3.1.2: + resolution: {integrity: sha512-JiX9vxoKMmu8Y3Zr2RVathBL1Cdu4Nt4MuNWemt1Nc06A0RAin9c5FArkhGsyMBWfCu4zj+9b+GxtjAnE4qqLQ==} + engines: {node: '>=10'} + dev: false + + /@sindresorhus/is@5.6.0: + resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==} + engines: {node: '>=14.16'} + dev: false + + /@sinonjs/commons@2.0.0: + resolution: {integrity: sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==} + dependencies: + type-detect: 4.0.8 + dev: true + + /@sinonjs/commons@3.0.0: + resolution: {integrity: sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==} + dependencies: + type-detect: 4.0.8 + dev: true + + /@sinonjs/fake-timers@10.3.0: + resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} + dependencies: + '@sinonjs/commons': 3.0.0 + dev: true + + /@sinonjs/fake-timers@11.2.2: + resolution: {integrity: sha512-G2piCSxQ7oWOxwGSAyFHfPIsyeJGXYtc6mFbnFA+kRXkiEnTl8c/8jul2S329iFBnDI9HGoeWWAZvuvOkZccgw==} + dependencies: + '@sinonjs/commons': 3.0.0 + dev: true + + /@sinonjs/samsam@8.0.0: + resolution: {integrity: sha512-Bp8KUVlLp8ibJZrnvq2foVhP0IVX2CIprMJPK0vqGqgrDa0OHVKeZyBykqskkrdxV6yKBPmGasO8LVjAKR3Gew==} + dependencies: + '@sinonjs/commons': 2.0.0 + lodash.get: 4.4.2 + type-detect: 4.0.8 + dev: true + + /@sinonjs/text-encoding@0.7.2: + resolution: {integrity: sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==} + dev: true + + /@slorber/remark-comment@1.0.0: + resolution: {integrity: sha512-RCE24n7jsOj1M0UPvIQCHTe7fI0sFL4S2nwKVWwHyVr/wI/H8GosgsJGyhnsZoGFnD/P2hLf1mSbrrgSLN93NA==} + dependencies: + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + dev: false + + /@slorber/static-site-generator-webpack-plugin@4.0.7: + resolution: {integrity: sha512-Ug7x6z5lwrz0WqdnNFOMYrDQNTPAprvHLSh6+/fmml3qUiz6l5eq+2MzLKWtn/q5K5NpSiFsZTP/fck/3vjSxA==} + engines: {node: '>=14'} + dependencies: + eval: 0.1.8 + p-map: 4.0.0 + webpack-sources: 3.2.3 + dev: false + + /@svgr/babel-plugin-add-jsx-attribute@6.5.1(@babel/core@7.23.2): + resolution: {integrity: sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ==} + engines: {node: '>=10'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + dev: false + + /@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.23.2): + resolution: {integrity: sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + dev: false + + /@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.23.2): + resolution: {integrity: sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + dev: false + + /@svgr/babel-plugin-replace-jsx-attribute-value@6.5.1(@babel/core@7.23.2): + resolution: {integrity: sha512-8DPaVVE3fd5JKuIC29dqyMB54sA6mfgki2H2+swh+zNJoynC8pMPzOkidqHOSc6Wj032fhl8Z0TVn1GiPpAiJg==} + engines: {node: '>=10'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + dev: false + + /@svgr/babel-plugin-svg-dynamic-title@6.5.1(@babel/core@7.23.2): + resolution: {integrity: sha512-FwOEi0Il72iAzlkaHrlemVurgSQRDFbk0OC8dSvD5fSBPHltNh7JtLsxmZUhjYBZo2PpcU/RJvvi6Q0l7O7ogw==} + engines: {node: '>=10'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + dev: false + + /@svgr/babel-plugin-svg-em-dimensions@6.5.1(@babel/core@7.23.2): + resolution: {integrity: sha512-gWGsiwjb4tw+ITOJ86ndY/DZZ6cuXMNE/SjcDRg+HLuCmwpcjOktwRF9WgAiycTqJD/QXqL2f8IzE2Rzh7aVXA==} + engines: {node: '>=10'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + dev: false + + /@svgr/babel-plugin-transform-react-native-svg@6.5.1(@babel/core@7.23.2): + resolution: {integrity: sha512-2jT3nTayyYP7kI6aGutkyfJ7UMGtuguD72OjeGLwVNyfPRBD8zQthlvL+fAbAKk5n9ZNcvFkp/b1lZ7VsYqVJg==} + engines: {node: '>=10'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + dev: false + + /@svgr/babel-plugin-transform-svg-component@6.5.1(@babel/core@7.23.2): + resolution: {integrity: sha512-a1p6LF5Jt33O3rZoVRBqdxL350oge54iZWHNI6LJB5tQ7EelvD/Mb1mfBiZNAan0dt4i3VArkFRjA4iObuNykQ==} + engines: {node: '>=12'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + dev: false + + /@svgr/babel-preset@6.5.1(@babel/core@7.23.2): + resolution: {integrity: sha512-6127fvO/FF2oi5EzSQOAjo1LE3OtNVh11R+/8FXa+mHx1ptAaS4cknIjnUA7e6j6fwGGJ17NzaTJFUwOV2zwCw==} + engines: {node: '>=10'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@svgr/babel-plugin-add-jsx-attribute': 6.5.1(@babel/core@7.23.2) + '@svgr/babel-plugin-remove-jsx-attribute': 8.0.0(@babel/core@7.23.2) + '@svgr/babel-plugin-remove-jsx-empty-expression': 8.0.0(@babel/core@7.23.2) + '@svgr/babel-plugin-replace-jsx-attribute-value': 6.5.1(@babel/core@7.23.2) + '@svgr/babel-plugin-svg-dynamic-title': 6.5.1(@babel/core@7.23.2) + '@svgr/babel-plugin-svg-em-dimensions': 6.5.1(@babel/core@7.23.2) + '@svgr/babel-plugin-transform-react-native-svg': 6.5.1(@babel/core@7.23.2) + '@svgr/babel-plugin-transform-svg-component': 6.5.1(@babel/core@7.23.2) + dev: false + + /@svgr/core@6.5.1: + resolution: {integrity: sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw==} + engines: {node: '>=10'} + dependencies: + '@babel/core': 7.23.2 + '@svgr/babel-preset': 6.5.1(@babel/core@7.23.2) + '@svgr/plugin-jsx': 6.5.1(@svgr/core@6.5.1) + camelcase: 6.3.0 + cosmiconfig: 7.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /@svgr/hast-util-to-babel-ast@6.5.1: + resolution: {integrity: sha512-1hnUxxjd83EAxbL4a0JDJoD3Dao3hmjvyvyEV8PzWmLK3B9m9NPlW7GKjFyoWE8nM7HnXzPcmmSyOW8yOddSXw==} + engines: {node: '>=10'} + dependencies: + '@babel/types': 7.23.0 + entities: 4.5.0 + dev: false + + /@svgr/plugin-jsx@6.5.1(@svgr/core@6.5.1): + resolution: {integrity: sha512-+UdQxI3jgtSjCykNSlEMuy1jSRQlGC7pqBCPvkG/2dATdWo082zHTTK3uhnAju2/6XpE6B5mZ3z4Z8Ns01S8Gw==} + engines: {node: '>=10'} + peerDependencies: + '@svgr/core': ^6.0.0 + dependencies: + '@babel/core': 7.23.2 + '@svgr/babel-preset': 6.5.1(@babel/core@7.23.2) + '@svgr/core': 6.5.1 + '@svgr/hast-util-to-babel-ast': 6.5.1 + svg-parser: 2.0.4 + transitivePeerDependencies: + - supports-color + dev: false + + /@svgr/plugin-svgo@6.5.1(@svgr/core@6.5.1): + resolution: {integrity: sha512-omvZKf8ixP9z6GWgwbtmP9qQMPX4ODXi+wzbVZgomNFsUIlHA1sf4fThdwTWSsZGgvGAG6yE+b/F5gWUkcZ/iQ==} + engines: {node: '>=10'} + peerDependencies: + '@svgr/core': '*' + dependencies: + '@svgr/core': 6.5.1 + cosmiconfig: 7.1.0 + deepmerge: 4.3.1 + svgo: 2.8.0 + dev: false + + /@svgr/webpack@6.5.1: + resolution: {integrity: sha512-cQ/AsnBkXPkEK8cLbv4Dm7JGXq2XrumKnL1dRpJD9rIO2fTIlJI9a1uCciYG1F2aUsox/hJQyNGbt3soDxSRkA==} + engines: {node: '>=10'} + dependencies: + '@babel/core': 7.23.2 + '@babel/plugin-transform-react-constant-elements': 7.22.5(@babel/core@7.23.2) + '@babel/preset-env': 7.23.2(@babel/core@7.23.2) + '@babel/preset-react': 7.22.15(@babel/core@7.23.2) + '@babel/preset-typescript': 7.23.2(@babel/core@7.23.2) + '@svgr/core': 6.5.1 + '@svgr/plugin-jsx': 6.5.1(@svgr/core@6.5.1) + '@svgr/plugin-svgo': 6.5.1(@svgr/core@6.5.1) + transitivePeerDependencies: + - supports-color + dev: false + + /@swagger-api/apidom-ast@0.82.0: + resolution: {integrity: sha512-WsoO9ekGeSt4GY58dsfFKrgzQOxvY5WoKtRyq/rY2IeEPxgLDkqzYexou1oYtiwcXmmFlEoFXOQu0Q4izF/64A==} + dependencies: + '@babel/runtime-corejs3': 7.23.2 + '@swagger-api/apidom-error': 0.82.0 + '@types/ramda': 0.29.7 + ramda: 0.29.1 + ramda-adjunct: 4.1.1(ramda@0.29.1) + stampit: 4.3.2 + unraw: 3.0.0 + dev: false + + /@swagger-api/apidom-core@0.82.0: + resolution: {integrity: sha512-HVjqp5oiuzd75TgtCDdhZNTdfy6ctLqmdUiOdYs/58dgnqxP4Ku3Wj1fyOjV4D/ZtN+Q4GjDjZmGRv4c9pJjOw==} + dependencies: + '@babel/runtime-corejs3': 7.23.2 + '@swagger-api/apidom-ast': 0.82.0 + '@swagger-api/apidom-error': 0.82.0 + '@types/ramda': 0.29.7 + minim: 0.23.8 + ramda: 0.29.1 + ramda-adjunct: 4.1.1(ramda@0.29.1) + short-unique-id: 5.0.3 + stampit: 4.3.2 + dev: false + + /@swagger-api/apidom-error@0.82.0: + resolution: {integrity: sha512-4gzEP9J2Xgredn+Bi+xSxL0ZnBFC/6CSv+fkU7JyFh2Liqz4cfH6yh3Wrmve031pmvPvP9xzAc13VraV4ZCzFQ==} + dependencies: + '@babel/runtime-corejs3': 7.23.2 + '@types/ramda': 0.29.7 + ramda: 0.29.1 + ramda-adjunct: 4.1.1(ramda@0.29.1) + dev: false + + /@swagger-api/apidom-json-pointer@0.82.0: + resolution: {integrity: sha512-JrE+K7rf2ITv+kmk50ansJq8qUjlZLUaMPBYEy2xLyGELERRHVgsL4fYMAHMRGrnHVg0CM8TgbU4sN50fnWZLg==} + dependencies: + '@babel/runtime-corejs3': 7.23.2 + '@swagger-api/apidom-core': 0.82.0 + '@swagger-api/apidom-error': 0.82.0 + '@types/ramda': 0.29.7 + ramda: 0.29.1 + ramda-adjunct: 4.1.1(ramda@0.29.1) + dev: false + + /@swagger-api/apidom-ns-api-design-systems@0.82.0: + resolution: {integrity: sha512-RHTNeukATbXX5GAIsZbvhK2N58TjvOwy4M2zMU6hJ0sseIqc5WSyz8WuuignOj4wXqb9EZIlCI4rbebAxXcAXg==} + requiresBuild: true + dependencies: + '@babel/runtime-corejs3': 7.23.2 + '@swagger-api/apidom-core': 0.82.0 + '@swagger-api/apidom-error': 0.82.0 + '@swagger-api/apidom-ns-openapi-3-1': 0.82.0 + '@types/ramda': 0.29.7 + ramda: 0.29.1 + ramda-adjunct: 4.1.1(ramda@0.29.1) + stampit: 4.3.2 + dev: false + optional: true + + /@swagger-api/apidom-ns-asyncapi-2@0.82.0: + resolution: {integrity: sha512-QC1DixwsboYU6xBd+AJ7lmYHzLeUsfAni18NNtr6IGXOgQLqldTvW2/gveDROTUHkeEyRaMYCPmGKc3q5z/kSg==} + requiresBuild: true + dependencies: + '@babel/runtime-corejs3': 7.23.2 + '@swagger-api/apidom-core': 0.82.0 + '@swagger-api/apidom-ns-json-schema-draft-7': 0.82.0 + '@types/ramda': 0.29.7 + ramda: 0.29.1 + ramda-adjunct: 4.1.1(ramda@0.29.1) + stampit: 4.3.2 + dev: false + optional: true + + /@swagger-api/apidom-ns-json-schema-draft-4@0.82.0: + resolution: {integrity: sha512-bZt15vKFbl5hw3KELDiBiyHkJdoeP5tahN7q86VV7hTJHJPmKXy5LHk5StvIOadcExcQFWcXX4D2xd9IuiYH/w==} + requiresBuild: true + dependencies: + '@babel/runtime-corejs3': 7.23.2 + '@swagger-api/apidom-ast': 0.82.0 + '@swagger-api/apidom-core': 0.82.0 + '@types/ramda': 0.29.7 + ramda: 0.29.1 + ramda-adjunct: 4.1.1(ramda@0.29.1) + stampit: 4.3.2 + dev: false + + /@swagger-api/apidom-ns-json-schema-draft-6@0.82.0: + resolution: {integrity: sha512-uzNUJnO/YgK9ceo92LR46QwhFe5hgKgJvILYYdVIalEyPO9j5E/akyz8mpOGOk0cpTA9WQtCCluICryZ0eSirg==} + requiresBuild: true + dependencies: + '@babel/runtime-corejs3': 7.23.2 + '@swagger-api/apidom-core': 0.82.0 + '@swagger-api/apidom-error': 0.82.0 + '@swagger-api/apidom-ns-json-schema-draft-4': 0.82.0 + '@types/ramda': 0.29.7 + ramda: 0.29.1 + ramda-adjunct: 4.1.1(ramda@0.29.1) + stampit: 4.3.2 + dev: false + optional: true + + /@swagger-api/apidom-ns-json-schema-draft-7@0.82.0: + resolution: {integrity: sha512-MJzReioOsw+YM7cxm2gGDvjWoQZ3ADAfKfwGBXhnZKcJhWD9o9DVccCSj0fKskDF3G7PEsTy0Ik6lfmBBaywVA==} + requiresBuild: true + dependencies: + '@babel/runtime-corejs3': 7.23.2 + '@swagger-api/apidom-core': 0.82.0 + '@swagger-api/apidom-error': 0.82.0 + '@swagger-api/apidom-ns-json-schema-draft-6': 0.82.0 + '@types/ramda': 0.29.7 + ramda: 0.29.1 + ramda-adjunct: 4.1.1(ramda@0.29.1) + stampit: 4.3.2 + dev: false + optional: true + + /@swagger-api/apidom-ns-openapi-2@0.82.0: + resolution: {integrity: sha512-kldDg1kOuWge5Ii8EV9TdkTl/vLcQGQSWmZNb5VAlOpCRI/xltj+t2WEt8PEofvmIAsIJOln1ScCXLo5UMU57w==} + requiresBuild: true + dependencies: + '@babel/runtime-corejs3': 7.23.2 + '@swagger-api/apidom-core': 0.82.0 + '@swagger-api/apidom-error': 0.82.0 + '@swagger-api/apidom-ns-json-schema-draft-4': 0.82.0 + '@types/ramda': 0.29.7 + ramda: 0.29.1 + ramda-adjunct: 4.1.1(ramda@0.29.1) + stampit: 4.3.2 + dev: false + optional: true + + /@swagger-api/apidom-ns-openapi-3-0@0.82.0: + resolution: {integrity: sha512-E53qEeM8E4kycXEAM27Vcw8Qu0JHNMwzUclYK4f0yNHfUX8WJm3Ge0gL4vc2QleDtlLjMsK986mo1Y5LBXb//w==} + dependencies: + '@babel/runtime-corejs3': 7.23.2 + '@swagger-api/apidom-core': 0.82.0 + '@swagger-api/apidom-error': 0.82.0 + '@swagger-api/apidom-ns-json-schema-draft-4': 0.82.0 + '@types/ramda': 0.29.7 + ramda: 0.29.1 + ramda-adjunct: 4.1.1(ramda@0.29.1) + stampit: 4.3.2 + dev: false + + /@swagger-api/apidom-ns-openapi-3-1@0.82.0: + resolution: {integrity: sha512-jR341a8yceEoX5K9KKAod5AzpU3uSul2ok6bj7DdtM9Ze+tIDgqvNmz7V+yUu1mgiCJtdYMirIs27E42o6F+Gg==} + dependencies: + '@babel/runtime-corejs3': 7.23.2 + '@swagger-api/apidom-ast': 0.82.0 + '@swagger-api/apidom-core': 0.82.0 + '@swagger-api/apidom-ns-openapi-3-0': 0.82.0 + '@types/ramda': 0.29.7 + ramda: 0.29.1 + ramda-adjunct: 4.1.1(ramda@0.29.1) + stampit: 4.3.2 + dev: false + + /@swagger-api/apidom-parser-adapter-api-design-systems-json@0.82.0: + resolution: {integrity: sha512-aONrPTV+Zk55E4aF3b5SEJe+//n1mievXxKawZKMdpT3KFMD5KbOheV2EVc/hlWrq9hvXJVDSRal8a18gFtZsA==} + requiresBuild: true + dependencies: + '@babel/runtime-corejs3': 7.23.2 + '@swagger-api/apidom-core': 0.82.0 + '@swagger-api/apidom-ns-api-design-systems': 0.82.0 + '@swagger-api/apidom-parser-adapter-json': 0.82.0 + '@types/ramda': 0.29.7 + ramda: 0.29.1 + ramda-adjunct: 4.1.1(ramda@0.29.1) + dev: false + optional: true + + /@swagger-api/apidom-parser-adapter-api-design-systems-yaml@0.82.0: + resolution: {integrity: sha512-/rcCN7lJbHFwcTERgaPA4Ib/G3H5wYMhpx8FD5Tp4CUGMiVDtroYh4EIVSblpIuZAjCqIfWg4SBcSb4PUbqwxw==} + requiresBuild: true + dependencies: + '@babel/runtime-corejs3': 7.23.2 + '@swagger-api/apidom-core': 0.82.0 + '@swagger-api/apidom-ns-api-design-systems': 0.82.0 + '@swagger-api/apidom-parser-adapter-yaml-1-2': 0.82.0 + '@types/ramda': 0.29.7 + ramda: 0.29.1 + ramda-adjunct: 4.1.1(ramda@0.29.1) + dev: false + optional: true + + /@swagger-api/apidom-parser-adapter-asyncapi-json-2@0.82.0: + resolution: {integrity: sha512-ys69ojLpPMzsmZ7a1aAJEfvhRPskC1IXGPIQxaERI0AbT0izAjdW9onE47ca2vXOwiCHRY5FBeT3EtpYKcw8VQ==} + requiresBuild: true + dependencies: + '@babel/runtime-corejs3': 7.23.2 + '@swagger-api/apidom-core': 0.82.0 + '@swagger-api/apidom-ns-asyncapi-2': 0.82.0 + '@swagger-api/apidom-parser-adapter-json': 0.82.0 + '@types/ramda': 0.29.7 + ramda: 0.29.1 + ramda-adjunct: 4.1.1(ramda@0.29.1) + dev: false + optional: true + + /@swagger-api/apidom-parser-adapter-asyncapi-yaml-2@0.82.0: + resolution: {integrity: sha512-zywwv0jJNGYf8R8tRqJgvY4xInCqThrHXR40b+7hm/awAjJ+wjShJVtdEsbwvMfywjwpa3EfqqkPyQUB+zbjXQ==} + requiresBuild: true + dependencies: + '@babel/runtime-corejs3': 7.23.2 + '@swagger-api/apidom-core': 0.82.0 + '@swagger-api/apidom-ns-asyncapi-2': 0.82.0 + '@swagger-api/apidom-parser-adapter-yaml-1-2': 0.82.0 + '@types/ramda': 0.29.7 + ramda: 0.29.1 + ramda-adjunct: 4.1.1(ramda@0.29.1) + dev: false + optional: true + + /@swagger-api/apidom-parser-adapter-json@0.82.0: + resolution: {integrity: sha512-kn9DWETNjGN6Zf/AcqY4BDvYzmhb7ZgxBE2QI9ixnLSM2nWlKoGKzAlePh8aJhFL0Fel5GDh/eyqz2AsFHdD6Q==} + requiresBuild: true + dependencies: + '@babel/runtime-corejs3': 7.23.2 + '@swagger-api/apidom-ast': 0.82.0 + '@swagger-api/apidom-core': 0.82.0 + '@swagger-api/apidom-error': 0.82.0 + '@types/ramda': 0.29.7 + ramda: 0.29.1 + ramda-adjunct: 4.1.1(ramda@0.29.1) + stampit: 4.3.2 + tree-sitter: 0.20.4 + tree-sitter-json: 0.20.1 + web-tree-sitter: 0.20.3 + dev: false + optional: true + + /@swagger-api/apidom-parser-adapter-openapi-json-2@0.82.0: + resolution: {integrity: sha512-9vLWhcVME8ZsSvORLHZnru4SPRVzkKHncgaHyGV5r8I7shluOYOZiY71kIqKUfNJ1VVyDhdeyTQjHt8VPaNYZw==} + requiresBuild: true + dependencies: + '@babel/runtime-corejs3': 7.23.2 + '@swagger-api/apidom-core': 0.82.0 + '@swagger-api/apidom-ns-openapi-2': 0.82.0 + '@swagger-api/apidom-parser-adapter-json': 0.82.0 + '@types/ramda': 0.29.7 + ramda: 0.29.1 + ramda-adjunct: 4.1.1(ramda@0.29.1) + dev: false + optional: true + + /@swagger-api/apidom-parser-adapter-openapi-json-3-0@0.82.0: + resolution: {integrity: sha512-6s+dkYBvxJoFJustuAPUluM+qr0GeqeJIGG8aNsUfSEtwNQsMwjoN30nLuUYULcRRIVQJ8CyBHd7Gwipt2iJjA==} + requiresBuild: true + dependencies: + '@babel/runtime-corejs3': 7.23.2 + '@swagger-api/apidom-core': 0.82.0 + '@swagger-api/apidom-ns-openapi-3-0': 0.82.0 + '@swagger-api/apidom-parser-adapter-json': 0.82.0 + '@types/ramda': 0.29.7 + ramda: 0.29.1 + ramda-adjunct: 4.1.1(ramda@0.29.1) + dev: false + optional: true + + /@swagger-api/apidom-parser-adapter-openapi-json-3-1@0.82.0: + resolution: {integrity: sha512-+bEGtizoQItcj5jv8oa/tFflxwvez2heLLy985KznN8/sOGsCoHqWfbr9Wz3wdqFyb4D21vpxSEkbKzU/75DEw==} + requiresBuild: true + dependencies: + '@babel/runtime-corejs3': 7.23.2 + '@swagger-api/apidom-core': 0.82.0 + '@swagger-api/apidom-ns-openapi-3-1': 0.82.0 + '@swagger-api/apidom-parser-adapter-json': 0.82.0 + '@types/ramda': 0.29.7 + ramda: 0.29.1 + ramda-adjunct: 4.1.1(ramda@0.29.1) + dev: false + optional: true + + /@swagger-api/apidom-parser-adapter-openapi-yaml-2@0.82.0: + resolution: {integrity: sha512-OWTtB5Z5e86Z0awqWParC8JcT2Tb0uo2oroO9Wu0LcMlBm4fYN4T74vRlV68ggJbSlH6IYv5FPiI26v7bEfRMA==} + requiresBuild: true + dependencies: + '@babel/runtime-corejs3': 7.23.2 + '@swagger-api/apidom-core': 0.82.0 + '@swagger-api/apidom-ns-openapi-2': 0.82.0 + '@swagger-api/apidom-parser-adapter-yaml-1-2': 0.82.0 + '@types/ramda': 0.29.7 + ramda: 0.29.1 + ramda-adjunct: 4.1.1(ramda@0.29.1) + dev: false + optional: true + + /@swagger-api/apidom-parser-adapter-openapi-yaml-3-0@0.82.0: + resolution: {integrity: sha512-ftRsZbhr7TLV4+EOPWzEvtrpG322XQ1CPjhGXDlBUoAaDDapj6W8GGqmCuNdN25PpCtAVGSWjJtABqfInNjSEg==} + requiresBuild: true + dependencies: + '@babel/runtime-corejs3': 7.23.2 + '@swagger-api/apidom-core': 0.82.0 + '@swagger-api/apidom-ns-openapi-3-0': 0.82.0 + '@swagger-api/apidom-parser-adapter-yaml-1-2': 0.82.0 + '@types/ramda': 0.29.7 + ramda: 0.29.1 + ramda-adjunct: 4.1.1(ramda@0.29.1) + dev: false + optional: true + + /@swagger-api/apidom-parser-adapter-openapi-yaml-3-1@0.82.0: + resolution: {integrity: sha512-MvPkbhctACy9wl6dFbnTSTAT6H8gOHcmxdCm+Y2qfFKPNna7vt7fcEKXURi/rIp2RoF2TccN8htvDPFPkbIyQg==} + requiresBuild: true + dependencies: + '@babel/runtime-corejs3': 7.23.2 + '@swagger-api/apidom-core': 0.82.0 + '@swagger-api/apidom-ns-openapi-3-1': 0.82.0 + '@swagger-api/apidom-parser-adapter-yaml-1-2': 0.82.0 + '@types/ramda': 0.29.7 + ramda: 0.29.1 + ramda-adjunct: 4.1.1(ramda@0.29.1) + dev: false + optional: true + + /@swagger-api/apidom-parser-adapter-yaml-1-2@0.82.0: + resolution: {integrity: sha512-HkWZNFEgHTRid380gpWdj0qzCsmUx4aCufDmsDn8UIuBKrrIEC2f0cIqAgnLeEn/PE+3717y8gsd61gWOJlo6Q==} + requiresBuild: true + dependencies: + '@babel/runtime-corejs3': 7.23.2 + '@swagger-api/apidom-ast': 0.82.0 + '@swagger-api/apidom-core': 0.82.0 + '@swagger-api/apidom-error': 0.82.0 + '@types/ramda': 0.29.7 + ramda: 0.29.1 + ramda-adjunct: 4.1.1(ramda@0.29.1) + stampit: 4.3.2 + tree-sitter: 0.20.4 + tree-sitter-yaml: 0.5.0 + web-tree-sitter: 0.20.3 + dev: false + optional: true + + /@swagger-api/apidom-reference@0.82.0: + resolution: {integrity: sha512-yWfn3vVP4U2dv+GT+UyL3bVA42HvebiSY+15Ln/202qcEbIHsQ1U/TGLmjdgE7tPeuGDEnltL0HgvyJ3ALgmVg==} + dependencies: + '@babel/runtime-corejs3': 7.23.2 + '@swagger-api/apidom-core': 0.82.0 + '@types/ramda': 0.29.7 + axios: 1.6.0 + minimatch: 7.4.6 + process: 0.11.10 + ramda: 0.29.1 + ramda-adjunct: 4.1.1(ramda@0.29.1) + stampit: 4.3.2 + optionalDependencies: + '@swagger-api/apidom-error': 0.82.0 + '@swagger-api/apidom-json-pointer': 0.82.0 + '@swagger-api/apidom-ns-asyncapi-2': 0.82.0 + '@swagger-api/apidom-ns-openapi-2': 0.82.0 + '@swagger-api/apidom-ns-openapi-3-0': 0.82.0 + '@swagger-api/apidom-ns-openapi-3-1': 0.82.0 + '@swagger-api/apidom-parser-adapter-api-design-systems-json': 0.82.0 + '@swagger-api/apidom-parser-adapter-api-design-systems-yaml': 0.82.0 + '@swagger-api/apidom-parser-adapter-asyncapi-json-2': 0.82.0 + '@swagger-api/apidom-parser-adapter-asyncapi-yaml-2': 0.82.0 + '@swagger-api/apidom-parser-adapter-json': 0.82.0 + '@swagger-api/apidom-parser-adapter-openapi-json-2': 0.82.0 + '@swagger-api/apidom-parser-adapter-openapi-json-3-0': 0.82.0 + '@swagger-api/apidom-parser-adapter-openapi-json-3-1': 0.82.0 + '@swagger-api/apidom-parser-adapter-openapi-yaml-2': 0.82.0 + '@swagger-api/apidom-parser-adapter-openapi-yaml-3-0': 0.82.0 + '@swagger-api/apidom-parser-adapter-openapi-yaml-3-1': 0.82.0 + '@swagger-api/apidom-parser-adapter-yaml-1-2': 0.82.0 + transitivePeerDependencies: + - debug + dev: false + + /@swc/core-darwin-arm64@1.3.95: + resolution: {integrity: sha512-VAuBAP3MNetO/yBIBzvorUXq7lUBwhfpJxYViSxyluMwtoQDhE/XWN598TWMwMl1ZuImb56d7eUsuFdjgY7pJw==} + engines: {node: '>=10'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + optional: true + + /@swc/core-darwin-x64@1.3.95: + resolution: {integrity: sha512-20vF2rvUsN98zGLZc+dsEdHvLoCuiYq/1B+TDeE4oolgTFDmI1jKO+m44PzWjYtKGU9QR95sZ6r/uec0QC5O4Q==} + engines: {node: '>=10'} + cpu: [x64] + os: [darwin] + requiresBuild: true + optional: true + + /@swc/core-linux-arm-gnueabihf@1.3.95: + resolution: {integrity: sha512-oEudEM8PST1MRNGs+zu0cx5i9uP8TsLE4/L9HHrS07Ck0RJ3DCj3O2fU832nmLe2QxnAGPwBpSO9FntLfOiWEQ==} + engines: {node: '>=10'} + cpu: [arm] + os: [linux] + requiresBuild: true + optional: true + + /@swc/core-linux-arm64-gnu@1.3.95: + resolution: {integrity: sha512-pIhFI+cuC1aYg+0NAPxwT/VRb32f2ia8oGxUjQR6aJg65gLkUYQzdwuUmpMtFR2WVf7WVFYxUnjo4UyMuyh3ng==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + optional: true + + /@swc/core-linux-arm64-musl@1.3.95: + resolution: {integrity: sha512-ZpbTr+QZDT4OPJfjPAmScqdKKaT+wGurvMU5AhxLaf85DuL8HwUwwlL0n1oLieLc47DwIJEMuKQkYhXMqmJHlg==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + optional: true + + /@swc/core-linux-x64-gnu@1.3.95: + resolution: {integrity: sha512-n9SuHEFtdfSJ+sHdNXNRuIOVprB8nbsz+08apKfdo4lEKq6IIPBBAk5kVhPhkjmg2dFVHVo4Tr/OHXM1tzWCCw==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + requiresBuild: true + optional: true + + /@swc/core-linux-x64-musl@1.3.95: + resolution: {integrity: sha512-L1JrVlsXU3LC0WwmVnMK9HrOT2uhHahAoPNMJnZQpc18a0paO9fqifPG8M/HjNRffMUXR199G/phJsf326UvVg==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + requiresBuild: true + optional: true + + /@swc/core-win32-arm64-msvc@1.3.95: + resolution: {integrity: sha512-YaP4x/aZbUyNdqCBpC2zL8b8n58MEpOUpmOIZK6G1SxGi+2ENht7gs7+iXpWPc0sy7X3YPKmSWMAuui0h8lgAA==} + engines: {node: '>=10'} + cpu: [arm64] + os: [win32] + requiresBuild: true + optional: true + + /@swc/core-win32-ia32-msvc@1.3.95: + resolution: {integrity: sha512-w0u3HI916zT4BC/57gOd+AwAEjXeUlQbGJ9H4p/gzs1zkSHtoDQghVUNy3n/ZKp9KFod/95cA8mbVF9t1+6epQ==} + engines: {node: '>=10'} + cpu: [ia32] + os: [win32] + requiresBuild: true + optional: true + + /@swc/core-win32-x64-msvc@1.3.95: + resolution: {integrity: sha512-5RGnMt0S6gg4Gc6QtPUJ3Qs9Un4sKqccEzgH/tj7V/DVTJwKdnBKxFZfgQ34OR2Zpz7zGOn889xwsFVXspVWNA==} + engines: {node: '>=10'} + cpu: [x64] + os: [win32] + requiresBuild: true + optional: true + + /@swc/core@1.3.95: + resolution: {integrity: sha512-PMrNeuqIusq9DPDooV3FfNEbZuTu5jKAc04N3Hm6Uk2Fl49cqElLFQ4xvl4qDmVDz97n3n/C1RE0/f6WyGPEiA==} + engines: {node: '>=10'} + requiresBuild: true + peerDependencies: + '@swc/helpers': ^0.5.0 + peerDependenciesMeta: + '@swc/helpers': + optional: true + dependencies: + '@swc/counter': 0.1.2 + '@swc/types': 0.1.5 + optionalDependencies: + '@swc/core-darwin-arm64': 1.3.95 + '@swc/core-darwin-x64': 1.3.95 + '@swc/core-linux-arm-gnueabihf': 1.3.95 + '@swc/core-linux-arm64-gnu': 1.3.95 + '@swc/core-linux-arm64-musl': 1.3.95 + '@swc/core-linux-x64-gnu': 1.3.95 + '@swc/core-linux-x64-musl': 1.3.95 + '@swc/core-win32-arm64-msvc': 1.3.95 + '@swc/core-win32-ia32-msvc': 1.3.95 + '@swc/core-win32-x64-msvc': 1.3.95 + + /@swc/counter@0.1.2: + resolution: {integrity: sha512-9F4ys4C74eSTEUNndnER3VJ15oru2NumfQxS8geE+f3eB5xvfxpWyqE5XlVnxb/R14uoXi6SLbBwwiDSkv+XEw==} + + /@swc/helpers@0.5.3: + resolution: {integrity: sha512-FaruWX6KdudYloq1AHD/4nU+UsMTdNE8CKyrseXWEcgjDAbvkwJg2QGPAnfIJLIWsjZOSPLOAykK6fuYp4vp4A==} + dependencies: + tslib: 2.6.2 + dev: false + + /@swc/types@0.1.5: + resolution: {integrity: sha512-myfUej5naTBWnqOCc/MdVOLVjXUXtIA+NpDrDBKJtLLg2shUjBu3cZmB/85RyitKc55+lUUyl7oRfLOvkr2hsw==} + + /@szmarczak/http-timer@5.0.1: + resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} + engines: {node: '>=14.16'} + dependencies: + defer-to-connect: 2.0.1 + dev: false + + /@tootallnate/once@2.0.0: + resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} + engines: {node: '>= 10'} + + /@trysound/sax@0.2.0: + resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} + engines: {node: '>=10.13.0'} + + /@types/acorn@4.0.6: + resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} + dependencies: + '@types/estree': 1.0.4 + dev: false + + /@types/babel__code-frame@7.0.5: + resolution: {integrity: sha512-tE88HnYMl5iJAB1V9nJCrE1udmwGCoNvx2ayTa8nwkE3UMMRRljANO+sX8D321hIrqf1DlvhAPAo5G6DWaMQNg==} + dev: true + + /@types/babel__core@7.20.3: + resolution: {integrity: sha512-54fjTSeSHwfan8AyHWrKbfBWiEUrNTZsUwPTDSNaaP1QDQIZbeNUg3a59E9D+375MzUw/x1vx2/0F5LBz+AeYA==} + dependencies: + '@babel/parser': 7.23.0 + '@babel/types': 7.23.0 + '@types/babel__generator': 7.6.6 + '@types/babel__template': 7.4.3 + '@types/babel__traverse': 7.20.3 + + /@types/babel__generator@7.6.6: + resolution: {integrity: sha512-66BXMKb/sUWbMdBNdMvajU7i/44RkrA3z/Yt1c7R5xejt8qh84iU54yUWCtm0QwGJlDcf/gg4zd/x4mpLAlb/w==} + dependencies: + '@babel/types': 7.23.0 + + /@types/babel__template@7.4.3: + resolution: {integrity: sha512-ciwyCLeuRfxboZ4isgdNZi/tkt06m8Tw6uGbBSBgWrnnZGNXiEyM27xc/PjXGQLqlZ6ylbgHMnm7ccF9tCkOeQ==} + dependencies: + '@babel/parser': 7.23.0 + '@babel/types': 7.23.0 + + /@types/babel__traverse@7.20.3: + resolution: {integrity: sha512-Lsh766rGEFbaxMIDH7Qa+Yha8cMVI3qAK6CHt3OR0YfxOIn5Z54iHiyDRycHrBqeIiqGa20Kpsv1cavfBKkRSw==} + dependencies: + '@babel/types': 7.23.0 + + /@types/body-parser@1.19.4: + resolution: {integrity: sha512-N7UDG0/xiPQa2D/XrVJXjkWbpqHCd2sBaB32ggRF2l83RhPfamgKGF8gwwqyksS95qUS5ZYF9aF+lLPRlwI2UA==} + dependencies: + '@types/connect': 3.4.37 + '@types/node': 18.11.19 + dev: false + + /@types/bonjour@3.5.12: + resolution: {integrity: sha512-ky0kWSqXVxSqgqJvPIkgFkcn4C8MnRog308Ou8xBBIVo39OmUFy+jqNe0nPwLCDFxUpmT9EvT91YzOJgkDRcFg==} + dependencies: + '@types/node': 18.11.19 + dev: false + + /@types/braces@3.0.3: + resolution: {integrity: sha512-8pfphQ0Gtn58PJ+pWB9LsZGz8Q6FTTvc4egkqGT9K1lp4fVF/HeX3d6w/YEkHt/9Luv1r2i+HekuwhAm8UX6/A==} + dev: true + + /@types/connect-history-api-fallback@1.5.2: + resolution: {integrity: sha512-gX2j9x+NzSh4zOhnRPSdPPmTepS4DfxES0AvIFv3jGv5QyeAJf6u6dY5/BAoAJU9Qq1uTvwOku8SSC2GnCRl6Q==} + dependencies: + '@types/express-serve-static-core': 4.17.39 + '@types/node': 18.11.19 + dev: false + + /@types/connect@3.4.37: + resolution: {integrity: sha512-zBUSRqkfZ59OcwXon4HVxhx5oWCJmc0OtBTK05M+p0dYjgN6iTwIL2T/WbsQZrEsdnwaF9cWQ+azOnpPvIqY3Q==} + dependencies: + '@types/node': 18.11.19 + dev: false + + /@types/d3-scale-chromatic@3.0.1: + resolution: {integrity: sha512-Ob7OrwiTeQXY/WBBbRHGZBOn6rH1h7y3jjpTSKYqDEeqFjktql6k2XSgNwLrLDmAsXhEn8P9NHDY4VTuo0ZY1w==} + + /@types/d3-scale@4.0.6: + resolution: {integrity: sha512-lo3oMLSiqsQUovv8j15X4BNEDOsnHuGjeVg7GRbAuB2PUa1prK5BNSOu6xixgNf3nqxPl4I1BqJWrPvFGlQoGQ==} + dependencies: + '@types/d3-time': 3.0.2 + + /@types/d3-time@3.0.2: + resolution: {integrity: sha512-kbdRXTmUgNfw5OTE3KZnFQn6XdIc4QGroN5UixgdrXATmYsdlPQS6pEut9tVlIojtzuFD4txs/L+Rq41AHtLpg==} + + /@types/debounce@1.2.3: + resolution: {integrity: sha512-97mx7gWt4e+kd0wPa1pNEvE4tYGhgBVa4ExWOLcfFohAjF9wERfJ+3qrn7I1e76oHupOvRs4UyYe9xzy0i4TUw==} + dev: true + + /@types/debug@4.1.10: + resolution: {integrity: sha512-tOSCru6s732pofZ+sMv9o4o3Zc+Sa8l3bxd/tweTQudFn06vAzb13ZX46Zi6m6EJ+RUbRTHvgQJ1gBtSgkaUYA==} + dependencies: + '@types/ms': 0.7.33 + + /@types/eslint-scope@3.7.6: + resolution: {integrity: sha512-zfM4ipmxVKWdxtDaJ3MP3pBurDXOCoyjvlpE3u6Qzrmw4BPbfm4/ambIeTk/r/J0iq/+2/xp0Fmt+gFvXJY2PQ==} + dependencies: + '@types/eslint': 8.44.6 + '@types/estree': 1.0.4 + + /@types/eslint@8.44.6: + resolution: {integrity: sha512-P6bY56TVmX8y9J87jHNgQh43h6VVU+6H7oN7hgvivV81K2XY8qJZ5vqPy/HdUoVIelii2kChYVzQanlswPWVFw==} + dependencies: + '@types/estree': 1.0.4 + '@types/json-schema': 7.0.14 + + /@types/estree-jsx@1.0.2: + resolution: {integrity: sha512-GNBWlGBMjiiiL5TSkvPtOteuXsiVitw5MYGY1UYlrAq0SKyczsls6sCD7TZ8fsjRsvCVxml7EbyjJezPb3DrSA==} + dependencies: + '@types/estree': 1.0.4 + dev: false + + /@types/estree@1.0.4: + resolution: {integrity: sha512-2JwWnHK9H+wUZNorf2Zr6ves96WHoWDJIftkcxPKsS7Djta6Zu519LarhRNljPXkpsZR2ZMwNCPeW7omW07BJw==} + + /@types/express-serve-static-core@4.17.39: + resolution: {integrity: sha512-BiEUfAiGCOllomsRAZOiMFP7LAnrifHpt56pc4Z7l9K6ACyN06Ns1JLMBxwkfLOjJRlSf06NwWsT7yzfpaVpyQ==} + dependencies: + '@types/node': 18.11.19 + '@types/qs': 6.9.9 + '@types/range-parser': 1.2.6 + '@types/send': 0.17.3 + dev: false + + /@types/express@4.17.20: + resolution: {integrity: sha512-rOaqlkgEvOW495xErXMsmyX3WKBInbhG5eqojXYi3cGUaLoRDlXa5d52fkfWZT963AZ3v2eZ4MbKE6WpDAGVsw==} + dependencies: + '@types/body-parser': 1.19.4 + '@types/express-serve-static-core': 4.17.39 + '@types/qs': 6.9.9 + '@types/serve-static': 1.15.4 + dev: false + + /@types/gtag.js@0.0.12: + resolution: {integrity: sha512-YQV9bUsemkzG81Ea295/nF/5GijnD2Af7QhEofh7xu+kvCN6RdodgNwwGWXB5GMI3NoyvQo0odNctoH/qLMIpg==} + dev: false + + /@types/hast@2.3.7: + resolution: {integrity: sha512-EVLigw5zInURhzfXUM65eixfadfsHKomGKUakToXo84t8gGIJuTcD2xooM2See7GyQ7DRtYjhCHnSUQez8JaLw==} + dependencies: + '@types/unist': 2.0.9 + dev: false + + /@types/hast@3.0.2: + resolution: {integrity: sha512-B5hZHgHsXvfCoO3xgNJvBnX7N8p86TqQeGKXcokW4XXi+qY4vxxPSFYofytvVmpFxzPv7oxDQzjg5Un5m2/xiw==} + dependencies: + '@types/unist': 3.0.1 + dev: false + + /@types/history@4.7.11: + resolution: {integrity: sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==} + + /@types/hoist-non-react-statics@3.3.4: + resolution: {integrity: sha512-ZchYkbieA+7tnxwX/SCBySx9WwvWR8TaP5tb2jRAzwvLb/rWchGw3v0w3pqUbUvj0GCwW2Xz/AVPSk6kUGctXQ==} + dependencies: + '@types/react': 18.2.34 + hoist-non-react-statics: 3.3.2 + dev: false + + /@types/html-minifier-terser@6.1.0: + resolution: {integrity: sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==} + dev: false + + /@types/http-cache-semantics@4.0.3: + resolution: {integrity: sha512-V46MYLFp08Wf2mmaBhvgjStM3tPa+2GAdy/iqoX+noX1//zje2x4XmrIU0cAwyClATsTmahbtoQ2EwP7I5WSiA==} + dev: false + + /@types/http-errors@2.0.3: + resolution: {integrity: sha512-pP0P/9BnCj1OVvQR2lF41EkDG/lWWnDyA203b/4Fmi2eTyORnBtcDoKDwjWQthELrBvWkMOrvSOnZ8OVlW6tXA==} + dev: false + + /@types/http-proxy@1.17.13: + resolution: {integrity: sha512-GkhdWcMNiR5QSQRYnJ+/oXzu0+7JJEPC8vkWXK351BkhjraZF+1W13CUYARUvX9+NqIU2n6YHA4iwywsc/M6Sw==} + dependencies: + '@types/node': 18.11.19 + dev: false + + /@types/istanbul-lib-coverage@2.0.5: + resolution: {integrity: sha512-zONci81DZYCZjiLe0r6equvZut0b+dBRPBN5kBDjsONnutYNtJMoWQ9uR2RkL1gLG9NMTzvf+29e5RFfPbeKhQ==} + + /@types/istanbul-lib-report@3.0.2: + resolution: {integrity: sha512-8toY6FgdltSdONav1XtUHl4LN1yTmLza+EuDazb/fEmRNCwjyqNVIQWs2IfC74IqjHkREs/nQ2FWq5kZU9IC0w==} + dependencies: + '@types/istanbul-lib-coverage': 2.0.5 + dev: false + + /@types/istanbul-reports@3.0.3: + resolution: {integrity: sha512-1nESsePMBlf0RPRffLZi5ujYh7IH1BWL4y9pr+Bn3cJBdxz+RTP8bUFljLz9HvzhhOSWKdyBZ4DIivdL6rvgZg==} + dependencies: + '@types/istanbul-lib-report': 3.0.2 + dev: false + + /@types/js-yaml@4.0.8: + resolution: {integrity: sha512-m6jnPk1VhlYRiLFm3f8X9Uep761f+CK8mHyS65LutH2OhmBF0BeMEjHgg05usH8PLZMWWc/BUR9RPmkvpWnyRA==} + dev: true + + /@types/json-schema@7.0.14: + resolution: {integrity: sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw==} + + /@types/lodash@4.14.191: + resolution: {integrity: sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ==} + dev: true + + /@types/mdast@3.0.14: + resolution: {integrity: sha512-gVZ04PGgw1qLZKsnWnyFv4ORnaJ+DXLdHTVSFbU8yX6xZ34Bjg4Q32yPkmveUP1yItXReKfB0Aknlh/3zxTKAw==} + dependencies: + '@types/unist': 2.0.9 + + /@types/mdast@4.0.2: + resolution: {integrity: sha512-tYR83EignvhYO9iU3kDg8V28M0jqyh9zzp5GV+EO+AYnyUl3P5ltkTeJuTiFZQFz670FSb3EwT/6LQdX+UdKfw==} + dependencies: + '@types/unist': 3.0.1 + dev: false + + /@types/mdx@2.0.9: + resolution: {integrity: sha512-OKMdj17y8Cs+k1r0XFyp59ChSOwf8ODGtMQ4mnpfz5eFDk1aO41yN3pSKGuvVzmWAkFp37seubY1tzOVpwfWwg==} + dev: false + + /@types/micromatch@4.0.4: + resolution: {integrity: sha512-ZeDgs/tFSdUqkAZmgdnu5enRwFXJ+nIF4TxK5ENw6x0bvfcgMD1H3GnTS+fIkBUcvijQNF7ZOa2tuOtOaEjt3w==} + dependencies: + '@types/braces': 3.0.3 + dev: true + + /@types/mime@1.3.4: + resolution: {integrity: sha512-1Gjee59G25MrQGk8bsNvC6fxNiRgUlGn2wlhGf95a59DrprnnHk80FIMMFG9XHMdrfsuA119ht06QPDXA1Z7tw==} + dev: false + + /@types/mime@3.0.3: + resolution: {integrity: sha512-i8MBln35l856k5iOhKk2XJ4SeAWg75mLIpZB4v6imOagKL6twsukBZGDMNhdOVk7yRFTMPpfILocMos59Q1otQ==} + dev: false + + /@types/mocha@10.0.3: + resolution: {integrity: sha512-RsOPImTriV/OE4A9qKjMtk2MnXiuLLbcO3nCXK+kvq4nr0iMfFgpjaX3MPLb6f7+EL1FGSelYvuJMV6REH+ZPQ==} + dev: true + + /@types/ms@0.7.33: + resolution: {integrity: sha512-AuHIyzR5Hea7ij0P9q7vx7xu4z0C28ucwjAZC0ja7JhINyCnOw8/DnvAPQQ9TfOlCtZAmCERKQX9+o1mgQhuOQ==} + + /@types/mustache@4.2.4: + resolution: {integrity: sha512-5DK8oX+pyEJm8Arm57Ut2R4KCeDuNQhLAuU04IgaKB7nYsFYzhpWqSoFnp7kCtVG7wXKftnaEJIyUFTVvSkkzw==} + dev: true + + /@types/node-fetch@2.6.8: + resolution: {integrity: sha512-nnH5lV9QCMPsbEVdTb5Y+F3GQxLSw1xQgIydrb2gSfEavRPs50FnMr+KUaa+LoPSqibm2N+ZZxH7lavZlAT4GA==} + dependencies: + '@types/node': 18.11.19 + form-data: 4.0.0 + dev: false + + /@types/node-forge@1.3.8: + resolution: {integrity: sha512-vGXshY9vim9CJjrpcS5raqSjEfKlJcWy2HNdgUasR66fAnVEYarrf1ULV4nfvpC1nZq/moA9qyqBcu83x+Jlrg==} + dependencies: + '@types/node': 18.11.19 + dev: false + + /@types/node@17.0.45: + resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} + dev: false + + /@types/node@18.11.19: + resolution: {integrity: sha512-YUgMWAQBWLObABqrvx8qKO1enAvBUdjZOAWQ5grBAkp5LQv45jBvYKZ3oFS9iKRCQyFjqw6iuEa1vmFqtxYLZw==} + + /@types/normalize-package-data@2.4.3: + resolution: {integrity: sha512-ehPtgRgaULsFG8x0NeYJvmyH1hmlfsNLujHe9dQEia/7MAJYdzMSi19JtchUHjmBA6XC/75dK55mzZH+RyieSg==} + dev: false + + /@types/parse-json@4.0.1: + resolution: {integrity: sha512-3YmXzzPAdOTVljVMkTMBdBEvlOLg2cDQaDhnnhT3nT9uDbnJzjWhKlzb+desT12Y7tGqaN6d+AbozcKzyL36Ng==} + dev: false + + /@types/plist@3.0.4: + resolution: {integrity: sha512-pTa9xUFQFM9WJGSWHajYNljD+DbVylE1q9IweK1LBhUYJdJ28YNU8j3KZ4Q1Qw+cSl4+QLLLOVmqNjhhvVO8fA==} + dependencies: + '@types/node': 18.11.19 + xmlbuilder: 15.1.1 + dev: true + + /@types/pluralize@0.0.30: + resolution: {integrity: sha512-kVww6xZrW/db5BR9OqiT71J9huRdQ+z/r+LbDuT7/EK50mCmj5FoaIARnVv0rvjUS/YpDox0cDU9lpQT011VBA==} + dev: true + + /@types/prismjs@1.26.2: + resolution: {integrity: sha512-/r7Cp7iUIk7gts26mHXD66geUC+2Fo26TZYjQK6Nr4LDfi6lmdRmMqM0oPwfiMhUwoBAOFe8GstKi2pf6hZvwA==} + dev: false + + /@types/prompts@2.4.7: + resolution: {integrity: sha512-5zTamE+QQM4nR6Ab3yHK+ovWuhLJXaa2ZLt3mT1en8U3ubWtjVT1vXDaVFC2+cL89uVn7Y+gIq5B3IcVvBl5xQ==} + dependencies: + '@types/node': 18.11.19 + kleur: 3.0.3 + dev: true + + /@types/prop-types@15.7.9: + resolution: {integrity: sha512-n1yyPsugYNSmHgxDFjicaI2+gCNjsBck8UX9kuofAKlc0h1bL+20oSF72KeNaW2DUlesbEVCFgyV2dPGTiY42g==} + + /@types/qs@6.9.9: + resolution: {integrity: sha512-wYLxw35euwqGvTDx6zfY1vokBFnsK0HNrzc6xNHchxfO2hpuRg74GbkEW7e3sSmPvj0TjCDT1VCa6OtHXnubsg==} + dev: false + + /@types/ramda@0.29.7: + resolution: {integrity: sha512-IUl6U95qwlQtVvZkSX4ODj08oJVtPyWMFRtPVNqhxc2rt+Bh7lCzTrGMYMZ7dmRKcAjtot3xrPnYGwsjdt8gzQ==} + dependencies: + types-ramda: 0.29.5 + dev: false + + /@types/range-parser@1.2.6: + resolution: {integrity: sha512-+0autS93xyXizIYiyL02FCY8N+KkKPhILhcUSA276HxzreZ16kl+cmwvV2qAM/PuCCwPXzOXOWhiPcw20uSFcA==} + dev: false + + /@types/react-dom@18.2.14: + resolution: {integrity: sha512-V835xgdSVmyQmI1KLV2BEIUgqEuinxp9O4G6g3FqO/SqLac049E53aysv0oEFD2kHfejeKU+ZqL2bcFWj9gLAQ==} + dependencies: + '@types/react': 18.2.34 + + /@types/react-router-config@5.0.9: + resolution: {integrity: sha512-a7zOj9yVUtM3Ns5stoseQAAsmppNxZpXDv6tZiFV5qlRmV4W96u53on1vApBX1eRSc8mrFOiB54Hc0Pk1J8GFg==} + dependencies: + '@types/history': 4.7.11 + '@types/react': 18.2.34 + '@types/react-router': 5.1.20 + + /@types/react-router-dom@5.3.3: + resolution: {integrity: sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==} + dependencies: + '@types/history': 4.7.11 + '@types/react': 18.2.34 + '@types/react-router': 5.1.20 + + /@types/react-router@5.1.20: + resolution: {integrity: sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==} + dependencies: + '@types/history': 4.7.11 + '@types/react': 18.2.34 + + /@types/react@18.2.34: + resolution: {integrity: sha512-U6eW/alrRk37FU/MS2RYMjx0Va2JGIVXELTODaTIYgvWGCV4Y4TfTUzG8DdmpDNIT0Xpj/R7GfyHOJJrDttcvg==} + dependencies: + '@types/prop-types': 15.7.9 + '@types/scheduler': 0.16.5 + csstype: 3.1.2 + + /@types/resolve@1.20.2: + resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} + + /@types/retry@0.12.0: + resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} + dev: false + + /@types/sax@1.2.6: + resolution: {integrity: sha512-A1mpYCYu1aHFayy8XKN57ebXeAbh9oQIZ1wXcno6b1ESUAfMBDMx7mf/QGlYwcMRaFryh9YBuH03i/3FlPGDkQ==} + dependencies: + '@types/node': 18.11.19 + dev: false + + /@types/scheduler@0.16.5: + resolution: {integrity: sha512-s/FPdYRmZR8SjLWGMCuax7r3qCWQw9QKHzXVukAuuIJkXkDRwp+Pu5LMIVFi0Fxbav35WURicYr8u1QsoybnQw==} + + /@types/semver@7.5.4: + resolution: {integrity: sha512-MMzuxN3GdFwskAnb6fz0orFvhfqi752yjaXylr0Rp4oDg5H0Zn1IuyRhDVvYOwAXoJirx2xuS16I3WjxnAIHiQ==} + + /@types/send@0.17.3: + resolution: {integrity: sha512-/7fKxvKUoETxjFUsuFlPB9YndePpxxRAOfGC/yJdc9kTjTeP5kRCTzfnE8kPUKCeyiyIZu0YQ76s50hCedI1ug==} + dependencies: + '@types/mime': 1.3.4 + '@types/node': 18.11.19 + dev: false + + /@types/serve-index@1.9.3: + resolution: {integrity: sha512-4KG+yMEuvDPRrYq5fyVm/I2uqAJSAwZK9VSa+Zf+zUq9/oxSSvy3kkIqyL+jjStv6UCVi8/Aho0NHtB1Fwosrg==} + dependencies: + '@types/express': 4.17.20 + dev: false + + /@types/serve-static@1.15.4: + resolution: {integrity: sha512-aqqNfs1XTF0HDrFdlY//+SGUxmdSUbjeRXb5iaZc3x0/vMbYmdw9qvOgHWOyyLFxSSRnUuP5+724zBgfw8/WAw==} + dependencies: + '@types/http-errors': 2.0.3 + '@types/mime': 3.0.3 + '@types/node': 18.11.19 + dev: false + + /@types/sinon@10.0.20: + resolution: {integrity: sha512-2APKKruFNCAZgx3daAyACGzWuJ028VVCUDk6o2rw/Z4PXT0ogwdV4KUegW0MwVs0Zu59auPXbbuBJHF12Sx1Eg==} + dependencies: + '@types/sinonjs__fake-timers': 8.1.4 + dev: true + + /@types/sinonjs__fake-timers@8.1.4: + resolution: {integrity: sha512-GDV68H0mBSN449sa5HEj51E0wfpVQb8xNSMzxf/PrypMFcLTMwJMOM/cgXiv71Mq5drkOQmUGvL1okOZcu6RrQ==} + dev: true + + /@types/sockjs@0.3.35: + resolution: {integrity: sha512-tIF57KB+ZvOBpAQwSaACfEu7htponHXaFzP7RfKYgsOS0NoYnn+9+jzp7bbq4fWerizI3dTB4NfAZoyeQKWJLw==} + dependencies: + '@types/node': 18.11.19 + dev: false + + /@types/swagger-ui-react@4.18.2: + resolution: {integrity: sha512-uLiHyNGFdgQINNSq3hgca+TNnNMS7/X59M02EbmDfARgvh7KcB6wU+FVfkVY13qE4Zk9opKvjGqygwjjP7+u6w==} + dependencies: + '@types/react': 18.2.34 + dev: true + + /@types/swagger-ui@3.52.3: + resolution: {integrity: sha512-CeD8e7peng0ONguJiDsUOaebsf39Dthxqt1geUNecgFFtuKTGxN8D+FEAEkJi3AH4sKf5v42eijU5QGcwL4K7g==} + dev: true + + /@types/tunnel@0.0.3: + resolution: {integrity: sha512-sOUTGn6h1SfQ+gbgqC364jLFBw2lnFqkgF3q0WovEHRLMrVD1sd5aufqi/aJObLekJO+Aq5z646U4Oxy6shXMA==} + dependencies: + '@types/node': 18.11.19 + dev: false + + /@types/unist@2.0.9: + resolution: {integrity: sha512-zC0iXxAv1C1ERURduJueYzkzZ2zaGyc+P2c95hgkikHPr3z8EdUZOlgEQ5X0DRmwDZn+hekycQnoeiiRVrmilQ==} + + /@types/unist@3.0.1: + resolution: {integrity: sha512-ue/hDUpPjC85m+PM9OQDMZr3LywT+CT6mPsQq8OJtCLiERkGRcQUFvu9XASF5XWqyZFXbf15lvb3JFJ4dRLWPg==} + dev: false + + /@types/use-sync-external-store@0.0.3: + resolution: {integrity: sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==} + dev: false + + /@types/vscode@1.82.0: + resolution: {integrity: sha512-VSHV+VnpF8DEm8LNrn8OJ8VuUNcBzN3tMvKrNpbhhfuVjFm82+6v44AbDhLvVFgCzn6vs94EJNTp7w8S6+Q1Rw==} + dev: true + + /@types/ws@8.5.8: + resolution: {integrity: sha512-flUksGIQCnJd6sZ1l5dqCEG/ksaoAg/eUwiLAGTJQcfgvZJKF++Ta4bJA6A5aPSJmsr+xlseHn4KLgVlNnvPTg==} + dependencies: + '@types/node': 18.11.19 + dev: false + + /@types/yargs-parser@21.0.2: + resolution: {integrity: sha512-5qcvofLPbfjmBfKaLfj/+f+Sbd6pN4zl7w7VSVI5uz7m9QZTuB2aZAa2uo1wHFBNN2x6g/SoTkXmd8mQnQF2Cw==} + + /@types/yargs@17.0.29: + resolution: {integrity: sha512-nacjqA3ee9zRF/++a3FUY1suHTFKZeHba2n8WeDw9cCVdmzmHpIxyzOJBcpHvvEmS8E9KqWlSnWHUkOrkhWcvA==} + dependencies: + '@types/yargs-parser': 21.0.2 + + /@typescript-eslint/eslint-plugin@6.9.1(@typescript-eslint/parser@6.9.1)(eslint@8.52.0)(typescript@5.2.2): + resolution: {integrity: sha512-w0tiiRc9I4S5XSXXrMHOWgHgxbrBn1Ro+PmiYhSg2ZVdxrAJtQgzU5o2m1BfP6UOn7Vxcc6152vFjQfmZR4xEg==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@eslint-community/regexpp': 4.10.0 + '@typescript-eslint/parser': 6.9.1(eslint@8.52.0)(typescript@5.2.2) + '@typescript-eslint/scope-manager': 6.9.1 + '@typescript-eslint/type-utils': 6.9.1(eslint@8.52.0)(typescript@5.2.2) + '@typescript-eslint/utils': 6.9.1(eslint@8.52.0)(typescript@5.2.2) + '@typescript-eslint/visitor-keys': 6.9.1 + debug: 4.3.4(supports-color@8.1.1) + eslint: 8.52.0 + graphemer: 1.4.0 + ignore: 5.2.4 + natural-compare: 1.4.0 + semver: 7.5.4 + ts-api-utils: 1.0.3(typescript@5.2.2) + typescript: 5.2.2 + transitivePeerDependencies: + - supports-color + dev: false + + /@typescript-eslint/parser@6.9.1(eslint@8.52.0)(typescript@5.2.2): + resolution: {integrity: sha512-C7AK2wn43GSaCUZ9do6Ksgi2g3mwFkMO3Cis96kzmgudoVaKyt62yNzJOktP0HDLb/iO2O0n2lBOzJgr6Q/cyg==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/scope-manager': 6.9.1 + '@typescript-eslint/types': 6.9.1 + '@typescript-eslint/typescript-estree': 6.9.1(typescript@5.2.2) + '@typescript-eslint/visitor-keys': 6.9.1 + debug: 4.3.4(supports-color@8.1.1) + eslint: 8.52.0 + typescript: 5.2.2 + transitivePeerDependencies: + - supports-color + + /@typescript-eslint/scope-manager@5.59.11: + resolution: {integrity: sha512-dHFOsxoLFtrIcSj5h0QoBT/89hxQONwmn3FOQ0GOQcLOOXm+MIrS8zEAhs4tWl5MraxCY3ZJpaXQQdFMc2Tu+Q==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.59.11 + '@typescript-eslint/visitor-keys': 5.59.11 + dev: false + + /@typescript-eslint/scope-manager@6.9.1: + resolution: {integrity: sha512-38IxvKB6NAne3g/+MyXMs2Cda/Sz+CEpmm+KLGEM8hx/CvnSRuw51i8ukfwB/B/sESdeTGet1NH1Wj7I0YXswg==} + engines: {node: ^16.0.0 || >=18.0.0} + dependencies: + '@typescript-eslint/types': 6.9.1 + '@typescript-eslint/visitor-keys': 6.9.1 + + /@typescript-eslint/type-utils@6.9.1(eslint@8.52.0)(typescript@5.2.2): + resolution: {integrity: sha512-eh2oHaUKCK58qIeYp19F5V5TbpM52680sB4zNSz29VBQPTWIlE/hCj5P5B1AChxECe/fmZlspAWFuRniep1Skg==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/typescript-estree': 6.9.1(typescript@5.2.2) + '@typescript-eslint/utils': 6.9.1(eslint@8.52.0)(typescript@5.2.2) + debug: 4.3.4(supports-color@8.1.1) + eslint: 8.52.0 + ts-api-utils: 1.0.3(typescript@5.2.2) + typescript: 5.2.2 + transitivePeerDependencies: + - supports-color + dev: false + + /@typescript-eslint/types@5.59.11: + resolution: {integrity: sha512-epoN6R6tkvBYSc+cllrz+c2sOFWkbisJZWkOE+y3xHtvYaOE6Wk6B8e114McRJwFRjGvYdJwLXQH5c9osME/AA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: false + + /@typescript-eslint/types@6.9.1: + resolution: {integrity: sha512-BUGslGOb14zUHOUmDB2FfT6SI1CcZEJYfF3qFwBeUrU6srJfzANonwRYHDpLBuzbq3HaoF2XL2hcr01c8f8OaQ==} + engines: {node: ^16.0.0 || >=18.0.0} + + /@typescript-eslint/typescript-estree@5.59.11(typescript@5.2.2): + resolution: {integrity: sha512-YupOpot5hJO0maupJXixi6l5ETdrITxeo5eBOeuV7RSKgYdU3G5cxO49/9WRnJq9EMrB7AuTSLH/bqOsXi7wPA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 5.59.11 + '@typescript-eslint/visitor-keys': 5.59.11 + debug: 4.3.4(supports-color@8.1.1) + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.5.4 + tsutils: 3.21.0(typescript@5.2.2) + typescript: 5.2.2 + transitivePeerDependencies: + - supports-color + dev: false + + /@typescript-eslint/typescript-estree@6.9.1(typescript@5.2.2): + resolution: {integrity: sha512-U+mUylTHfcqeO7mLWVQ5W/tMLXqVpRv61wm9ZtfE5egz7gtnmqVIw9ryh0mgIlkKk9rZLY3UHygsBSdB9/ftyw==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 6.9.1 + '@typescript-eslint/visitor-keys': 6.9.1 + debug: 4.3.4(supports-color@8.1.1) + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.5.4 + ts-api-utils: 1.0.3(typescript@5.2.2) + typescript: 5.2.2 + transitivePeerDependencies: + - supports-color + + /@typescript-eslint/utils@5.59.11(eslint@8.52.0)(typescript@5.2.2): + resolution: {integrity: sha512-didu2rHSOMUdJThLk4aZ1Or8IcO3HzCw/ZvEjTTIfjIrcdd5cvSIwwDy2AOlE7htSNp7QIZ10fLMyRCveesMLg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.52.0) + '@types/json-schema': 7.0.14 + '@types/semver': 7.5.4 + '@typescript-eslint/scope-manager': 5.59.11 + '@typescript-eslint/types': 5.59.11 + '@typescript-eslint/typescript-estree': 5.59.11(typescript@5.2.2) + eslint: 8.52.0 + eslint-scope: 5.1.1 + semver: 7.5.4 + transitivePeerDependencies: + - supports-color + - typescript + dev: false + + /@typescript-eslint/utils@6.9.1(eslint@8.52.0)(typescript@5.2.2): + resolution: {integrity: sha512-L1T0A5nFdQrMVunpZgzqPL6y2wVreSyHhKGZryS6jrEN7bD9NplVAyMryUhXsQ4TWLnZmxc2ekar/lSGIlprCA==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.52.0) + '@types/json-schema': 7.0.14 + '@types/semver': 7.5.4 + '@typescript-eslint/scope-manager': 6.9.1 + '@typescript-eslint/types': 6.9.1 + '@typescript-eslint/typescript-estree': 6.9.1(typescript@5.2.2) + eslint: 8.52.0 + semver: 7.5.4 + transitivePeerDependencies: + - supports-color + - typescript + dev: false + + /@typescript-eslint/visitor-keys@5.59.11: + resolution: {integrity: sha512-KGYniTGG3AMTuKF9QBD7EIrvufkB6O6uX3knP73xbKLMpH+QRPcgnCxjWXSHjMRuOxFLovljqQgQpR0c7GvjoA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.59.11 + eslint-visitor-keys: 3.4.3 + dev: false + + /@typescript-eslint/visitor-keys@6.9.1: + resolution: {integrity: sha512-MUaPUe/QRLEffARsmNfmpghuQkW436DvESW+h+M52w0coICHRfD6Np9/K6PdACwnrq1HmuLl+cSPZaJmeVPkSw==} + engines: {node: ^16.0.0 || >=18.0.0} + dependencies: + '@typescript-eslint/types': 6.9.1 + eslint-visitor-keys: 3.4.3 + + /@typespec/compiler@0.41.0: + resolution: {integrity: sha512-JmSclmneBmWiv2+ROFBhAl69uylIdLVnElB3Xr/hHPza9mcMRz7HR0Zi2tvjATsvPkIUgcoUM/pVXLhNjKeMLw==} + engines: {node: '>=16.0.0'} + hasBin: true + dependencies: + '@babel/code-frame': 7.18.6 + ajv: 8.11.2 + change-case: 4.1.2 + globby: 13.1.4 + js-yaml: 4.1.0 + mkdirp: 1.0.4 + mustache: 4.2.0 + node-fetch: 3.3.2 + node-watch: 0.7.4 + picocolors: 1.0.0 + prettier: 2.8.8 + prompts: 2.4.2 + vscode-languageserver: 8.0.2 + vscode-languageserver-textdocument: 1.0.11 + yargs: 17.6.2 + dev: false + + /@typespec/compiler@0.42.0: + resolution: {integrity: sha512-eONMtlDQ5Bpge4lcprI06mnfW924bo23LVNNKTdC1/1g1iQWPGH2fNpstEomumzOvTNwINh3xKtwkJ5huckBUQ==} + engines: {node: '>=16.0.0'} + hasBin: true + dependencies: + '@babel/code-frame': 7.18.6 + ajv: 8.11.2 + change-case: 4.1.2 + globby: 13.1.4 + js-yaml: 4.1.0 + mkdirp: 1.0.4 + mustache: 4.2.0 + node-fetch: 3.3.2 + node-watch: 0.7.4 + picocolors: 1.0.0 + prettier: 2.8.8 + prompts: 2.4.2 + vscode-languageserver: 8.0.2 + vscode-languageserver-textdocument: 1.0.11 + yargs: 17.6.2 + dev: false + + /@ungap/structured-clone@1.2.0: + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + + /@vitejs/plugin-react@4.1.1(vite@4.5.0): + resolution: {integrity: sha512-Jie2HERK+uh27e+ORXXwEP5h0Y2lS9T2PRGbfebiHGlwzDO0dEnd2aNtOR/qjBlPb1YgxwAONeblL1xqLikLag==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.2.0 + dependencies: + '@babel/core': 7.23.2 + '@babel/plugin-transform-react-jsx-self': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-react-jsx-source': 7.22.5(@babel/core@7.23.2) + '@types/babel__core': 7.20.3 + react-refresh: 0.14.0 + vite: 4.5.0(@types/node@18.11.19) + transitivePeerDependencies: + - supports-color + + /@vscode/vsce@2.21.1: + resolution: {integrity: sha512-f45/aT+HTubfCU2oC7IaWnH9NjOWp668ML002QiFObFRVUCoLtcwepp9mmql/ArFUy+HCHp54Xrq4koTcOD6TA==} + engines: {node: '>= 14'} + hasBin: true + dependencies: + azure-devops-node-api: 11.2.0 + chalk: 2.4.2 + cheerio: 1.0.0-rc.12 + commander: 6.2.1 + glob: 7.2.3 + hosted-git-info: 4.1.0 + jsonc-parser: 3.2.0 + leven: 3.1.0 + markdown-it: 12.3.2 + mime: 1.6.0 + minimatch: 3.1.2 + parse-semver: 1.1.1 + read: 1.0.7 + semver: 7.5.4 + tmp: 0.2.1 + typed-rest-client: 1.8.11 + url-join: 4.0.1 + xml2js: 0.5.0 + yauzl: 2.10.0 + yazl: 2.5.1 + optionalDependencies: + keytar: 7.9.0 + dev: true + + /@webassemblyjs/ast@1.11.6: + resolution: {integrity: sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==} + dependencies: + '@webassemblyjs/helper-numbers': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + + /@webassemblyjs/floating-point-hex-parser@1.11.6: + resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} + + /@webassemblyjs/helper-api-error@1.11.6: + resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} + + /@webassemblyjs/helper-buffer@1.11.6: + resolution: {integrity: sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==} + + /@webassemblyjs/helper-numbers@1.11.6: + resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} + dependencies: + '@webassemblyjs/floating-point-hex-parser': 1.11.6 + '@webassemblyjs/helper-api-error': 1.11.6 + '@xtuc/long': 4.2.2 + + /@webassemblyjs/helper-wasm-bytecode@1.11.6: + resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} + + /@webassemblyjs/helper-wasm-section@1.11.6: + resolution: {integrity: sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-buffer': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/wasm-gen': 1.11.6 + + /@webassemblyjs/ieee754@1.11.6: + resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} + dependencies: + '@xtuc/ieee754': 1.2.0 + + /@webassemblyjs/leb128@1.11.6: + resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} + dependencies: + '@xtuc/long': 4.2.2 + + /@webassemblyjs/utf8@1.11.6: + resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} + + /@webassemblyjs/wasm-edit@1.11.6: + resolution: {integrity: sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-buffer': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/helper-wasm-section': 1.11.6 + '@webassemblyjs/wasm-gen': 1.11.6 + '@webassemblyjs/wasm-opt': 1.11.6 + '@webassemblyjs/wasm-parser': 1.11.6 + '@webassemblyjs/wast-printer': 1.11.6 + + /@webassemblyjs/wasm-gen@1.11.6: + resolution: {integrity: sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/ieee754': 1.11.6 + '@webassemblyjs/leb128': 1.11.6 + '@webassemblyjs/utf8': 1.11.6 + + /@webassemblyjs/wasm-opt@1.11.6: + resolution: {integrity: sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-buffer': 1.11.6 + '@webassemblyjs/wasm-gen': 1.11.6 + '@webassemblyjs/wasm-parser': 1.11.6 + + /@webassemblyjs/wasm-parser@1.11.6: + resolution: {integrity: sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-api-error': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/ieee754': 1.11.6 + '@webassemblyjs/leb128': 1.11.6 + '@webassemblyjs/utf8': 1.11.6 + + /@webassemblyjs/wast-printer@1.11.6: + resolution: {integrity: sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@xtuc/long': 4.2.2 + + /@xmldom/xmldom@0.8.10: + resolution: {integrity: sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==} + engines: {node: '>=10.0.0'} + dev: false + + /@xtuc/ieee754@1.2.0: + resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + + /@xtuc/long@4.2.2: + resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + + /@yarnpkg/lockfile@1.1.0: + resolution: {integrity: sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==} + dev: false + + /abab@2.0.6: + resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} + dev: true + + /abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + dependencies: + event-target-shim: 5.0.1 + dev: false + + /accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + dev: false + + /acorn-globals@6.0.0: + resolution: {integrity: sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==} + dependencies: + acorn: 7.4.1 + acorn-walk: 7.2.0 + dev: true + + /acorn-import-assertions@1.9.0(acorn@8.11.2): + resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} + peerDependencies: + acorn: ^8 + dependencies: + acorn: 8.11.2 + + /acorn-jsx@5.3.2(acorn@8.11.2): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.11.2 + + /acorn-walk@7.2.0: + resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} + engines: {node: '>=0.4.0'} + dev: true + + /acorn-walk@8.3.0: + resolution: {integrity: sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA==} + engines: {node: '>=0.4.0'} + dev: false + + /acorn@7.4.1: + resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /acorn@8.11.2: + resolution: {integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==} + engines: {node: '>=0.4.0'} + hasBin: true + + /address@1.2.2: + resolution: {integrity: sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==} + engines: {node: '>= 10.0.0'} + dev: false + + /agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + dependencies: + debug: 4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + + /aggregate-error@3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} + dependencies: + clean-stack: 2.2.0 + indent-string: 4.0.0 + dev: false + + /ajv-formats@2.1.1(ajv@8.12.0): + resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + dependencies: + ajv: 8.12.0 + + /ajv-keywords@3.5.2(ajv@6.12.6): + resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + peerDependencies: + ajv: ^6.9.1 + dependencies: + ajv: 6.12.6 + + /ajv-keywords@5.1.0(ajv@8.12.0): + resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} + peerDependencies: + ajv: ^8.8.2 + dependencies: + ajv: 8.12.0 + fast-deep-equal: 3.1.3 + dev: false + + /ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + /ajv@8.11.2: + resolution: {integrity: sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg==} + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + dev: false + + /ajv@8.12.0: + resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + + /ajv@8.9.0: + resolution: {integrity: sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==} + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + dev: false + + /algoliasearch-helper@3.15.0(algoliasearch@4.20.0): + resolution: {integrity: sha512-DGUnK3TGtDQsaUE4ayF/LjSN0DGsuYThB8WBgnnDY0Wq04K6lNVruO3LfqJOgSfDiezp+Iyt8Tj4YKHi+/ivSA==} + peerDependencies: + algoliasearch: '>= 3.1 < 6' + dependencies: + '@algolia/events': 4.0.1 + algoliasearch: 4.20.0 + dev: false + + /algoliasearch@4.20.0: + resolution: {integrity: sha512-y+UHEjnOItoNy0bYO+WWmLWBlPwDjKHW6mNHrPi0NkuhpQOOEbrkwQH/wgKFDLh7qlKjzoKeiRtlpewDPDG23g==} + dependencies: + '@algolia/cache-browser-local-storage': 4.20.0 + '@algolia/cache-common': 4.20.0 + '@algolia/cache-in-memory': 4.20.0 + '@algolia/client-account': 4.20.0 + '@algolia/client-analytics': 4.20.0 + '@algolia/client-common': 4.20.0 + '@algolia/client-personalization': 4.20.0 + '@algolia/client-search': 4.20.0 + '@algolia/logger-common': 4.20.0 + '@algolia/logger-console': 4.20.0 + '@algolia/requester-browser-xhr': 4.20.0 + '@algolia/requester-common': 4.20.0 + '@algolia/requester-node-http': 4.20.0 + '@algolia/transporter': 4.20.0 + dev: false + + /ansi-align@3.0.1: + resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + dependencies: + string-width: 4.2.3 + dev: false + + /ansi-colors@4.1.1: + resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} + engines: {node: '>=6'} + dev: true + + /ansi-html-community@0.0.8: + resolution: {integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==} + engines: {'0': node >= 0.8.0} + hasBin: true + dev: false + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + /ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + + /ansi-sequence-parser@1.1.1: + resolution: {integrity: sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg==} + dev: true + + /ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + + /ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + /arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + dev: false + + /argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + dependencies: + sprintf-js: 1.0.3 + + /argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + /array-back@3.1.0: + resolution: {integrity: sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==} + engines: {node: '>=6'} + dev: true + + /array-back@4.0.2: + resolution: {integrity: sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==} + engines: {node: '>=8'} + dev: true + + /array-flatten@1.1.1: + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + dev: false + + /array-flatten@2.1.2: + resolution: {integrity: sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==} + dev: false + + /array-timsort@1.0.3: + resolution: {integrity: sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==} + dev: false + + /array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + /asap@2.0.6: + resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + dev: false + + /astring@1.8.6: + resolution: {integrity: sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==} + hasBin: true + dev: false + + /asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + /at-least-node@1.0.0: + resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} + engines: {node: '>= 4.0.0'} + dev: false + + /autolinker@3.16.2: + resolution: {integrity: sha512-JiYl7j2Z19F9NdTmirENSUUIIL/9MytEWtmzhfmsKPCp9E+G35Y0UNCMoM9tFigxT59qSc8Ml2dlZXOCVTYwuA==} + dependencies: + tslib: 2.6.2 + dev: false + + /autoprefixer@10.4.16(postcss@8.4.31): + resolution: {integrity: sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + dependencies: + browserslist: 4.22.1 + caniuse-lite: 1.0.30001559 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.0.0 + postcss: 8.4.31 + postcss-value-parser: 4.2.0 + dev: false + + /autorest@3.3.2: + resolution: {integrity: sha512-Tj2Jyz57tMt/KIJK3NaQI13hzUBXZ3N9OmkVZfLU2vrYh1SEaxvdWCLkwWt883E5YlzasRXdbSkrMz86lzHnPA==} + engines: {node: '>=12.0.0'} + hasBin: true + requiresBuild: true + dev: true + + /axios@0.27.2: + resolution: {integrity: sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==} + dependencies: + follow-redirects: 1.15.3 + form-data: 4.0.0 + transitivePeerDependencies: + - debug + dev: false + + /axios@1.6.0: + resolution: {integrity: sha512-EZ1DYihju9pwVB+jg67ogm+Tmqc6JmhamRN6I4Zt8DfZu5lbcQGw3ozH9lFejSJgs/ibaef3A9PMXPLeefFGJg==} + dependencies: + follow-redirects: 1.15.3 + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + dev: false + + /azure-devops-node-api@11.2.0: + resolution: {integrity: sha512-XdiGPhrpaT5J8wdERRKs5g8E0Zy1pvOYTli7z9E8nmOn3YGp4FhtjhrOyFmX/8veWCwdI69mCHKJw6l+4J/bHA==} + dependencies: + tunnel: 0.0.6 + typed-rest-client: 1.8.11 + dev: true + + /babel-loader@9.1.3(@babel/core@7.23.2)(webpack@5.89.0): + resolution: {integrity: sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==} + engines: {node: '>= 14.15.0'} + peerDependencies: + '@babel/core': ^7.12.0 + webpack: '>=5' + dependencies: + '@babel/core': 7.23.2 + find-cache-dir: 4.0.0 + schema-utils: 4.2.0 + webpack: 5.89.0(@swc/core@1.3.95) + dev: false + + /babel-plugin-dynamic-import-node@2.3.3: + resolution: {integrity: sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==} + dependencies: + object.assign: 4.1.4 + dev: false + + /babel-plugin-macros@3.1.0: + resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} + engines: {node: '>=10', npm: '>=6'} + dependencies: + '@babel/runtime': 7.23.2 + cosmiconfig: 7.1.0 + resolve: 1.22.8 + dev: false + + /babel-plugin-polyfill-corejs2@0.4.6(@babel/core@7.23.2): + resolution: {integrity: sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/compat-data': 7.23.2 + '@babel/core': 7.23.2 + '@babel/helper-define-polyfill-provider': 0.4.3(@babel/core@7.23.2) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: false + + /babel-plugin-polyfill-corejs3@0.8.6(@babel/core@7.23.2): + resolution: {integrity: sha512-leDIc4l4tUgU7str5BWLS2h8q2N4Nf6lGZP6UrNDxdtfF2g69eJ5L0H7S8A5Ln/arfFAfHor5InAdZuIOwZdgQ==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-define-polyfill-provider': 0.4.3(@babel/core@7.23.2) + core-js-compat: 3.33.2 + transitivePeerDependencies: + - supports-color + dev: false + + /babel-plugin-polyfill-regenerator@0.5.3(@babel/core@7.23.2): + resolution: {integrity: sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-define-polyfill-provider': 0.4.3(@babel/core@7.23.2) + transitivePeerDependencies: + - supports-color + dev: false + + /bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + dev: false + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + /base16@1.0.0: + resolution: {integrity: sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ==} + dev: false + + /base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + /batch@0.6.1: + resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} + dev: false + + /big-integer@1.6.51: + resolution: {integrity: sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==} + engines: {node: '>=0.6'} + dev: false + + /big.js@5.2.2: + resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} + + /binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + + /bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + requiresBuild: true + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + optional: true + + /body-parser@1.20.1: + resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.11.0 + raw-body: 2.5.1 + type-is: 1.6.18 + unpipe: 1.0.0 + dev: false + + /bonjour-service@1.1.1: + resolution: {integrity: sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg==} + dependencies: + array-flatten: 2.1.2 + dns-equal: 1.0.0 + fast-deep-equal: 3.1.3 + multicast-dns: 7.2.5 + dev: false + + /boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + + /boxen@6.2.1: + resolution: {integrity: sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + ansi-align: 3.0.1 + camelcase: 6.3.0 + chalk: 4.1.2 + cli-boxes: 3.0.0 + string-width: 5.1.2 + type-fest: 2.19.0 + widest-line: 4.0.1 + wrap-ansi: 8.1.0 + dev: false + + /boxen@7.1.1: + resolution: {integrity: sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==} + engines: {node: '>=14.16'} + dependencies: + ansi-align: 3.0.1 + camelcase: 7.0.1 + chalk: 5.3.0 + cli-boxes: 3.0.0 + string-width: 5.1.2 + type-fest: 2.19.0 + widest-line: 4.0.1 + wrap-ansi: 8.1.0 + dev: false + + /bplist-parser@0.2.0: + resolution: {integrity: sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==} + engines: {node: '>= 5.10.0'} + dependencies: + big-integer: 1.6.51 + dev: false + + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + /brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + dependencies: + balanced-match: 1.0.2 + + /braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + + /browser-process-hrtime@1.0.0: + resolution: {integrity: sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==} + dev: true + + /browser-stdout@1.3.1: + resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} + dev: true + + /browserslist@4.22.1: + resolution: {integrity: sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001559 + electron-to-chromium: 1.4.574 + node-releases: 2.0.13 + update-browserslist-db: 1.0.13(browserslist@4.22.1) + + /buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + dev: true + + /buffer-equal-constant-time@1.0.1: + resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} + dev: false + + /buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + /buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + requiresBuild: true + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + optional: true + + /buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: false + + /builtin-modules@3.3.0: + resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} + engines: {node: '>=6'} + + /bundle-name@3.0.0: + resolution: {integrity: sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==} + engines: {node: '>=12'} + dependencies: + run-applescript: 5.0.0 + dev: false + + /bytes@3.0.0: + resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} + engines: {node: '>= 0.8'} + dev: false + + /bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + dev: false + + /c8@8.0.1: + resolution: {integrity: sha512-EINpopxZNH1mETuI0DzRA4MZpAUH+IFiRhnmFD3vFr3vdrgxqi3VfE3KL0AIL+zDq8rC9bZqwM/VDmmoe04y7w==} + engines: {node: '>=12'} + hasBin: true + dependencies: + '@bcoe/v8-coverage': 0.2.3 + '@istanbuljs/schema': 0.1.3 + find-up: 5.0.0 + foreground-child: 2.0.0 + istanbul-lib-coverage: 3.2.0 + istanbul-lib-report: 3.0.1 + istanbul-reports: 3.1.6 + rimraf: 3.0.2 + test-exclude: 6.0.0 + v8-to-istanbul: 9.1.3 + yargs: 17.7.2 + yargs-parser: 21.1.1 + dev: true + + /cacheable-lookup@7.0.0: + resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==} + engines: {node: '>=14.16'} + dev: false + + /cacheable-request@10.2.14: + resolution: {integrity: sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==} + engines: {node: '>=14.16'} + dependencies: + '@types/http-cache-semantics': 4.0.3 + get-stream: 6.0.1 + http-cache-semantics: 4.1.1 + keyv: 4.5.4 + mimic-response: 4.0.0 + normalize-url: 8.0.0 + responselike: 3.0.0 + dev: false + + /call-bind@1.0.5: + resolution: {integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==} + dependencies: + function-bind: 1.1.2 + get-intrinsic: 1.2.2 + set-function-length: 1.1.1 + + /callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + /camel-case@4.1.2: + resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} + dependencies: + pascal-case: 3.1.2 + tslib: 2.6.2 + + /camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + + /camelcase@7.0.1: + resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} + engines: {node: '>=14.16'} + dev: false + + /caniuse-api@3.0.0: + resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} + dependencies: + browserslist: 4.22.1 + caniuse-lite: 1.0.30001559 + lodash.memoize: 4.1.2 + lodash.uniq: 4.5.0 + + /caniuse-lite@1.0.30001559: + resolution: {integrity: sha512-cPiMKZgqgkg5LY3/ntGeLFUpi6tzddBNS58A4tnTgQw1zON7u2sZMU7SzOeVH4tj20++9ggL+V6FDOFMTaFFYA==} + + /capital-case@1.0.4: + resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==} + dependencies: + no-case: 3.0.4 + tslib: 2.6.2 + upper-case-first: 2.0.2 + + /ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + dev: false + + /chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + /chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + dev: false + + /change-case@4.1.2: + resolution: {integrity: sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==} + dependencies: + camel-case: 4.1.2 + capital-case: 1.0.4 + constant-case: 3.0.4 + dot-case: 3.0.4 + header-case: 2.0.4 + no-case: 3.0.4 + param-case: 3.0.4 + pascal-case: 3.1.2 + path-case: 3.0.4 + sentence-case: 3.0.4 + snake-case: 3.0.4 + tslib: 2.6.2 + + /char-regex@1.0.2: + resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} + engines: {node: '>=10'} + dev: false + + /character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + dev: false + + /character-entities-legacy@1.1.4: + resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==} + dev: false + + /character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + dev: false + + /character-entities@1.2.4: + resolution: {integrity: sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==} + dev: false + + /character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + + /character-reference-invalid@1.1.4: + resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==} + dev: false + + /character-reference-invalid@2.0.1: + resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + dev: false + + /charenc@0.0.2: + resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} + dev: true + + /cheerio-select@2.1.0: + resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} + dependencies: + boolbase: 1.0.0 + css-select: 5.1.0 + css-what: 6.1.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.1.0 + + /cheerio@1.0.0-rc.12: + resolution: {integrity: sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==} + engines: {node: '>= 6'} + dependencies: + cheerio-select: 2.1.0 + dom-serializer: 2.0.0 + domhandler: 5.0.3 + domutils: 3.1.0 + htmlparser2: 8.0.2 + parse5: 7.1.2 + parse5-htmlparser2-tree-adapter: 7.0.0 + + /chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + /chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + requiresBuild: true + optional: true + + /chrome-trace-event@1.0.3: + resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} + engines: {node: '>=6.0'} + + /ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + dev: false + + /classnames@2.3.2: + resolution: {integrity: sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==} + dev: false + + /clean-css@5.3.2: + resolution: {integrity: sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww==} + engines: {node: '>= 10.0'} + dependencies: + source-map: 0.6.1 + dev: false + + /clean-regexp@1.0.0: + resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} + engines: {node: '>=4'} + dependencies: + escape-string-regexp: 1.0.5 + dev: false + + /clean-stack@2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} + dev: false + + /clear-module@4.1.2: + resolution: {integrity: sha512-LWAxzHqdHsAZlPlEyJ2Poz6AIs384mPeqLVCru2p0BrP9G/kVGuhNyZYClLO6cXlnuJjzC8xtsJIuMjKqLXoAw==} + engines: {node: '>=8'} + dependencies: + parent-module: 2.0.0 + resolve-from: 5.0.0 + dev: false + + /cli-boxes@3.0.0: + resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} + engines: {node: '>=10'} + dev: false + + /cli-table3@0.6.3: + resolution: {integrity: sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==} + engines: {node: 10.* || >= 12.*} + dependencies: + string-width: 4.2.3 + optionalDependencies: + '@colors/colors': 1.5.0 + dev: false + + /cliui@7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + /cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + /clone-deep@4.0.1: + resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} + engines: {node: '>=6'} + dependencies: + is-plain-object: 2.0.4 + kind-of: 6.0.3 + shallow-clone: 3.0.1 + + /clsx@1.2.1: + resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==} + engines: {node: '>=6'} + dev: false + + /clsx@2.0.0: + resolution: {integrity: sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==} + engines: {node: '>=6'} + dev: false + + /collapse-white-space@2.1.0: + resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==} + dev: false + + /color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + + /color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + /colord@2.9.3: + resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} + + /colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + dev: false + + /combine-promises@1.2.0: + resolution: {integrity: sha512-VcQB1ziGD0NXrhKxiwyNbCDmRzs/OShMs2GqW2DlU2A/Sd0nQxE1oWDAE5O0ygSx5mgQOn9eIFh7yKPgFRVkPQ==} + engines: {node: '>=10'} + dev: false + + /combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + dependencies: + delayed-stream: 1.0.0 + + /comma-separated-tokens@1.0.8: + resolution: {integrity: sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==} + dev: false + + /comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + dev: false + + /command-line-args@5.2.1: + resolution: {integrity: sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==} + engines: {node: '>=4.0.0'} + dependencies: + array-back: 3.1.0 + find-replace: 3.0.0 + lodash.camelcase: 4.3.0 + typical: 4.0.0 + dev: true + + /command-line-usage@6.1.3: + resolution: {integrity: sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==} + engines: {node: '>=8.0.0'} + dependencies: + array-back: 4.0.2 + chalk: 2.4.2 + table-layout: 1.0.2 + typical: 5.2.0 + dev: true + + /commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + dev: false + + /commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + /commander@5.1.0: + resolution: {integrity: sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==} + engines: {node: '>= 6'} + + /commander@6.2.1: + resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==} + engines: {node: '>= 6'} + dev: true + + /commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + + /commander@8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + dev: false + + /comment-json@4.2.3: + resolution: {integrity: sha512-SsxdiOf064DWoZLH799Ata6u7iV658A11PlWtZATDlXPpKGJnbJZ5Z24ybixAi+LUUqJ/GKowAejtC5GFUG7Tw==} + engines: {node: '>= 6'} + dependencies: + array-timsort: 1.0.3 + core-util-is: 1.0.3 + esprima: 4.0.1 + has-own-prop: 2.0.0 + repeat-string: 1.6.1 + dev: false + + /common-path-prefix@3.0.0: + resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==} + dev: false + + /commondir@1.0.1: + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + + /compressible@2.0.18: + resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + dev: false + + /compression@1.7.4: + resolution: {integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==} + engines: {node: '>= 0.8.0'} + dependencies: + accepts: 1.3.8 + bytes: 3.0.0 + compressible: 2.0.18 + debug: 2.6.9 + on-headers: 1.0.2 + safe-buffer: 5.1.2 + vary: 1.1.2 + dev: false + + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + /concat-with-sourcemaps@1.1.0: + resolution: {integrity: sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==} + dependencies: + source-map: 0.6.1 + dev: true + + /config-chain@1.1.13: + resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} + dependencies: + ini: 1.3.8 + proto-list: 1.2.4 + dev: false + + /configstore@5.0.1: + resolution: {integrity: sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==} + engines: {node: '>=8'} + dependencies: + dot-prop: 5.3.0 + graceful-fs: 4.2.11 + make-dir: 3.1.0 + unique-string: 2.0.0 + write-file-atomic: 3.0.3 + xdg-basedir: 4.0.0 + dev: false + + /configstore@6.0.0: + resolution: {integrity: sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==} + engines: {node: '>=12'} + dependencies: + dot-prop: 6.0.1 + graceful-fs: 4.2.11 + unique-string: 3.0.0 + write-file-atomic: 3.0.3 + xdg-basedir: 5.1.0 + dev: false + + /connect-history-api-fallback@2.0.0: + resolution: {integrity: sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==} + engines: {node: '>=0.8'} + dev: false + + /consola@2.15.3: + resolution: {integrity: sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==} + dev: false + + /constant-case@3.0.4: + resolution: {integrity: sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==} + dependencies: + no-case: 3.0.4 + tslib: 2.6.2 + upper-case: 2.0.2 + + /content-disposition@0.5.2: + resolution: {integrity: sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==} + engines: {node: '>= 0.6'} + dev: false + + /content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + dependencies: + safe-buffer: 5.2.1 + dev: false + + /content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + dev: false + + /convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + dev: false + + /convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + /cookie-signature@1.0.6: + resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + dev: false + + /cookie@0.5.0: + resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} + engines: {node: '>= 0.6'} + dev: false + + /copy-text-to-clipboard@3.2.0: + resolution: {integrity: sha512-RnJFp1XR/LOBDckxTib5Qjr/PMfkatD0MUCQgdpqS8MdKiNUzBjAQBEN6oUy+jW7LI93BBG3DtMB2KOOKpGs2Q==} + engines: {node: '>=12'} + dev: false + + /copy-to-clipboard@3.3.3: + resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==} + dependencies: + toggle-selection: 1.0.6 + dev: false + + /copy-webpack-plugin@11.0.0(webpack@5.89.0): + resolution: {integrity: sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==} + engines: {node: '>= 14.15.0'} + peerDependencies: + webpack: ^5.1.0 + dependencies: + fast-glob: 3.3.1 + glob-parent: 6.0.2 + globby: 13.2.2 + normalize-path: 3.0.0 + schema-utils: 4.2.0 + serialize-javascript: 6.0.1 + webpack: 5.89.0(@swc/core@1.3.95) + dev: false + + /copyfiles@2.4.1: + resolution: {integrity: sha512-fereAvAvxDrQDOXybk3Qu3dPbOoKoysFMWtkY3mv5BsL8//OSZVL5DCLYqgRfY5cWirgRzlC+WSrxp6Bo3eNZg==} + hasBin: true + dependencies: + glob: 7.2.3 + minimatch: 3.1.2 + mkdirp: 1.0.4 + noms: 0.0.0 + through2: 2.0.5 + untildify: 4.0.0 + yargs: 16.2.0 + dev: true + + /core-js-compat@3.33.2: + resolution: {integrity: sha512-axfo+wxFVxnqf8RvxTzoAlzW4gRoacrHeoFlc9n0x50+7BEyZL/Rt3hicaED1/CEd7I6tPCPVUYcJwCMO5XUYw==} + dependencies: + browserslist: 4.22.1 + dev: false + + /core-js-pure@3.33.2: + resolution: {integrity: sha512-a8zeCdyVk7uF2elKIGz67AjcXOxjRbwOLz8SbklEso1V+2DoW4OkAMZN9S9GBgvZIaqQi/OemFX4OiSoQEmg1Q==} + requiresBuild: true + dev: false + + /core-js@3.33.2: + resolution: {integrity: sha512-XeBzWI6QL3nJQiHmdzbAOiMYqjrb7hwU7A39Qhvd/POSa/t9E1AeZyEZx3fNvp/vtM8zXwhoL0FsiS0hD0pruQ==} + requiresBuild: true + dev: false + + /core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + /cose-base@1.0.3: + resolution: {integrity: sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==} + dependencies: + layout-base: 1.0.2 + + /cose-base@2.2.0: + resolution: {integrity: sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==} + dependencies: + layout-base: 2.0.1 + + /cosmiconfig@6.0.0: + resolution: {integrity: sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==} + engines: {node: '>=8'} + dependencies: + '@types/parse-json': 4.0.1 + import-fresh: 3.3.0 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.2 + dev: false + + /cosmiconfig@7.1.0: + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} + engines: {node: '>=10'} + dependencies: + '@types/parse-json': 4.0.1 + import-fresh: 3.3.0 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.2 + dev: false + + /cosmiconfig@8.0.0: + resolution: {integrity: sha512-da1EafcpH6b/TD8vDRaWV7xFINlHlF6zKsGwS1TsuVJTZRkquaS5HTMq7uq6h31619QjbsYl21gVDOm32KM1vQ==} + engines: {node: '>=14'} + dependencies: + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + path-type: 4.0.0 + dev: false + + /cosmiconfig@8.3.6(typescript@5.2.2): + resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + path-type: 4.0.0 + typescript: 5.2.2 + dev: false + + /cross-env@7.0.3: + resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} + engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} + hasBin: true + dependencies: + cross-spawn: 7.0.3 + dev: true + + /cross-fetch@3.1.8: + resolution: {integrity: sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==} + dependencies: + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + dev: false + + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + /crypt@0.0.2: + resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} + dev: true + + /crypto-random-string@2.0.0: + resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} + engines: {node: '>=8'} + dev: false + + /crypto-random-string@4.0.0: + resolution: {integrity: sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==} + engines: {node: '>=12'} + dependencies: + type-fest: 1.4.0 + dev: false + + /cspell-dictionary@6.31.3: + resolution: {integrity: sha512-3w5P3Md/tbHLVGPKVL0ePl1ObmNwhdDiEuZ2TXfm2oAIwg4aqeIrw42A2qmhaKLcuAIywpqGZsrGg8TviNNhig==} + engines: {node: '>=14'} + dependencies: + '@cspell/cspell-pipe': 6.31.3 + '@cspell/cspell-types': 6.31.3 + cspell-trie-lib: 6.31.3 + fast-equals: 4.0.3 + gensequence: 5.0.2 + dev: false + + /cspell-gitignore@6.31.3: + resolution: {integrity: sha512-vCfVG4ZrdwJnsZHl/cdp8AY+YNPL3Ga+0KR9XJsaz69EkQpgI6porEqehuwle7hiXw5e3L7xFwNEbpCBlxgLRA==} + engines: {node: '>=14'} + hasBin: true + dependencies: + cspell-glob: 6.31.3 + find-up: 5.0.0 + dev: false + + /cspell-glob@6.31.3: + resolution: {integrity: sha512-+koUJPSCOittQwhR0T1mj4xXT3N+ZnY2qQ53W6Gz9HY3hVfEEy0NpbwE/Uy7sIvFMbc426fK0tGXjXyIj72uhQ==} + engines: {node: '>=14'} + dependencies: + micromatch: 4.0.5 + dev: false + + /cspell-grammar@6.31.3: + resolution: {integrity: sha512-TZYaOLIGAumyHlm4w7HYKKKcR1ZgEMKt7WNjCFqq7yGVW7U+qyjQqR8jqnLiUTZl7c2Tque4mca7n0CFsjVv5A==} + engines: {node: '>=14'} + hasBin: true + dependencies: + '@cspell/cspell-pipe': 6.31.3 + '@cspell/cspell-types': 6.31.3 + dev: false + + /cspell-io@6.31.3: + resolution: {integrity: sha512-yCnnQ5bTbngUuIAaT5yNSdI1P0Kc38uvC8aynNi7tfrCYOQbDu1F9/DcTpbdhrsCv+xUn2TB1YjuCmm0STfJlA==} + engines: {node: '>=14'} + dependencies: + '@cspell/cspell-service-bus': 6.31.3 + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + dev: false + + /cspell-lib@6.31.3: + resolution: {integrity: sha512-Dv55aecaMvT/5VbNryKo0Zos8dtHon7e1K0z8DR4/kGZdQVT0bOFWeotSLhuaIqoNFdEt8ypfKbrIHIdbgt1Hg==} + engines: {node: '>=14.6'} + dependencies: + '@cspell/cspell-bundled-dicts': 6.31.3 + '@cspell/cspell-pipe': 6.31.3 + '@cspell/cspell-types': 6.31.3 + '@cspell/strong-weak-map': 6.31.3 + clear-module: 4.1.2 + comment-json: 4.2.3 + configstore: 5.0.1 + cosmiconfig: 8.0.0 + cspell-dictionary: 6.31.3 + cspell-glob: 6.31.3 + cspell-grammar: 6.31.3 + cspell-io: 6.31.3 + cspell-trie-lib: 6.31.3 + fast-equals: 4.0.3 + find-up: 5.0.0 + gensequence: 5.0.2 + import-fresh: 3.3.0 + resolve-from: 5.0.0 + resolve-global: 1.0.0 + vscode-languageserver-textdocument: 1.0.11 + vscode-uri: 3.0.8 + transitivePeerDependencies: + - encoding + dev: false + + /cspell-trie-lib@6.31.3: + resolution: {integrity: sha512-HNUcLWOZAvtM3E34U+7/mSSpO0F6nLd/kFlRIcvSvPb9taqKe8bnSa0Yyb3dsdMq9rMxUmuDQtF+J6arZK343g==} + engines: {node: '>=14'} + dependencies: + '@cspell/cspell-pipe': 6.31.3 + '@cspell/cspell-types': 6.31.3 + gensequence: 5.0.2 + dev: false + + /cspell@6.31.3: + resolution: {integrity: sha512-VeeShDLWVM6YPiU/imeGy0lmg6ki63tbLEa6hz20BExhzzpmINOP5nSTYtpY0H9zX9TrF/dLbI38TuuYnyG3Uw==} + engines: {node: '>=14'} + hasBin: true + dependencies: + '@cspell/cspell-json-reporter': 6.31.3 + '@cspell/cspell-pipe': 6.31.3 + '@cspell/cspell-types': 6.31.3 + '@cspell/dynamic-import': 6.31.3 + chalk: 4.1.2 + commander: 10.0.1 + cspell-gitignore: 6.31.3 + cspell-glob: 6.31.3 + cspell-io: 6.31.3 + cspell-lib: 6.31.3 + fast-glob: 3.3.1 + fast-json-stable-stringify: 2.1.0 + file-entry-cache: 6.0.1 + get-stdin: 8.0.0 + imurmurhash: 0.1.4 + semver: 7.5.4 + strip-ansi: 6.0.1 + vscode-uri: 3.0.8 + transitivePeerDependencies: + - encoding + dev: false + + /css-declaration-sorter@6.4.1(postcss@8.4.31): + resolution: {integrity: sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==} + engines: {node: ^10 || ^12 || >=14} + peerDependencies: + postcss: ^8.0.9 + dependencies: + postcss: 8.4.31 + + /css-loader@6.8.1(webpack@5.89.0): + resolution: {integrity: sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g==} + engines: {node: '>= 12.13.0'} + peerDependencies: + webpack: ^5.0.0 + dependencies: + icss-utils: 5.1.0(postcss@8.4.31) + postcss: 8.4.31 + postcss-modules-extract-imports: 3.0.0(postcss@8.4.31) + postcss-modules-local-by-default: 4.0.3(postcss@8.4.31) + postcss-modules-scope: 3.0.0(postcss@8.4.31) + postcss-modules-values: 4.0.0(postcss@8.4.31) + postcss-value-parser: 4.2.0 + semver: 7.5.4 + webpack: 5.89.0(@swc/core@1.3.95) + dev: false + + /css-minimizer-webpack-plugin@4.2.2(clean-css@5.3.2)(webpack@5.89.0): + resolution: {integrity: sha512-s3Of/4jKfw1Hj9CxEO1E5oXhQAxlayuHO2y/ML+C6I9sQ7FdzfEV6QgMLN3vI+qFsjJGIAFLKtQK7t8BOXAIyA==} + engines: {node: '>= 14.15.0'} + peerDependencies: + '@parcel/css': '*' + '@swc/css': '*' + clean-css: '*' + csso: '*' + esbuild: '*' + lightningcss: '*' + webpack: ^5.0.0 + peerDependenciesMeta: + '@parcel/css': + optional: true + '@swc/css': + optional: true + clean-css: + optional: true + csso: + optional: true + esbuild: + optional: true + lightningcss: + optional: true + dependencies: + clean-css: 5.3.2 + cssnano: 5.1.15(postcss@8.4.31) + jest-worker: 29.7.0 + postcss: 8.4.31 + schema-utils: 4.2.0 + serialize-javascript: 6.0.1 + source-map: 0.6.1 + webpack: 5.89.0(@swc/core@1.3.95) + dev: false + + /css-select@4.3.0: + resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} + dependencies: + boolbase: 1.0.0 + css-what: 6.1.0 + domhandler: 4.3.1 + domutils: 2.8.0 + nth-check: 2.1.1 + + /css-select@5.1.0: + resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} + dependencies: + boolbase: 1.0.0 + css-what: 6.1.0 + domhandler: 5.0.3 + domutils: 3.1.0 + nth-check: 2.1.1 + + /css-tree@1.1.3: + resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==} + engines: {node: '>=8.0.0'} + dependencies: + mdn-data: 2.0.14 + source-map: 0.6.1 + + /css-what@6.1.0: + resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} + engines: {node: '>= 6'} + + /css.escape@1.5.1: + resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} + dev: false + + /cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + /cssnano-preset-advanced@5.3.10(postcss@8.4.31): + resolution: {integrity: sha512-fnYJyCS9jgMU+cmHO1rPSPf9axbQyD7iUhLO5Df6O4G+fKIOMps+ZbU0PdGFejFBBZ3Pftf18fn1eG7MAPUSWQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + autoprefixer: 10.4.16(postcss@8.4.31) + cssnano-preset-default: 5.2.14(postcss@8.4.31) + postcss: 8.4.31 + postcss-discard-unused: 5.1.0(postcss@8.4.31) + postcss-merge-idents: 5.1.1(postcss@8.4.31) + postcss-reduce-idents: 5.2.0(postcss@8.4.31) + postcss-zindex: 5.1.0(postcss@8.4.31) + dev: false + + /cssnano-preset-default@5.2.14(postcss@8.4.31): + resolution: {integrity: sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + css-declaration-sorter: 6.4.1(postcss@8.4.31) + cssnano-utils: 3.1.0(postcss@8.4.31) + postcss: 8.4.31 + postcss-calc: 8.2.4(postcss@8.4.31) + postcss-colormin: 5.3.1(postcss@8.4.31) + postcss-convert-values: 5.1.3(postcss@8.4.31) + postcss-discard-comments: 5.1.2(postcss@8.4.31) + postcss-discard-duplicates: 5.1.0(postcss@8.4.31) + postcss-discard-empty: 5.1.1(postcss@8.4.31) + postcss-discard-overridden: 5.1.0(postcss@8.4.31) + postcss-merge-longhand: 5.1.7(postcss@8.4.31) + postcss-merge-rules: 5.1.4(postcss@8.4.31) + postcss-minify-font-values: 5.1.0(postcss@8.4.31) + postcss-minify-gradients: 5.1.1(postcss@8.4.31) + postcss-minify-params: 5.1.4(postcss@8.4.31) + postcss-minify-selectors: 5.2.1(postcss@8.4.31) + postcss-normalize-charset: 5.1.0(postcss@8.4.31) + postcss-normalize-display-values: 5.1.0(postcss@8.4.31) + postcss-normalize-positions: 5.1.1(postcss@8.4.31) + postcss-normalize-repeat-style: 5.1.1(postcss@8.4.31) + postcss-normalize-string: 5.1.0(postcss@8.4.31) + postcss-normalize-timing-functions: 5.1.0(postcss@8.4.31) + postcss-normalize-unicode: 5.1.1(postcss@8.4.31) + postcss-normalize-url: 5.1.0(postcss@8.4.31) + postcss-normalize-whitespace: 5.1.1(postcss@8.4.31) + postcss-ordered-values: 5.1.3(postcss@8.4.31) + postcss-reduce-initial: 5.1.2(postcss@8.4.31) + postcss-reduce-transforms: 5.1.0(postcss@8.4.31) + postcss-svgo: 5.1.0(postcss@8.4.31) + postcss-unique-selectors: 5.1.1(postcss@8.4.31) + + /cssnano-utils@3.1.0(postcss@8.4.31): + resolution: {integrity: sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.31 + + /cssnano@5.1.15(postcss@8.4.31): + resolution: {integrity: sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + cssnano-preset-default: 5.2.14(postcss@8.4.31) + lilconfig: 2.1.0 + postcss: 8.4.31 + yaml: 1.10.2 + + /csso@4.2.0: + resolution: {integrity: sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==} + engines: {node: '>=8.0.0'} + dependencies: + css-tree: 1.1.3 + + /cssom@0.3.8: + resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} + dev: true + + /cssom@0.5.0: + resolution: {integrity: sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==} + dev: true + + /cssstyle@2.3.0: + resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==} + engines: {node: '>=8'} + dependencies: + cssom: 0.3.8 + dev: true + + /csstype@3.1.2: + resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} + + /cytoscape-cose-bilkent@4.1.0(cytoscape@3.27.0): + resolution: {integrity: sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==} + peerDependencies: + cytoscape: ^3.2.0 + dependencies: + cose-base: 1.0.3 + cytoscape: 3.27.0 + + /cytoscape-fcose@2.2.0(cytoscape@3.27.0): + resolution: {integrity: sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==} + peerDependencies: + cytoscape: ^3.2.0 + dependencies: + cose-base: 2.2.0 + cytoscape: 3.27.0 + + /cytoscape@3.27.0: + resolution: {integrity: sha512-pPZJilfX9BxESwujODz5pydeGi+FBrXq1rcaB1mfhFXXFJ9GjE6CNndAk+8jPzoXGD+16LtSS4xlYEIUiW4Abg==} + engines: {node: '>=0.10'} + dependencies: + heap: 0.2.7 + lodash: 4.17.21 + + /d3-array@2.12.1: + resolution: {integrity: sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==} + dependencies: + internmap: 1.0.1 + + /d3-array@3.2.4: + resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} + engines: {node: '>=12'} + dependencies: + internmap: 2.0.3 + + /d3-axis@3.0.0: + resolution: {integrity: sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==} + engines: {node: '>=12'} + + /d3-brush@3.0.0: + resolution: {integrity: sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==} + engines: {node: '>=12'} + dependencies: + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-transition: 3.0.1(d3-selection@3.0.0) + + /d3-chord@3.0.1: + resolution: {integrity: sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==} + engines: {node: '>=12'} + dependencies: + d3-path: 3.1.0 + + /d3-color@3.1.0: + resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} + engines: {node: '>=12'} + + /d3-contour@4.0.2: + resolution: {integrity: sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==} + engines: {node: '>=12'} + dependencies: + d3-array: 3.2.4 + + /d3-delaunay@6.0.4: + resolution: {integrity: sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==} + engines: {node: '>=12'} + dependencies: + delaunator: 5.0.0 + + /d3-dispatch@3.0.1: + resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==} + engines: {node: '>=12'} + + /d3-drag@3.0.0: + resolution: {integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==} + engines: {node: '>=12'} + dependencies: + d3-dispatch: 3.0.1 + d3-selection: 3.0.0 + + /d3-dsv@3.0.1: + resolution: {integrity: sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==} + engines: {node: '>=12'} + hasBin: true + dependencies: + commander: 7.2.0 + iconv-lite: 0.6.3 + rw: 1.3.3 + + /d3-ease@3.0.1: + resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} + engines: {node: '>=12'} + + /d3-fetch@3.0.1: + resolution: {integrity: sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==} + engines: {node: '>=12'} + dependencies: + d3-dsv: 3.0.1 + + /d3-force@3.0.0: + resolution: {integrity: sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==} + engines: {node: '>=12'} + dependencies: + d3-dispatch: 3.0.1 + d3-quadtree: 3.0.1 + d3-timer: 3.0.1 + + /d3-format@3.1.0: + resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==} + engines: {node: '>=12'} + + /d3-geo@3.1.0: + resolution: {integrity: sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA==} + engines: {node: '>=12'} + dependencies: + d3-array: 3.2.4 + + /d3-hierarchy@3.1.2: + resolution: {integrity: sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==} + engines: {node: '>=12'} + + /d3-interpolate@3.0.1: + resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} + engines: {node: '>=12'} + dependencies: + d3-color: 3.1.0 + + /d3-path@1.0.9: + resolution: {integrity: sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==} + + /d3-path@3.1.0: + resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} + engines: {node: '>=12'} + + /d3-polygon@3.0.1: + resolution: {integrity: sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==} + engines: {node: '>=12'} + + /d3-quadtree@3.0.1: + resolution: {integrity: sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==} + engines: {node: '>=12'} + + /d3-random@3.0.1: + resolution: {integrity: sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==} + engines: {node: '>=12'} + + /d3-sankey@0.12.3: + resolution: {integrity: sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==} + dependencies: + d3-array: 2.12.1 + d3-shape: 1.3.7 + + /d3-scale-chromatic@3.0.0: + resolution: {integrity: sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==} + engines: {node: '>=12'} + dependencies: + d3-color: 3.1.0 + d3-interpolate: 3.0.1 + + /d3-scale@4.0.2: + resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} + engines: {node: '>=12'} + dependencies: + d3-array: 3.2.4 + d3-format: 3.1.0 + d3-interpolate: 3.0.1 + d3-time: 3.1.0 + d3-time-format: 4.1.0 + + /d3-selection@3.0.0: + resolution: {integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==} + engines: {node: '>=12'} + + /d3-shape@1.3.7: + resolution: {integrity: sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==} + dependencies: + d3-path: 1.0.9 + + /d3-shape@3.2.0: + resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} + engines: {node: '>=12'} + dependencies: + d3-path: 3.1.0 + + /d3-time-format@4.1.0: + resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} + engines: {node: '>=12'} + dependencies: + d3-time: 3.1.0 + + /d3-time@3.1.0: + resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} + engines: {node: '>=12'} + dependencies: + d3-array: 3.2.4 + + /d3-timer@3.0.1: + resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} + engines: {node: '>=12'} + + /d3-transition@3.0.1(d3-selection@3.0.0): + resolution: {integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==} + engines: {node: '>=12'} + peerDependencies: + d3-selection: 2 - 3 + dependencies: + d3-color: 3.1.0 + d3-dispatch: 3.0.1 + d3-ease: 3.0.1 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-timer: 3.0.1 + + /d3-zoom@3.0.0: + resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==} + engines: {node: '>=12'} + dependencies: + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-transition: 3.0.1(d3-selection@3.0.0) + + /d3@7.8.5: + resolution: {integrity: sha512-JgoahDG51ncUfJu6wX/1vWQEqOflgXyl4MaHqlcSruTez7yhaRKR9i8VjjcQGeS2en/jnFivXuaIMnseMMt0XA==} + engines: {node: '>=12'} + dependencies: + d3-array: 3.2.4 + d3-axis: 3.0.0 + d3-brush: 3.0.0 + d3-chord: 3.0.1 + d3-color: 3.1.0 + d3-contour: 4.0.2 + d3-delaunay: 6.0.4 + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-dsv: 3.0.1 + d3-ease: 3.0.1 + d3-fetch: 3.0.1 + d3-force: 3.0.0 + d3-format: 3.1.0 + d3-geo: 3.1.0 + d3-hierarchy: 3.1.2 + d3-interpolate: 3.0.1 + d3-path: 3.1.0 + d3-polygon: 3.0.1 + d3-quadtree: 3.0.1 + d3-random: 3.0.1 + d3-scale: 4.0.2 + d3-scale-chromatic: 3.0.0 + d3-selection: 3.0.0 + d3-shape: 3.2.0 + d3-time: 3.1.0 + d3-time-format: 4.1.0 + d3-timer: 3.0.1 + d3-transition: 3.0.1(d3-selection@3.0.0) + d3-zoom: 3.0.0 + + /dagre-d3-es@7.0.10: + resolution: {integrity: sha512-qTCQmEhcynucuaZgY5/+ti3X/rnszKZhEQH/ZdWdtP1tA/y3VoHJzcVrO9pjjJCNpigfscAtoUB5ONcd2wNn0A==} + dependencies: + d3: 7.8.5 + lodash-es: 4.17.21 + + /data-uri-to-buffer@4.0.1: + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} + engines: {node: '>= 12'} + dev: false + + /data-urls@3.0.2: + resolution: {integrity: sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==} + engines: {node: '>=12'} + dependencies: + abab: 2.0.6 + whatwg-mimetype: 3.0.0 + whatwg-url: 11.0.0 + dev: true + + /dayjs@1.11.10: + resolution: {integrity: sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==} + + /debounce@1.2.1: + resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==} + dev: false + + /debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + dependencies: + ms: 2.0.0 + dev: false + + /debug@4.3.4(supports-color@8.1.1): + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + supports-color: 8.1.1 + + /decamelize@4.0.0: + resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} + engines: {node: '>=10'} + dev: true + + /decimal.js@10.4.3: + resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} + dev: true + + /decode-named-character-reference@1.0.2: + resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} + dependencies: + character-entities: 2.0.2 + + /decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + dependencies: + mimic-response: 3.1.0 + + /dedent-js@1.0.1: + resolution: {integrity: sha512-OUepMozQULMLUmhxS95Vudo0jb0UchLimi3+pQ2plj61Fcy8axbP9hbiD4Sz6DPqn6XG3kfmziVfQ1rSys5AJQ==} + dev: true + + /deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + + /deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + /deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + /default-browser-id@3.0.0: + resolution: {integrity: sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==} + engines: {node: '>=12'} + dependencies: + bplist-parser: 0.2.0 + untildify: 4.0.0 + dev: false + + /default-browser@4.0.0: + resolution: {integrity: sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==} + engines: {node: '>=14.16'} + dependencies: + bundle-name: 3.0.0 + default-browser-id: 3.0.0 + execa: 7.2.0 + titleize: 3.0.0 + dev: false + + /default-gateway@6.0.3: + resolution: {integrity: sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==} + engines: {node: '>= 10'} + dependencies: + execa: 5.1.1 + dev: false + + /defer-to-connect@2.0.1: + resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} + engines: {node: '>=10'} + dev: false + + /define-data-property@1.1.1: + resolution: {integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.2 + gopd: 1.0.1 + has-property-descriptors: 1.0.1 + + /define-lazy-prop@2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + + /define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + dev: false + + /define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.1 + has-property-descriptors: 1.0.1 + object-keys: 1.1.1 + dev: false + + /del@6.1.1: + resolution: {integrity: sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==} + engines: {node: '>=10'} + dependencies: + globby: 11.1.0 + graceful-fs: 4.2.11 + is-glob: 4.0.3 + is-path-cwd: 2.2.0 + is-path-inside: 3.0.3 + p-map: 4.0.0 + rimraf: 3.0.2 + slash: 3.0.0 + dev: false + + /delaunator@5.0.0: + resolution: {integrity: sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==} + dependencies: + robust-predicates: 3.0.2 + + /delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + /depd@1.1.2: + resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} + engines: {node: '>= 0.6'} + dev: false + + /depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + dev: false + + /dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + /destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + dev: false + + /detect-libc@2.0.2: + resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} + engines: {node: '>=8'} + requiresBuild: true + optional: true + + /detect-node@2.1.0: + resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} + dev: false + + /detect-port-alt@1.1.6: + resolution: {integrity: sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==} + engines: {node: '>= 4.2.1'} + hasBin: true + dependencies: + address: 1.2.2 + debug: 2.6.9 + dev: false + + /detect-port@1.5.1: + resolution: {integrity: sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==} + hasBin: true + dependencies: + address: 1.2.2 + debug: 4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + dev: false + + /devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + dependencies: + dequal: 2.0.3 + dev: false + + /diff@5.0.0: + resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} + engines: {node: '>=0.3.1'} + dev: true + + /diff@5.1.0: + resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} + engines: {node: '>=0.3.1'} + + /dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + dependencies: + path-type: 4.0.0 + + /dns-equal@1.0.0: + resolution: {integrity: sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==} + dev: false + + /dns-packet@5.6.1: + resolution: {integrity: sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==} + engines: {node: '>=6'} + dependencies: + '@leichtgewicht/ip-codec': 2.0.4 + dev: false + + /doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + dependencies: + esutils: 2.0.3 + + /dom-converter@0.2.0: + resolution: {integrity: sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==} + dependencies: + utila: 0.4.0 + dev: false + + /dom-helpers@5.2.1: + resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} + dependencies: + '@babel/runtime': 7.23.2 + csstype: 3.1.2 + dev: false + + /dom-serializer@1.4.1: + resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} + dependencies: + domelementtype: 2.3.0 + domhandler: 4.3.1 + entities: 2.2.0 + + /dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + + /domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + /domexception@4.0.0: + resolution: {integrity: sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==} + engines: {node: '>=12'} + dependencies: + webidl-conversions: 7.0.0 + dev: true + + /domhandler@4.3.1: + resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} + engines: {node: '>= 4'} + dependencies: + domelementtype: 2.3.0 + + /domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + dependencies: + domelementtype: 2.3.0 + + /dompurify@3.0.5: + resolution: {integrity: sha512-F9e6wPGtY+8KNMRAVfxeCOHU0/NPWMSENNq4pQctuXRqqdEPW7q3CrLbR5Nse044WwacyjHGOMlvNsBe1y6z9A==} + dev: false + + /dompurify@3.0.6: + resolution: {integrity: sha512-ilkD8YEnnGh1zJ240uJsW7AzE+2qpbOUYjacomn3AvJ6J4JhKGSZ2nh4wUIXPZrEPppaCLx5jFe8T89Rk8tQ7w==} + + /domutils@2.8.0: + resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} + dependencies: + dom-serializer: 1.4.1 + domelementtype: 2.3.0 + domhandler: 4.3.1 + + /domutils@3.1.0: + resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + + /dot-case@3.0.4: + resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + dependencies: + no-case: 3.0.4 + tslib: 2.6.2 + + /dot-prop@5.3.0: + resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} + engines: {node: '>=8'} + dependencies: + is-obj: 2.0.0 + dev: false + + /dot-prop@6.0.1: + resolution: {integrity: sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==} + engines: {node: '>=10'} + dependencies: + is-obj: 2.0.0 + dev: false + + /dotenv@16.3.1: + resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} + engines: {node: '>=12'} + dev: true + + /drange@1.1.1: + resolution: {integrity: sha512-pYxfDYpued//QpnLIm4Avk7rsNtAtQkUES2cwAYSvD/wd2pKD71gN2Ebj3e7klzXwjocvE8c5vx/1fxwpqmSxA==} + engines: {node: '>=4'} + dev: false + + /duplexer@0.1.2: + resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} + dev: false + + /eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + /ecdsa-sig-formatter@1.0.11: + resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} + dependencies: + safe-buffer: 5.2.1 + dev: false + + /ecmarkdown@7.2.0: + resolution: {integrity: sha512-p0C4SJCvnvtm0y9gPhXBb5DlNbHsNS44ihVKBw3MXviZG2QQpZNH4z/3PbkpgECOjKOeZI+m84ISHVV9WLECFQ==} + dependencies: + escape-html: 1.0.3 + dev: true + + /ecmarkup@12.0.3: + resolution: {integrity: sha512-iWn/8Az5izJqZzlNari7MONi+4bpUw7iuoktVf9mtxkxxg+da/vYdwk7G0pORM1moceJtVcdu7KEZnMEdgAj5A==} + engines: {node: '>= 12 || ^11.10.1 || ^10.13 || ^8.10'} + hasBin: true + dependencies: + chalk: 4.1.2 + command-line-args: 5.2.1 + command-line-usage: 6.1.3 + dedent-js: 1.0.1 + ecmarkdown: 7.2.0 + eslint-formatter-codeframe: 7.32.1 + fast-glob: 3.3.1 + grammarkdown: 3.3.2 + highlight.js: 11.0.1 + html-escape: 1.0.2 + js-yaml: 3.14.1 + jsdom: 19.0.0 + parse5: 6.0.1 + prex: 0.4.9 + promise-debounce: 1.0.1 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + dev: true + + /ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + dev: false + + /electron-to-chromium@1.4.574: + resolution: {integrity: sha512-bg1m8L0n02xRzx4LsTTMbBPiUd9yIR+74iPtS/Ao65CuXvhVZHP0ym1kSdDG3yHFDXqHQQBKujlN1AQ8qZnyFg==} + + /elkjs@0.8.2: + resolution: {integrity: sha512-L6uRgvZTH+4OF5NE/MBbzQx/WYpru1xCBE9respNj6qznEewGUIfhzmm7horWWxbNO2M0WckQypGctR8lH79xQ==} + + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + /emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + /emojilib@2.4.0: + resolution: {integrity: sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==} + dev: false + + /emojis-list@3.0.0: + resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} + engines: {node: '>= 4'} + + /emoticon@4.0.1: + resolution: {integrity: sha512-dqx7eA9YaqyvYtUhJwT4rC1HIp82j5ybS1/vQ42ur+jBe17dJMwZE4+gvL1XadSFfxaPFFGt3Xsw+Y8akThDlw==} + dev: false + + /encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + dev: false + + /end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + requiresBuild: true + dependencies: + once: 1.4.0 + optional: true + + /enhanced-resolve@5.15.0: + resolution: {integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==} + engines: {node: '>=10.13.0'} + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + + /entities@2.1.0: + resolution: {integrity: sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==} + dev: true + + /entities@2.2.0: + resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} + + /entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + /error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + dependencies: + is-arrayish: 0.2.1 + dev: false + + /es-module-lexer@1.3.1: + resolution: {integrity: sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q==} + + /es-module-shims@1.8.1: + resolution: {integrity: sha512-egouQrkryAJpKHVDZICQq5+fW4z1RomzVJpicA+8yqUHzKkTuMeoHaNIZ7PsWDnRl0ImCEVJEpW/aVb6JYKVJg==} + dev: false + + /esbuild@0.18.20: + resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.18.20 + '@esbuild/android-arm64': 0.18.20 + '@esbuild/android-x64': 0.18.20 + '@esbuild/darwin-arm64': 0.18.20 + '@esbuild/darwin-x64': 0.18.20 + '@esbuild/freebsd-arm64': 0.18.20 + '@esbuild/freebsd-x64': 0.18.20 + '@esbuild/linux-arm': 0.18.20 + '@esbuild/linux-arm64': 0.18.20 + '@esbuild/linux-ia32': 0.18.20 + '@esbuild/linux-loong64': 0.18.20 + '@esbuild/linux-mips64el': 0.18.20 + '@esbuild/linux-ppc64': 0.18.20 + '@esbuild/linux-riscv64': 0.18.20 + '@esbuild/linux-s390x': 0.18.20 + '@esbuild/linux-x64': 0.18.20 + '@esbuild/netbsd-x64': 0.18.20 + '@esbuild/openbsd-x64': 0.18.20 + '@esbuild/sunos-x64': 0.18.20 + '@esbuild/win32-arm64': 0.18.20 + '@esbuild/win32-ia32': 0.18.20 + '@esbuild/win32-x64': 0.18.20 + + /escalade@3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + + /escape-goat@4.0.0: + resolution: {integrity: sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==} + engines: {node: '>=12'} + dev: false + + /escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + /escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + /escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + /escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + dev: false + + /escodegen@2.1.0: + resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} + engines: {node: '>=6.0'} + hasBin: true + dependencies: + esprima: 4.0.1 + estraverse: 5.3.0 + esutils: 2.0.3 + optionalDependencies: + source-map: 0.6.1 + dev: true + + /eslint-config-prettier@8.10.0(eslint@8.52.0): + resolution: {integrity: sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + dependencies: + eslint: 8.52.0 + dev: false + + /eslint-formatter-codeframe@7.32.1: + resolution: {integrity: sha512-DK/3Q3+zVKq/7PdSYiCxPrsDF8H/TRMK5n8Hziwr4IMkMy+XiKSwbpj25AdajS63I/B61Snetq4uVvX9fOLyAg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + '@babel/code-frame': 7.12.11 + chalk: 4.1.2 + dev: true + + /eslint-plugin-deprecation@2.0.0(eslint@8.52.0)(typescript@5.2.2): + resolution: {integrity: sha512-OAm9Ohzbj11/ZFyICyR5N6LbOIvQMp7ZU2zI7Ej0jIc8kiGUERXPNMfw2QqqHD1ZHtjMub3yPZILovYEYucgoQ==} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: ^4.2.4 || ^5.0.0 + dependencies: + '@typescript-eslint/utils': 6.9.1(eslint@8.52.0)(typescript@5.2.2) + eslint: 8.52.0 + tslib: 2.6.2 + tsutils: 3.21.0(typescript@5.2.2) + typescript: 5.2.2 + transitivePeerDependencies: + - supports-color + dev: false + + /eslint-plugin-mocha@10.2.0(eslint@8.52.0): + resolution: {integrity: sha512-ZhdxzSZnd1P9LqDPF0DBcFLpRIGdh1zkF2JHnQklKQOvrQtT73kdP5K9V2mzvbLR+cCAO9OI48NXK/Ax9/ciCQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + eslint: '>=7.0.0' + dependencies: + eslint: 8.52.0 + eslint-utils: 3.0.0(eslint@8.52.0) + rambda: 7.5.0 + dev: false + + /eslint-plugin-prettier@5.0.1(eslint-config-prettier@8.10.0)(eslint@8.52.0)(prettier@3.1.0): + resolution: {integrity: sha512-m3u5RnR56asrwV/lDC4GHorlW75DsFfmUcjfCYylTUs85dBRnB7VM6xG8eCMJdeDRnppzmxZVf1GEPJvl1JmNg==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + '@types/eslint': '>=8.0.0' + eslint: '>=8.0.0' + eslint-config-prettier: '*' + prettier: '>=3.0.0' + peerDependenciesMeta: + '@types/eslint': + optional: true + eslint-config-prettier: + optional: true + dependencies: + eslint: 8.52.0 + eslint-config-prettier: 8.10.0(eslint@8.52.0) + prettier: 3.1.0 + prettier-linter-helpers: 1.0.0 + synckit: 0.8.5 + dev: false + + /eslint-plugin-unicorn@47.0.0(eslint@8.52.0): + resolution: {integrity: sha512-ivB3bKk7fDIeWOUmmMm9o3Ax9zbMz1Bsza/R2qm46ufw4T6VBFBaJIR1uN3pCKSmSXm8/9Nri8V+iUut1NhQGA==} + engines: {node: '>=16'} + peerDependencies: + eslint: '>=8.38.0' + dependencies: + '@babel/helper-validator-identifier': 7.22.20 + '@eslint-community/eslint-utils': 4.4.0(eslint@8.52.0) + ci-info: 3.9.0 + clean-regexp: 1.0.0 + eslint: 8.52.0 + esquery: 1.5.0 + indent-string: 4.0.0 + is-builtin-module: 3.2.1 + jsesc: 3.0.2 + lodash: 4.17.21 + pluralize: 8.0.0 + read-pkg-up: 7.0.1 + regexp-tree: 0.1.27 + regjsparser: 0.10.0 + safe-regex: 2.1.1 + semver: 7.5.4 + strip-indent: 3.0.0 + dev: false + + /eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + + /eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + /eslint-utils@3.0.0(eslint@8.52.0): + resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} + engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} + peerDependencies: + eslint: '>=5' + dependencies: + eslint: 8.52.0 + eslint-visitor-keys: 2.1.0 + dev: false + + /eslint-visitor-keys@2.1.0: + resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} + engines: {node: '>=10'} + dev: false + + /eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + /eslint@8.52.0: + resolution: {integrity: sha512-zh/JHnaixqHZsolRB/w9/02akBk9EPrOs9JwcTP2ek7yL5bVvXuRariiaAjjoJ5DvuwQ1WAE/HsMz+w17YgBCg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.52.0) + '@eslint-community/regexpp': 4.10.0 + '@eslint/eslintrc': 2.1.2 + '@eslint/js': 8.52.0 + '@humanwhocodes/config-array': 0.11.13 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.2.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4(supports-color@8.1.1) + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.23.0 + graphemer: 1.4.0 + ignore: 5.2.4 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.3 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + + /espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + acorn: 8.11.2 + acorn-jsx: 5.3.2(acorn@8.11.2) + eslint-visitor-keys: 3.4.3 + + /esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + /esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + dependencies: + estraverse: 5.3.0 + + /esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + dependencies: + estraverse: 5.3.0 + + /estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + /estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + /estree-util-attach-comments@3.0.0: + resolution: {integrity: sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==} + dependencies: + '@types/estree': 1.0.4 + dev: false + + /estree-util-build-jsx@3.0.1: + resolution: {integrity: sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==} + dependencies: + '@types/estree-jsx': 1.0.2 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + estree-walker: 3.0.3 + dev: false + + /estree-util-is-identifier-name@3.0.0: + resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} + dev: false + + /estree-util-to-js@2.0.0: + resolution: {integrity: sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==} + dependencies: + '@types/estree-jsx': 1.0.2 + astring: 1.8.6 + source-map: 0.7.4 + dev: false + + /estree-util-value-to-estree@3.0.1: + resolution: {integrity: sha512-b2tdzTurEIbwRh+mKrEcaWfu1wgb8J1hVsgREg7FFiecWwK/PhO8X0kyc+0bIcKNtD4sqxIdNoRy6/p/TvECEA==} + engines: {node: '>=16.0.0'} + dependencies: + '@types/estree': 1.0.4 + is-plain-obj: 4.1.0 + dev: false + + /estree-util-visit@2.0.0: + resolution: {integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==} + dependencies: + '@types/estree-jsx': 1.0.2 + '@types/unist': 3.0.1 + dev: false + + /estree-walker@0.6.1: + resolution: {integrity: sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==} + dev: true + + /estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + /estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + dependencies: + '@types/estree': 1.0.4 + dev: false + + /esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + /eta@2.2.0: + resolution: {integrity: sha512-UVQ72Rqjy/ZKQalzV5dCCJP80GrmPrMxh6NlNf+erV6ObL0ZFkhCstWRawS85z3smdr3d2wXPsZEY7rDPfGd2g==} + engines: {node: '>=6.0.0'} + dev: false + + /etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + dev: false + + /eval@0.1.8: + resolution: {integrity: sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==} + engines: {node: '>= 0.8'} + dependencies: + '@types/node': 18.11.19 + require-like: 0.1.2 + dev: false + + /event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + dev: false + + /eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + + /events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + /execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + dev: false + + /execa@7.2.0: + resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==} + engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 4.3.1 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.1.0 + onetime: 6.0.0 + signal-exit: 3.0.7 + strip-final-newline: 3.0.0 + dev: false + + /expand-template@2.0.3: + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} + engines: {node: '>=6'} + requiresBuild: true + optional: true + + /express@4.18.2: + resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} + engines: {node: '>= 0.10.0'} + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.1 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookie: 0.5.0 + cookie-signature: 1.0.6 + debug: 2.6.9 + depd: 2.0.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.2.0 + fresh: 0.5.2 + http-errors: 2.0.0 + merge-descriptors: 1.0.1 + methods: 1.1.2 + on-finished: 2.4.1 + parseurl: 1.3.3 + path-to-regexp: 0.1.7 + proxy-addr: 2.0.7 + qs: 6.11.0 + range-parser: 1.2.1 + safe-buffer: 5.2.1 + send: 0.18.0 + serve-static: 1.15.0 + setprototypeof: 1.2.0 + statuses: 2.0.1 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + dev: false + + /extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + dependencies: + is-extendable: 0.1.1 + dev: false + + /extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + dev: false + + /fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + /fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + dev: false + + /fast-equals@4.0.3: + resolution: {integrity: sha512-G3BSX9cfKttjr+2o1O22tYMLq0DPluZnYtq1rXumE1SpL/F/SLIfHx08WYQoWSIpeMYf8sRbJ8++71+v6Pnxfg==} + dev: false + + /fast-glob@3.3.1: + resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + + /fast-json-patch@3.1.1: + resolution: {integrity: sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ==} + dev: false + + /fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + /fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + /fast-url-parser@1.1.3: + resolution: {integrity: sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==} + dependencies: + punycode: 1.4.1 + dev: false + + /fastq@1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + dependencies: + reusify: 1.0.4 + + /fault@1.0.4: + resolution: {integrity: sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==} + dependencies: + format: 0.2.2 + dev: false + + /fault@2.0.1: + resolution: {integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==} + dependencies: + format: 0.2.2 + dev: false + + /faye-websocket@0.11.4: + resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==} + engines: {node: '>=0.8.0'} + dependencies: + websocket-driver: 0.7.4 + dev: false + + /fbemitter@3.0.0: + resolution: {integrity: sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw==} + dependencies: + fbjs: 3.0.5 + transitivePeerDependencies: + - encoding + dev: false + + /fbjs-css-vars@1.0.2: + resolution: {integrity: sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==} + dev: false + + /fbjs@3.0.5: + resolution: {integrity: sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg==} + dependencies: + cross-fetch: 3.1.8 + fbjs-css-vars: 1.0.2 + loose-envify: 1.4.0 + object-assign: 4.1.1 + promise: 7.3.1 + setimmediate: 1.0.5 + ua-parser-js: 1.0.37 + transitivePeerDependencies: + - encoding + dev: false + + /fd-slicer@1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + dependencies: + pend: 1.2.0 + dev: true + + /feed@4.2.2: + resolution: {integrity: sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==} + engines: {node: '>=0.4.0'} + dependencies: + xml-js: 1.6.11 + dev: false + + /fetch-blob@3.2.0: + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} + engines: {node: ^12.20 || >= 14.13} + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 3.2.1 + dev: false + + /file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flat-cache: 3.1.1 + + /file-loader@6.2.0(webpack@5.89.0): + resolution: {integrity: sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==} + engines: {node: '>= 10.13.0'} + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + dependencies: + loader-utils: 2.0.4 + schema-utils: 3.3.0 + webpack: 5.89.0(@swc/core@1.3.95) + + /filesize@8.0.7: + resolution: {integrity: sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==} + engines: {node: '>= 0.4.0'} + dev: false + + /fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + + /finalhandler@1.2.0: + resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} + engines: {node: '>= 0.8'} + dependencies: + debug: 2.6.9 + encodeurl: 1.0.2 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.1 + unpipe: 1.0.0 + dev: false + + /find-cache-dir@4.0.0: + resolution: {integrity: sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==} + engines: {node: '>=14.16'} + dependencies: + common-path-prefix: 3.0.0 + pkg-dir: 7.0.0 + dev: false + + /find-replace@3.0.0: + resolution: {integrity: sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==} + engines: {node: '>=4.0.0'} + dependencies: + array-back: 3.1.0 + dev: true + + /find-root@1.1.0: + resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} + dev: false + + /find-up@3.0.0: + resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} + engines: {node: '>=6'} + dependencies: + locate-path: 3.0.0 + dev: false + + /find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + dev: false + + /find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + /find-up@6.3.0: + resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + locate-path: 7.2.0 + path-exists: 5.0.0 + dev: false + + /find-yarn-workspace-root@2.0.0: + resolution: {integrity: sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==} + dependencies: + micromatch: 4.0.5 + dev: false + + /flat-cache@3.1.1: + resolution: {integrity: sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==} + engines: {node: '>=12.0.0'} + dependencies: + flatted: 3.2.9 + keyv: 4.5.4 + rimraf: 3.0.2 + + /flat@5.0.2: + resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} + hasBin: true + + /flatted@3.2.9: + resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} + + /flux@4.0.4(react@18.2.0): + resolution: {integrity: sha512-NCj3XlayA2UsapRpM7va6wU1+9rE5FIL7qoMcmxWHRzbp0yujihMBm9BBHZ1MDIk5h5o2Bl6eGiCe8rYELAmYw==} + peerDependencies: + react: ^15.0.2 || ^16.0.0 || ^17.0.0 + dependencies: + fbemitter: 3.0.0 + fbjs: 3.0.5 + react: 18.2.0 + transitivePeerDependencies: + - encoding + dev: false + + /follow-redirects@1.15.3: + resolution: {integrity: sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + dev: false + + /foreground-child@2.0.0: + resolution: {integrity: sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==} + engines: {node: '>=8.0.0'} + dependencies: + cross-spawn: 7.0.3 + signal-exit: 3.0.7 + dev: true + + /foreground-child@3.1.1: + resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + engines: {node: '>=14'} + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.1.0 + dev: true + + /fork-ts-checker-webpack-plugin@6.5.3(eslint@8.52.0)(typescript@5.2.2)(webpack@5.89.0): + resolution: {integrity: sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==} + engines: {node: '>=10', yarn: '>=1.0.0'} + peerDependencies: + eslint: '>= 6' + typescript: '>= 2.7' + vue-template-compiler: '*' + webpack: '>= 4' + peerDependenciesMeta: + eslint: + optional: true + vue-template-compiler: + optional: true + dependencies: + '@babel/code-frame': 7.22.13 + '@types/json-schema': 7.0.14 + chalk: 4.1.2 + chokidar: 3.5.3 + cosmiconfig: 6.0.0 + deepmerge: 4.3.1 + eslint: 8.52.0 + fs-extra: 9.1.0 + glob: 7.2.3 + memfs: 3.5.3 + minimatch: 3.1.2 + schema-utils: 2.7.0 + semver: 7.5.4 + tapable: 1.1.3 + typescript: 5.2.2 + webpack: 5.89.0(@swc/core@1.3.95) + dev: false + + /form-data-encoder@2.1.4: + resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==} + engines: {node: '>= 14.17'} + dev: false + + /form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + /format@0.2.2: + resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} + engines: {node: '>=0.4.x'} + dev: false + + /formdata-polyfill@4.0.10: + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} + engines: {node: '>=12.20.0'} + dependencies: + fetch-blob: 3.2.0 + dev: false + + /forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + dev: false + + /fraction.js@4.3.7: + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + dev: false + + /fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + dev: false + + /fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + requiresBuild: true + optional: true + + /fs-extra@11.1.1: + resolution: {integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==} + engines: {node: '>=14.14'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + dev: false + + /fs-extra@9.1.0: + resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} + engines: {node: '>=10'} + dependencies: + at-least-node: 1.0.0 + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + dev: false + + /fs-monkey@1.0.5: + resolution: {integrity: sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==} + dev: false + + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + /fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + optional: true + + /function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + /generic-names@4.0.0: + resolution: {integrity: sha512-ySFolZQfw9FoDb3ed9d80Cm9f0+r7qj+HJkWjeD9RBfpxEVTlVhol+gvaQB/78WbwYfbnNh8nWHHBSlg072y6A==} + dependencies: + loader-utils: 3.2.1 + dev: true + + /gensequence@5.0.2: + resolution: {integrity: sha512-JlKEZnFc6neaeSVlkzBGGgkIoIaSxMgvdamRoPN8r3ozm2r9dusqxeKqYQ7lhzmj2UhFQP8nkyfCaiLQxiLrDA==} + engines: {node: '>=14'} + dev: false + + /gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + /get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + /get-intrinsic@1.2.2: + resolution: {integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==} + dependencies: + function-bind: 1.1.2 + has-proto: 1.0.1 + has-symbols: 1.0.3 + hasown: 2.0.0 + + /get-own-enumerable-property-symbols@3.0.2: + resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==} + dev: false + + /get-stdin@8.0.0: + resolution: {integrity: sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==} + engines: {node: '>=10'} + dev: false + + /get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + dev: false + + /github-from-package@0.0.0: + resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + requiresBuild: true + optional: true + + /github-slugger@1.5.0: + resolution: {integrity: sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==} + dev: false + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + + /glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + + /glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + + /glob@10.3.10: + resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + dependencies: + foreground-child: 3.1.1 + jackspeak: 2.3.6 + minimatch: 9.0.3 + minipass: 7.0.4 + path-scurry: 1.10.1 + dev: true + + /glob@7.2.0: + resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + /glob@8.1.0: + resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} + engines: {node: '>=12'} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 5.1.6 + once: 1.4.0 + + /global-dirs@0.1.1: + resolution: {integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==} + engines: {node: '>=4'} + dependencies: + ini: 1.3.8 + dev: false + + /global-dirs@3.0.1: + resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==} + engines: {node: '>=10'} + dependencies: + ini: 2.0.0 + dev: false + + /global-modules@2.0.0: + resolution: {integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==} + engines: {node: '>=6'} + dependencies: + global-prefix: 3.0.0 + dev: false + + /global-prefix@3.0.0: + resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==} + engines: {node: '>=6'} + dependencies: + ini: 1.3.8 + kind-of: 6.0.3 + which: 1.3.1 + dev: false + + /globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + /globals@13.23.0: + resolution: {integrity: sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.20.2 + + /globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.1 + ignore: 5.2.4 + merge2: 1.4.1 + slash: 3.0.0 + + /globby@13.1.4: + resolution: {integrity: sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + dir-glob: 3.0.1 + fast-glob: 3.3.1 + ignore: 5.2.4 + merge2: 1.4.1 + slash: 4.0.0 + dev: false + + /globby@13.2.2: + resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + dir-glob: 3.0.1 + fast-glob: 3.3.1 + ignore: 5.2.4 + merge2: 1.4.1 + slash: 4.0.0 + dev: false + + /gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + dependencies: + get-intrinsic: 1.2.2 + + /got@12.6.1: + resolution: {integrity: sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==} + engines: {node: '>=14.16'} + dependencies: + '@sindresorhus/is': 5.6.0 + '@szmarczak/http-timer': 5.0.1 + cacheable-lookup: 7.0.0 + cacheable-request: 10.2.14 + decompress-response: 6.0.0 + form-data-encoder: 2.1.4 + get-stream: 6.0.1 + http2-wrapper: 2.2.0 + lowercase-keys: 3.0.0 + p-cancelable: 3.0.0 + responselike: 3.0.0 + dev: false + + /graceful-fs@4.2.10: + resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} + dev: false + + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + /grammarkdown@3.3.2: + resolution: {integrity: sha512-inNbeEotDr7MENqoZlms3x4gBzvK73wR2NGpNVnw4oEZcsq2METUbAh0J3VWtEqd9t2+U3poEqiJ9CDgBXr5Tg==} + hasBin: true + dependencies: + '@esfx/async-canceltoken': 1.0.0 + '@esfx/cancelable': 1.0.0 + '@esfx/disposable': 1.0.0 + dev: true + + /graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + /gray-matter@4.0.3: + resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} + engines: {node: '>=6.0'} + dependencies: + js-yaml: 3.14.1 + kind-of: 6.0.3 + section-matter: 1.0.0 + strip-bom-string: 1.0.0 + dev: false + + /gzip-size@6.0.0: + resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==} + engines: {node: '>=10'} + dependencies: + duplexer: 0.1.2 + dev: false + + /handle-thing@2.0.1: + resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==} + dev: false + + /has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + /has-own-prop@2.0.0: + resolution: {integrity: sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ==} + engines: {node: '>=8'} + dev: false + + /has-property-descriptors@1.0.1: + resolution: {integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==} + dependencies: + get-intrinsic: 1.2.2 + + /has-proto@1.0.1: + resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} + engines: {node: '>= 0.4'} + + /has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + + /has-yarn@3.0.0: + resolution: {integrity: sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: false + + /hasown@2.0.0: + resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} + engines: {node: '>= 0.4'} + dependencies: + function-bind: 1.1.2 + + /hast-util-from-parse5@8.0.1: + resolution: {integrity: sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==} + dependencies: + '@types/hast': 3.0.2 + '@types/unist': 3.0.1 + devlop: 1.1.0 + hastscript: 8.0.0 + property-information: 6.4.0 + vfile: 6.0.1 + vfile-location: 5.0.2 + web-namespaces: 2.0.1 + dev: false + + /hast-util-parse-selector@2.2.5: + resolution: {integrity: sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==} + dev: false + + /hast-util-parse-selector@4.0.0: + resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} + dependencies: + '@types/hast': 3.0.2 + dev: false + + /hast-util-raw@9.0.1: + resolution: {integrity: sha512-5m1gmba658Q+lO5uqL5YNGQWeh1MYWZbZmWrM5lncdcuiXuo5E2HT/CIOp0rLF8ksfSwiCVJ3twlgVRyTGThGA==} + dependencies: + '@types/hast': 3.0.2 + '@types/unist': 3.0.1 + '@ungap/structured-clone': 1.2.0 + hast-util-from-parse5: 8.0.1 + hast-util-to-parse5: 8.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.0.2 + parse5: 7.1.2 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.1 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + dev: false + + /hast-util-to-estree@3.1.0: + resolution: {integrity: sha512-lfX5g6hqVh9kjS/B9E2gSkvHH4SZNiQFiqWS0x9fENzEl+8W12RqdRxX6d/Cwxi30tPQs3bIO+aolQJNp1bIyw==} + dependencies: + '@types/estree': 1.0.4 + '@types/estree-jsx': 1.0.2 + '@types/hast': 3.0.2 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + estree-util-attach-comments: 3.0.0 + estree-util-is-identifier-name: 3.0.0 + hast-util-whitespace: 3.0.0 + mdast-util-mdx-expression: 2.0.0 + mdast-util-mdx-jsx: 3.0.0 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 6.4.0 + space-separated-tokens: 2.0.2 + style-to-object: 0.4.4 + unist-util-position: 5.0.0 + zwitch: 2.0.4 + transitivePeerDependencies: + - supports-color + dev: false + + /hast-util-to-jsx-runtime@2.2.0: + resolution: {integrity: sha512-wSlp23N45CMjDg/BPW8zvhEi3R+8eRE1qFbjEyAUzMCzu2l1Wzwakq+Tlia9nkCtEl5mDxa7nKHsvYJ6Gfn21A==} + dependencies: + '@types/hast': 3.0.2 + '@types/unist': 3.0.1 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 3.0.0 + property-information: 6.4.0 + space-separated-tokens: 2.0.2 + style-to-object: 0.4.4 + unist-util-position: 5.0.0 + vfile-message: 4.0.2 + dev: false + + /hast-util-to-parse5@8.0.0: + resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==} + dependencies: + '@types/hast': 3.0.2 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + property-information: 6.4.0 + space-separated-tokens: 2.0.2 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + dev: false + + /hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + dependencies: + '@types/hast': 3.0.2 + dev: false + + /hastscript@6.0.0: + resolution: {integrity: sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==} + dependencies: + '@types/hast': 2.3.7 + comma-separated-tokens: 1.0.8 + hast-util-parse-selector: 2.2.5 + property-information: 5.6.0 + space-separated-tokens: 1.1.5 + dev: false + + /hastscript@8.0.0: + resolution: {integrity: sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==} + dependencies: + '@types/hast': 3.0.2 + comma-separated-tokens: 2.0.3 + hast-util-parse-selector: 4.0.0 + property-information: 6.4.0 + space-separated-tokens: 2.0.2 + dev: false + + /he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + + /header-case@2.0.4: + resolution: {integrity: sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==} + dependencies: + capital-case: 1.0.4 + tslib: 2.6.2 + + /heap@0.2.7: + resolution: {integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==} + + /highlight.js@10.7.3: + resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} + dev: false + + /highlight.js@11.0.1: + resolution: {integrity: sha512-EqYpWyTF2s8nMfttfBA2yLKPNoZCO33pLS4MnbXQ4hECf1TKujCt1Kq7QAdrio7roL4+CqsfjqwYj4tYgq0pJQ==} + engines: {node: '>=12.0.0'} + dev: true + + /history@4.10.1: + resolution: {integrity: sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==} + dependencies: + '@babel/runtime': 7.23.2 + loose-envify: 1.4.0 + resolve-pathname: 3.0.0 + tiny-invariant: 1.3.1 + tiny-warning: 1.0.3 + value-equal: 1.0.1 + dev: false + + /hoist-non-react-statics@3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + dependencies: + react-is: 16.13.1 + dev: false + + /hosted-git-info@2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + dev: false + + /hosted-git-info@4.1.0: + resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} + engines: {node: '>=10'} + dependencies: + lru-cache: 6.0.0 + dev: true + + /hpack.js@2.1.6: + resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==} + dependencies: + inherits: 2.0.4 + obuf: 1.1.2 + readable-stream: 2.3.8 + wbuf: 1.7.3 + dev: false + + /html-encoding-sniffer@3.0.0: + resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==} + engines: {node: '>=12'} + dependencies: + whatwg-encoding: 2.0.0 + dev: true + + /html-entities@2.4.0: + resolution: {integrity: sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==} + dev: false + + /html-escape@1.0.2: + resolution: {integrity: sha512-r4cqVc7QAX1/jpPsW9OJNsTTtFhcf+ZBqoA3rWOddMg/y+n6ElKfz+IGKbvV2RTeECDzyrQXa2rpo3IFFrANWg==} + dev: true + + /html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + dev: true + + /html-minifier-terser@6.1.0: + resolution: {integrity: sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==} + engines: {node: '>=12'} + hasBin: true + dependencies: + camel-case: 4.1.2 + clean-css: 5.3.2 + commander: 8.3.0 + he: 1.2.0 + param-case: 3.0.4 + relateurl: 0.2.7 + terser: 5.24.0 + dev: false + + /html-minifier-terser@7.2.0: + resolution: {integrity: sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==} + engines: {node: ^14.13.1 || >=16.0.0} + hasBin: true + dependencies: + camel-case: 4.1.2 + clean-css: 5.3.2 + commander: 10.0.1 + entities: 4.5.0 + param-case: 3.0.4 + relateurl: 0.2.7 + terser: 5.24.0 + dev: false + + /html-tags@3.3.1: + resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} + engines: {node: '>=8'} + dev: false + + /html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + dev: false + + /html-webpack-plugin@5.5.3(webpack@5.89.0): + resolution: {integrity: sha512-6YrDKTuqaP/TquFH7h4srYWsZx+x6k6+FbsTm0ziCwGHDP78Unr1r9F/H4+sGmMbX08GQcJ+K64x55b+7VM/jg==} + engines: {node: '>=10.13.0'} + peerDependencies: + webpack: ^5.20.0 + dependencies: + '@types/html-minifier-terser': 6.1.0 + html-minifier-terser: 6.1.0 + lodash: 4.17.21 + pretty-error: 4.0.0 + tapable: 2.2.1 + webpack: 5.89.0(@swc/core@1.3.95) + dev: false + + /htmlparser2@6.1.0: + resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==} + dependencies: + domelementtype: 2.3.0 + domhandler: 4.3.1 + domutils: 2.8.0 + entities: 2.2.0 + dev: false + + /htmlparser2@8.0.2: + resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.1.0 + entities: 4.5.0 + + /http-cache-semantics@4.1.1: + resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + dev: false + + /http-deceiver@1.2.7: + resolution: {integrity: sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==} + dev: false + + /http-errors@1.6.3: + resolution: {integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==} + engines: {node: '>= 0.6'} + dependencies: + depd: 1.1.2 + inherits: 2.0.3 + setprototypeof: 1.1.0 + statuses: 1.5.0 + dev: false + + /http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + dev: false + + /http-parser-js@0.5.8: + resolution: {integrity: sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==} + dev: false + + /http-proxy-agent@5.0.0: + resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} + engines: {node: '>= 6'} + dependencies: + '@tootallnate/once': 2.0.0 + agent-base: 6.0.2 + debug: 4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + + /http-proxy-middleware@2.0.6(@types/express@4.17.20): + resolution: {integrity: sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@types/express': ^4.17.13 + peerDependenciesMeta: + '@types/express': + optional: true + dependencies: + '@types/express': 4.17.20 + '@types/http-proxy': 1.17.13 + http-proxy: 1.18.1 + is-glob: 4.0.3 + is-plain-obj: 3.0.0 + micromatch: 4.0.5 + transitivePeerDependencies: + - debug + dev: false + + /http-proxy@1.18.1: + resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} + engines: {node: '>=8.0.0'} + dependencies: + eventemitter3: 4.0.7 + follow-redirects: 1.15.3 + requires-port: 1.0.0 + transitivePeerDependencies: + - debug + dev: false + + /http2-wrapper@2.2.0: + resolution: {integrity: sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==} + engines: {node: '>=10.19.0'} + dependencies: + quick-lru: 5.1.1 + resolve-alpn: 1.2.1 + dev: false + + /https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + dependencies: + agent-base: 6.0.2 + debug: 4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + + /human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + dev: false + + /human-signals@4.3.1: + resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} + engines: {node: '>=14.18.0'} + dev: false + + /iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + dev: false + + /iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + + /icss-replace-symbols@1.1.0: + resolution: {integrity: sha512-chIaY3Vh2mh2Q3RGXttaDIzeiPvaVXJ+C4DAh/w3c37SKZ/U6PGMmuicR2EQQp9bKG8zLMCl7I+PtIoOOPp8Gg==} + dev: true + + /icss-utils@5.1.0(postcss@8.4.31): + resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + dependencies: + postcss: 8.4.31 + + /ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + /ignore@5.2.4: + resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} + engines: {node: '>= 4'} + + /image-size@1.0.2: + resolution: {integrity: sha512-xfOoWjceHntRb3qFCrh5ZFORYH8XCdYpASltMhZ/Q0KZiOwjdE/Yl2QCiWdwD+lygV5bMCvauzgu5PxBX/Yerg==} + engines: {node: '>=14.0.0'} + hasBin: true + dependencies: + queue: 6.0.2 + dev: false + + /immer@9.0.21: + resolution: {integrity: sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==} + dev: false + + /immutable@3.8.2: + resolution: {integrity: sha512-15gZoQ38eYjEjxkorfbcgBKBL6R7T459OuK+CpcWt7O3KF4uPCx2tD0uFETlUDIyo+1789crbMhTvQBSR5yBMg==} + engines: {node: '>=0.10.0'} + dev: false + + /import-cwd@3.0.0: + resolution: {integrity: sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg==} + engines: {node: '>=8'} + dependencies: + import-from: 3.0.0 + dev: true + + /import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + /import-from@3.0.0: + resolution: {integrity: sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==} + engines: {node: '>=8'} + dependencies: + resolve-from: 5.0.0 + dev: true + + /import-lazy@4.0.0: + resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} + engines: {node: '>=8'} + dev: false + + /import-meta-resolve@2.2.2: + resolution: {integrity: sha512-f8KcQ1D80V7RnqVm+/lirO9zkOxjGxhaTC1IPrBGd3MEfNgmNG67tSUO9gTi2F3Blr2Az6g1vocaxzkVnWl9MA==} + dev: false + + /imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + /indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + dev: false + + /infima@0.2.0-alpha.43: + resolution: {integrity: sha512-2uw57LvUqW0rK/SWYnd/2rRfxNA5DDNOh33jxF7fy46VWoNhGxiUQyVZHbBMjQ33mQem0cjdDVwgWVAmlRfgyQ==} + engines: {node: '>=12'} + dev: false + + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + /inherits@2.0.3: + resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} + dev: false + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + /ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + /ini@2.0.0: + resolution: {integrity: sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==} + engines: {node: '>=10'} + dev: false + + /inline-style-parser@0.1.1: + resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} + dev: false + + /internmap@1.0.1: + resolution: {integrity: sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==} + + /internmap@2.0.3: + resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} + engines: {node: '>=12'} + + /interpret@1.4.0: + resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} + engines: {node: '>= 0.10'} + dev: false + + /invariant@2.2.4: + resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} + dependencies: + loose-envify: 1.4.0 + + /ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + dev: false + + /ipaddr.js@2.1.0: + resolution: {integrity: sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==} + engines: {node: '>= 10'} + dev: false + + /is-alphabetical@1.0.4: + resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==} + dev: false + + /is-alphabetical@2.0.1: + resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + dev: false + + /is-alphanumerical@1.0.4: + resolution: {integrity: sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==} + dependencies: + is-alphabetical: 1.0.4 + is-decimal: 1.0.4 + dev: false + + /is-alphanumerical@2.0.1: + resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + dependencies: + is-alphabetical: 2.0.1 + is-decimal: 2.0.1 + dev: false + + /is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + dev: false + + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + + /is-buffer@1.1.6: + resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} + dev: true + + /is-builtin-module@3.2.1: + resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} + engines: {node: '>=6'} + dependencies: + builtin-modules: 3.3.0 + + /is-ci@3.0.1: + resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} + hasBin: true + dependencies: + ci-info: 3.9.0 + dev: false + + /is-core-module@2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + dependencies: + hasown: 2.0.0 + + /is-decimal@1.0.4: + resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==} + dev: false + + /is-decimal@2.0.1: + resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + dev: false + + /is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + + /is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + dev: false + + /is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + dev: false + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + + /is-hexadecimal@1.0.4: + resolution: {integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==} + dev: false + + /is-hexadecimal@2.0.1: + resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + dev: false + + /is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + dependencies: + is-docker: 3.0.0 + dev: false + + /is-installed-globally@0.4.0: + resolution: {integrity: sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==} + engines: {node: '>=10'} + dependencies: + global-dirs: 3.0.1 + is-path-inside: 3.0.3 + dev: false + + /is-module@1.0.0: + resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} + + /is-npm@6.0.0: + resolution: {integrity: sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: false + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + /is-obj@1.0.1: + resolution: {integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==} + engines: {node: '>=0.10.0'} + dev: false + + /is-obj@2.0.0: + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} + engines: {node: '>=8'} + dev: false + + /is-path-cwd@2.2.0: + resolution: {integrity: sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==} + engines: {node: '>=6'} + dev: false + + /is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + /is-plain-obj@2.1.0: + resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} + engines: {node: '>=8'} + dev: true + + /is-plain-obj@3.0.0: + resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} + engines: {node: '>=10'} + dev: false + + /is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + dev: false + + /is-plain-object@2.0.4: + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} + engines: {node: '>=0.10.0'} + dependencies: + isobject: 3.0.1 + + /is-plain-object@5.0.0: + resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} + engines: {node: '>=0.10.0'} + dev: false + + /is-potential-custom-element-name@1.0.1: + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + dev: true + + /is-reference@1.2.1: + resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} + dependencies: + '@types/estree': 1.0.4 + + /is-reference@3.0.2: + resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==} + dependencies: + '@types/estree': 1.0.4 + dev: false + + /is-regexp@1.0.0: + resolution: {integrity: sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==} + engines: {node: '>=0.10.0'} + dev: false + + /is-root@2.1.0: + resolution: {integrity: sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==} + engines: {node: '>=6'} + dev: false + + /is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + dev: false + + /is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: false + + /is-typedarray@1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + dev: false + + /is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + dev: true + + /is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + dependencies: + is-docker: 2.2.1 + + /is-yarn-global@0.4.1: + resolution: {integrity: sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==} + engines: {node: '>=12'} + dev: false + + /isarray@0.0.1: + resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} + + /isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + /isobject@3.0.1: + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} + engines: {node: '>=0.10.0'} + + /istanbul-lib-coverage@3.2.0: + resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} + engines: {node: '>=8'} + dev: true + + /istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + dependencies: + istanbul-lib-coverage: 3.2.0 + make-dir: 4.0.0 + supports-color: 7.2.0 + dev: true + + /istanbul-reports@3.1.6: + resolution: {integrity: sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==} + engines: {node: '>=8'} + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + dev: true + + /jackspeak@2.3.6: + resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} + engines: {node: '>=14'} + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + dev: true + + /jest-util@29.7.0: + resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.3 + '@types/node': 18.11.19 + chalk: 4.1.2 + ci-info: 3.9.0 + graceful-fs: 4.2.11 + picomatch: 2.3.1 + dev: false + + /jest-worker@27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} + dependencies: + '@types/node': 18.11.19 + merge-stream: 2.0.0 + supports-color: 8.1.1 + + /jest-worker@29.7.0: + resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@types/node': 18.11.19 + jest-util: 29.7.0 + merge-stream: 2.0.0 + supports-color: 8.1.1 + dev: false + + /jiti@1.21.0: + resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} + hasBin: true + dev: false + + /joi@17.11.0: + resolution: {integrity: sha512-NgB+lZLNoqISVy1rZocE9PZI36bL/77ie924Ri43yEvi9GUUMPeyVIr8KdFTMUlby1p0PBYMk9spIxEUQYqrJQ==} + dependencies: + '@hapi/hoek': 9.3.0 + '@hapi/topo': 5.1.0 + '@sideway/address': 4.1.4 + '@sideway/formula': 3.0.1 + '@sideway/pinpoint': 2.0.0 + + /js-file-download@0.4.12: + resolution: {integrity: sha512-rML+NkoD08p5Dllpjo0ffy4jRHeY6Zsapvr/W86N7E0yuzAO6qa5X9+xog6zQNlH102J7IXljNY2FtS6Lj3ucg==} + dev: false + + /js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + /js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + + /js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + + /jsdom@19.0.0: + resolution: {integrity: sha512-RYAyjCbxy/vri/CfnjUWJQQtZ3LKlLnDqj+9XLNnJPgEGeirZs3hllKR20re8LUZ6o1b1X4Jat+Qd26zmP41+A==} + engines: {node: '>=12'} + peerDependencies: + canvas: ^2.5.0 + peerDependenciesMeta: + canvas: + optional: true + dependencies: + abab: 2.0.6 + acorn: 8.11.2 + acorn-globals: 6.0.0 + cssom: 0.5.0 + cssstyle: 2.3.0 + data-urls: 3.0.2 + decimal.js: 10.4.3 + domexception: 4.0.0 + escodegen: 2.1.0 + form-data: 4.0.0 + html-encoding-sniffer: 3.0.0 + http-proxy-agent: 5.0.0 + https-proxy-agent: 5.0.1 + is-potential-custom-element-name: 1.0.1 + nwsapi: 2.2.7 + parse5: 6.0.1 + saxes: 5.0.1 + symbol-tree: 3.2.4 + tough-cookie: 4.1.3 + w3c-hr-time: 1.0.2 + w3c-xmlserializer: 3.0.0 + webidl-conversions: 7.0.0 + whatwg-encoding: 2.0.0 + whatwg-mimetype: 3.0.0 + whatwg-url: 10.0.0 + ws: 8.14.2 + xml-name-validator: 4.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + + /jsesc@0.5.0: + resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} + hasBin: true + dev: false + + /jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + + /jsesc@3.0.2: + resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} + engines: {node: '>=6'} + hasBin: true + dev: false + + /json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + /json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + /json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + /json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + /json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + /json-stable-stringify@1.0.2: + resolution: {integrity: sha512-eunSSaEnxV12z+Z73y/j5N37/In40GK4GmsSy+tEHJMxknvqnA7/djeYtAgW0GsWHUfg+847WJjKaEylk2y09g==} + dependencies: + jsonify: 0.0.1 + dev: false + + /json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + /jsonc-parser@3.2.0: + resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + dev: true + + /jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + dev: false + + /jsonify@0.0.1: + resolution: {integrity: sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==} + dev: false + + /jsonwebtoken@9.0.2: + resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==} + engines: {node: '>=12', npm: '>=6'} + dependencies: + jws: 3.2.2 + lodash.includes: 4.3.0 + lodash.isboolean: 3.0.3 + lodash.isinteger: 4.0.4 + lodash.isnumber: 3.0.3 + lodash.isplainobject: 4.0.6 + lodash.isstring: 4.0.1 + lodash.once: 4.1.1 + ms: 2.1.3 + semver: 7.5.4 + dev: false + + /just-extend@4.2.1: + resolution: {integrity: sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==} + dev: true + + /jwa@1.4.1: + resolution: {integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==} + dependencies: + buffer-equal-constant-time: 1.0.1 + ecdsa-sig-formatter: 1.0.11 + safe-buffer: 5.2.1 + dev: false + + /jwa@2.0.0: + resolution: {integrity: sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==} + dependencies: + buffer-equal-constant-time: 1.0.1 + ecdsa-sig-formatter: 1.0.11 + safe-buffer: 5.2.1 + dev: false + + /jws@3.2.2: + resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==} + dependencies: + jwa: 1.4.1 + safe-buffer: 5.2.1 + dev: false + + /jws@4.0.0: + resolution: {integrity: sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==} + dependencies: + jwa: 2.0.0 + safe-buffer: 5.2.1 + dev: false + + /keyborg@2.1.0: + resolution: {integrity: sha512-0+v3/GIYG6gClwBOXrHet31n1UJW49xbKgVPUu6we41aq9tAmMosVXEdctZxsQdebyxtrcxVTkvHjBD1XPOHwg==} + dev: false + + /keytar@7.9.0: + resolution: {integrity: sha512-VPD8mtVtm5JNtA2AErl6Chp06JBfy7diFQ7TQQhdpWOl6MrCRB+eRbvAZUsbGQS9kiMq0coJsy0W0vHpDCkWsQ==} + requiresBuild: true + dependencies: + node-addon-api: 4.3.0 + prebuild-install: 7.1.1 + dev: true + optional: true + + /keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + dependencies: + json-buffer: 3.0.1 + + /khroma@2.1.0: + resolution: {integrity: sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==} + + /kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + /klaw-sync@6.0.0: + resolution: {integrity: sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==} + dependencies: + graceful-fs: 4.2.11 + dev: false + + /kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + + /kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + + /latest-version@7.0.0: + resolution: {integrity: sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==} + engines: {node: '>=14.16'} + dependencies: + package-json: 8.1.1 + dev: false + + /launch-editor@2.6.1: + resolution: {integrity: sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw==} + dependencies: + picocolors: 1.0.0 + shell-quote: 1.8.1 + dev: false + + /layout-base@1.0.2: + resolution: {integrity: sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==} + + /layout-base@2.0.1: + resolution: {integrity: sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==} + + /leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + + /levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + /lilconfig@2.1.0: + resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} + engines: {node: '>=10'} + + /lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + dev: false + + /linkify-it@3.0.3: + resolution: {integrity: sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==} + dependencies: + uc.micro: 1.0.6 + dev: true + + /loader-runner@4.3.0: + resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} + engines: {node: '>=6.11.5'} + + /loader-utils@2.0.4: + resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} + engines: {node: '>=8.9.0'} + dependencies: + big.js: 5.2.2 + emojis-list: 3.0.0 + json5: 2.2.3 + + /loader-utils@3.2.1: + resolution: {integrity: sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==} + engines: {node: '>= 12.13.0'} + + /locate-path@3.0.0: + resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} + engines: {node: '>=6'} + dependencies: + p-locate: 3.0.0 + path-exists: 3.0.0 + dev: false + + /locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + dependencies: + p-locate: 4.1.0 + dev: false + + /locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 + + /locate-path@7.2.0: + resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + p-locate: 6.0.0 + dev: false + + /lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + + /lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + dev: true + + /lodash.curry@4.1.1: + resolution: {integrity: sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA==} + dev: false + + /lodash.debounce@4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + dev: false + + /lodash.escape@4.0.1: + resolution: {integrity: sha512-nXEOnb/jK9g0DYMr1/Xvq6l5xMD7GDG55+GSYIYmS0G4tBk/hURD4JR9WCavs04t33WmJx9kCyp9vJ+mr4BOUw==} + dev: false + + /lodash.flatten@4.4.0: + resolution: {integrity: sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==} + dev: false + + /lodash.flow@3.5.0: + resolution: {integrity: sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw==} + dev: false + + /lodash.get@4.4.2: + resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} + dev: true + + /lodash.includes@4.3.0: + resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} + dev: false + + /lodash.invokemap@4.6.0: + resolution: {integrity: sha512-CfkycNtMqgUlfjfdh2BhKO/ZXrP8ePOX5lEU/g0R3ItJcnuxWDwokMGKx1hWcfOikmyOVx6X9IwWnDGlgKl61w==} + dev: false + + /lodash.isboolean@3.0.3: + resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==} + dev: false + + /lodash.isinteger@4.0.4: + resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==} + dev: false + + /lodash.isnumber@3.0.3: + resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==} + dev: false + + /lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + dev: false + + /lodash.isstring@4.0.1: + resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} + dev: false + + /lodash.memoize@4.1.2: + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + + /lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + /lodash.once@4.1.1: + resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} + dev: false + + /lodash.pullall@4.2.0: + resolution: {integrity: sha512-VhqxBKH0ZxPpLhiu68YD1KnHmbhQJQctcipvmFnqIBDYzcIHzf3Zpu0tpeOKtR4x76p9yohc506eGdOjTmyIBg==} + dev: false + + /lodash.uniq@4.5.0: + resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} + + /lodash.uniqby@4.7.0: + resolution: {integrity: sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==} + dev: false + + /lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + /log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + dev: true + + /longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + dev: false + + /loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + dependencies: + js-tokens: 4.0.0 + + /lower-case@2.0.2: + resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + dependencies: + tslib: 2.6.2 + + /lowercase-keys@3.0.0: + resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: false + + /lowlight@1.20.0: + resolution: {integrity: sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==} + dependencies: + fault: 1.0.4 + highlight.js: 10.7.3 + dev: false + + /lru-cache@10.0.1: + resolution: {integrity: sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==} + engines: {node: 14 || >=16.14} + dev: true + + /lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + dependencies: + yallist: 3.1.1 + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + + /lunr@2.3.9: + resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} + dev: true + + /lzutf8@0.6.3: + resolution: {integrity: sha512-CAkF9HKrM+XpB0f3DepQ2to2iUEo0zrbh+XgBqgNBc1+k8HMM3u/YSfHI3Dr4GmoTIez2Pr/If1XFl3rU26AwA==} + dependencies: + readable-stream: 4.4.2 + dev: false + + /magic-string@0.30.5: + resolution: {integrity: sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + + /make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + dependencies: + semver: 6.3.1 + dev: false + + /make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + dependencies: + semver: 7.5.4 + dev: true + + /markdown-extensions@2.0.0: + resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==} + engines: {node: '>=16'} + dev: false + + /markdown-it@12.3.2: + resolution: {integrity: sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==} + hasBin: true + dependencies: + argparse: 2.0.1 + entities: 2.1.0 + linkify-it: 3.0.3 + mdurl: 1.0.1 + uc.micro: 1.0.6 + dev: true + + /markdown-table@3.0.3: + resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} + dev: false + + /marked@4.3.0: + resolution: {integrity: sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==} + engines: {node: '>= 12'} + hasBin: true + dev: true + + /matched@5.0.1: + resolution: {integrity: sha512-E1fhSTPRyhAlNaNvGXAgZQlq1hL0bgYMTk/6bktVlIhzUnX/SZs7296ACdVeNJE8xFNGSuvd9IpI7vSnmcqLvw==} + engines: {node: '>=10'} + dependencies: + glob: 7.2.3 + picomatch: 2.3.1 + dev: false + + /md5@2.3.0: + resolution: {integrity: sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==} + dependencies: + charenc: 0.0.2 + crypt: 0.0.2 + is-buffer: 1.1.6 + dev: true + + /mdast-util-directive@3.0.0: + resolution: {integrity: sha512-JUpYOqKI4mM3sZcNxmF/ox04XYFFkNwr0CFlrQIkCwbvH0xzMCqkMqAde9wRd80VAhaUrwFwKm2nxretdT1h7Q==} + dependencies: + '@types/mdast': 4.0.2 + '@types/unist': 3.0.1 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + parse-entities: 4.0.1 + stringify-entities: 4.0.3 + unist-util-visit-parents: 6.0.1 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-find-and-replace@3.0.1: + resolution: {integrity: sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==} + dependencies: + '@types/mdast': 4.0.2 + escape-string-regexp: 5.0.0 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + dev: false + + /mdast-util-from-markdown@1.3.1: + resolution: {integrity: sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==} + dependencies: + '@types/mdast': 3.0.14 + '@types/unist': 2.0.9 + decode-named-character-reference: 1.0.2 + mdast-util-to-string: 3.2.0 + micromark: 3.2.0 + micromark-util-decode-numeric-character-reference: 1.1.0 + micromark-util-decode-string: 1.1.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + unist-util-stringify-position: 3.0.3 + uvu: 0.5.6 + transitivePeerDependencies: + - supports-color + + /mdast-util-from-markdown@2.0.0: + resolution: {integrity: sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==} + dependencies: + '@types/mdast': 4.0.2 + '@types/unist': 3.0.1 + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.0 + micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-decode-string: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-frontmatter@2.0.1: + resolution: {integrity: sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==} + dependencies: + '@types/mdast': 4.0.2 + devlop: 1.1.0 + escape-string-regexp: 5.0.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + micromark-extension-frontmatter: 2.0.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-gfm-autolink-literal@2.0.0: + resolution: {integrity: sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg==} + dependencies: + '@types/mdast': 4.0.2 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-find-and-replace: 3.0.1 + micromark-util-character: 2.0.1 + dev: false + + /mdast-util-gfm-footnote@2.0.0: + resolution: {integrity: sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==} + dependencies: + '@types/mdast': 4.0.2 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + micromark-util-normalize-identifier: 2.0.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-gfm-strikethrough@2.0.0: + resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} + dependencies: + '@types/mdast': 4.0.2 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-gfm-table@2.0.0: + resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} + dependencies: + '@types/mdast': 4.0.2 + devlop: 1.1.0 + markdown-table: 3.0.3 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-gfm-task-list-item@2.0.0: + resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} + dependencies: + '@types/mdast': 4.0.2 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-gfm@3.0.0: + resolution: {integrity: sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==} + dependencies: + mdast-util-from-markdown: 2.0.0 + mdast-util-gfm-autolink-literal: 2.0.0 + mdast-util-gfm-footnote: 2.0.0 + mdast-util-gfm-strikethrough: 2.0.0 + mdast-util-gfm-table: 2.0.0 + mdast-util-gfm-task-list-item: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-mdx-expression@2.0.0: + resolution: {integrity: sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw==} + dependencies: + '@types/estree-jsx': 1.0.2 + '@types/hast': 3.0.2 + '@types/mdast': 4.0.2 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-mdx-jsx@3.0.0: + resolution: {integrity: sha512-XZuPPzQNBPAlaqsTTgRrcJnyFbSOBovSadFgbFu8SnuNgm+6Bdx1K+IWoitsmj6Lq6MNtI+ytOqwN70n//NaBA==} + dependencies: + '@types/estree-jsx': 1.0.2 + '@types/hast': 3.0.2 + '@types/mdast': 4.0.2 + '@types/unist': 3.0.1 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + parse-entities: 4.0.1 + stringify-entities: 4.0.3 + unist-util-remove-position: 5.0.0 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.2 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-mdx@3.0.0: + resolution: {integrity: sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==} + dependencies: + mdast-util-from-markdown: 2.0.0 + mdast-util-mdx-expression: 2.0.0 + mdast-util-mdx-jsx: 3.0.0 + mdast-util-mdxjs-esm: 2.0.1 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-mdxjs-esm@2.0.1: + resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} + dependencies: + '@types/estree-jsx': 1.0.2 + '@types/hast': 3.0.2 + '@types/mdast': 4.0.2 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-phrasing@4.0.0: + resolution: {integrity: sha512-xadSsJayQIucJ9n053dfQwVu1kuXg7jCTdYsMK8rqzKZh52nLfSH/k0sAxE0u+pj/zKZX+o5wB+ML5mRayOxFA==} + dependencies: + '@types/mdast': 4.0.2 + unist-util-is: 6.0.0 + dev: false + + /mdast-util-to-hast@13.0.2: + resolution: {integrity: sha512-U5I+500EOOw9e3ZrclN3Is3fRpw8c19SMyNZlZ2IS+7vLsNzb2Om11VpIVOR+/0137GhZsFEF6YiKD5+0Hr2Og==} + dependencies: + '@types/hast': 3.0.2 + '@types/mdast': 4.0.2 + '@ungap/structured-clone': 1.2.0 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.0 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + dev: false + + /mdast-util-to-markdown@2.1.0: + resolution: {integrity: sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==} + dependencies: + '@types/mdast': 4.0.2 + '@types/unist': 3.0.1 + longest-streak: 3.1.0 + mdast-util-phrasing: 4.0.0 + mdast-util-to-string: 4.0.0 + micromark-util-decode-string: 2.0.0 + unist-util-visit: 5.0.0 + zwitch: 2.0.4 + dev: false + + /mdast-util-to-string@3.2.0: + resolution: {integrity: sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==} + dependencies: + '@types/mdast': 3.0.14 + + /mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + dependencies: + '@types/mdast': 4.0.2 + dev: false + + /mdn-data@2.0.14: + resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} + + /mdurl@1.0.1: + resolution: {integrity: sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==} + dev: true + + /media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + dev: false + + /memfs@3.5.3: + resolution: {integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==} + engines: {node: '>= 4.0.0'} + dependencies: + fs-monkey: 1.0.5 + dev: false + + /merge-descriptors@1.0.1: + resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} + dev: false + + /merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + /mermaid@10.4.0: + resolution: {integrity: sha512-4QCQLp79lvz7UZxow5HUX7uWTPJOaQBVExduo91tliXC7v78i6kssZOPHxLL+Xs30KU72cpPn3g3imw/xm/gaw==} + dependencies: + '@braintree/sanitize-url': 6.0.4 + '@types/d3-scale': 4.0.6 + '@types/d3-scale-chromatic': 3.0.1 + cytoscape: 3.27.0 + cytoscape-cose-bilkent: 4.1.0(cytoscape@3.27.0) + cytoscape-fcose: 2.2.0(cytoscape@3.27.0) + d3: 7.8.5 + d3-sankey: 0.12.3 + dagre-d3-es: 7.0.10 + dayjs: 1.11.10 + dompurify: 3.0.6 + elkjs: 0.8.2 + khroma: 2.1.0 + lodash-es: 4.17.21 + mdast-util-from-markdown: 1.3.1 + non-layered-tidy-tree-layout: 2.0.2 + stylis: 4.3.0 + ts-dedent: 2.2.0 + uuid: 9.0.1 + web-worker: 1.2.0 + transitivePeerDependencies: + - supports-color + + /methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + dev: false + + /micromark-core-commonmark@1.1.0: + resolution: {integrity: sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==} + dependencies: + decode-named-character-reference: 1.0.2 + micromark-factory-destination: 1.1.0 + micromark-factory-label: 1.1.0 + micromark-factory-space: 1.1.0 + micromark-factory-title: 1.1.0 + micromark-factory-whitespace: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-chunked: 1.1.0 + micromark-util-classify-character: 1.1.0 + micromark-util-html-tag-name: 1.2.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-resolve-all: 1.1.0 + micromark-util-subtokenize: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + + /micromark-core-commonmark@2.0.0: + resolution: {integrity: sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==} + dependencies: + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + micromark-factory-destination: 2.0.0 + micromark-factory-label: 2.0.0 + micromark-factory-space: 2.0.0 + micromark-factory-title: 2.0.0 + micromark-factory-whitespace: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-chunked: 2.0.0 + micromark-util-classify-character: 2.0.0 + micromark-util-html-tag-name: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-resolve-all: 2.0.0 + micromark-util-subtokenize: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-extension-directive@3.0.0: + resolution: {integrity: sha512-61OI07qpQrERc+0wEysLHMvoiO3s2R56x5u7glHq2Yqq6EHbH4dW25G9GfDdGCDYqA21KE6DWgNSzxSwHc2hSg==} + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.0 + micromark-factory-whitespace: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + parse-entities: 4.0.1 + dev: false + + /micromark-extension-frontmatter@2.0.0: + resolution: {integrity: sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==} + dependencies: + fault: 2.0.1 + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-extension-gfm-autolink-literal@2.0.0: + resolution: {integrity: sha512-rTHfnpt/Q7dEAK1Y5ii0W8bhfJlVJFnJMHIPisfPK3gpVNuOP0VnRl96+YJ3RYWV/P4gFeQoGKNlT3RhuvpqAg==} + dependencies: + micromark-util-character: 2.0.1 + micromark-util-sanitize-uri: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-extension-gfm-footnote@2.0.0: + resolution: {integrity: sha512-6Rzu0CYRKDv3BfLAUnZsSlzx3ak6HAoI85KTiijuKIz5UxZxbUI+pD6oHgw+6UtQuiRwnGRhzMmPRv4smcz0fg==} + dependencies: + devlop: 1.1.0 + micromark-core-commonmark: 2.0.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-sanitize-uri: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-extension-gfm-strikethrough@2.0.0: + resolution: {integrity: sha512-c3BR1ClMp5fxxmwP6AoOY2fXO9U8uFMKs4ADD66ahLTNcwzSCyRVU4k7LPV5Nxo/VJiR4TdzxRQY2v3qIUceCw==} + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-classify-character: 2.0.0 + micromark-util-resolve-all: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-extension-gfm-table@2.0.0: + resolution: {integrity: sha512-PoHlhypg1ItIucOaHmKE8fbin3vTLpDOUg8KAr8gRCF1MOZI9Nquq2i/44wFvviM4WuxJzc3demT8Y3dkfvYrw==} + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-extension-gfm-tagfilter@2.0.0: + resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} + dependencies: + micromark-util-types: 2.0.0 + dev: false + + /micromark-extension-gfm-task-list-item@2.0.1: + resolution: {integrity: sha512-cY5PzGcnULaN5O7T+cOzfMoHjBW7j+T9D2sucA5d/KbsBTPcYdebm9zUd9zzdgJGCwahV+/W78Z3nbulBYVbTw==} + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-extension-gfm@3.0.0: + resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} + dependencies: + micromark-extension-gfm-autolink-literal: 2.0.0 + micromark-extension-gfm-footnote: 2.0.0 + micromark-extension-gfm-strikethrough: 2.0.0 + micromark-extension-gfm-table: 2.0.0 + micromark-extension-gfm-tagfilter: 2.0.0 + micromark-extension-gfm-task-list-item: 2.0.1 + micromark-util-combine-extensions: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-extension-mdx-expression@3.0.0: + resolution: {integrity: sha512-sI0nwhUDz97xyzqJAbHQhp5TfaxEvZZZ2JDqUo+7NvyIYG6BZ5CPPqj2ogUoPJlmXHBnyZUzISg9+oUmU6tUjQ==} + dependencies: + '@types/estree': 1.0.4 + devlop: 1.1.0 + micromark-factory-mdx-expression: 2.0.1 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-events-to-acorn: 2.0.2 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-extension-mdx-jsx@3.0.0: + resolution: {integrity: sha512-uvhhss8OGuzR4/N17L1JwvmJIpPhAd8oByMawEKx6NVdBCbesjH4t+vjEp3ZXft9DwvlKSD07fCeI44/N0Vf2w==} + dependencies: + '@types/acorn': 4.0.6 + '@types/estree': 1.0.4 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + micromark-factory-mdx-expression: 2.0.1 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + vfile-message: 4.0.2 + dev: false + + /micromark-extension-mdx-md@2.0.0: + resolution: {integrity: sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==} + dependencies: + micromark-util-types: 2.0.0 + dev: false + + /micromark-extension-mdxjs-esm@3.0.0: + resolution: {integrity: sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==} + dependencies: + '@types/estree': 1.0.4 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-events-to-acorn: 2.0.2 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + unist-util-position-from-estree: 2.0.0 + vfile-message: 4.0.2 + dev: false + + /micromark-extension-mdxjs@3.0.0: + resolution: {integrity: sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==} + dependencies: + acorn: 8.11.2 + acorn-jsx: 5.3.2(acorn@8.11.2) + micromark-extension-mdx-expression: 3.0.0 + micromark-extension-mdx-jsx: 3.0.0 + micromark-extension-mdx-md: 2.0.0 + micromark-extension-mdxjs-esm: 3.0.0 + micromark-util-combine-extensions: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-factory-destination@1.1.0: + resolution: {integrity: sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==} + dependencies: + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + + /micromark-factory-destination@2.0.0: + resolution: {integrity: sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==} + dependencies: + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-factory-label@1.1.0: + resolution: {integrity: sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==} + dependencies: + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + + /micromark-factory-label@2.0.0: + resolution: {integrity: sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==} + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-factory-mdx-expression@2.0.1: + resolution: {integrity: sha512-F0ccWIUHRLRrYp5TC9ZYXmZo+p2AM13ggbsW4T0b5CRKP8KHVRB8t4pwtBgTxtjRmwrK0Irwm7vs2JOZabHZfg==} + dependencies: + '@types/estree': 1.0.4 + devlop: 1.1.0 + micromark-util-character: 2.0.1 + micromark-util-events-to-acorn: 2.0.2 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + unist-util-position-from-estree: 2.0.0 + vfile-message: 4.0.2 + dev: false + + /micromark-factory-space@1.1.0: + resolution: {integrity: sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==} + dependencies: + micromark-util-character: 1.2.0 + micromark-util-types: 1.1.0 + + /micromark-factory-space@2.0.0: + resolution: {integrity: sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==} + dependencies: + micromark-util-character: 2.0.1 + micromark-util-types: 2.0.0 + dev: false + + /micromark-factory-title@1.1.0: + resolution: {integrity: sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==} + dependencies: + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + + /micromark-factory-title@2.0.0: + resolution: {integrity: sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==} + dependencies: + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-factory-whitespace@1.1.0: + resolution: {integrity: sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==} + dependencies: + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + + /micromark-factory-whitespace@2.0.0: + resolution: {integrity: sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==} + dependencies: + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-util-character@1.2.0: + resolution: {integrity: sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==} + dependencies: + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + + /micromark-util-character@2.0.1: + resolution: {integrity: sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==} + dependencies: + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-util-chunked@1.1.0: + resolution: {integrity: sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==} + dependencies: + micromark-util-symbol: 1.1.0 + + /micromark-util-chunked@2.0.0: + resolution: {integrity: sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==} + dependencies: + micromark-util-symbol: 2.0.0 + dev: false + + /micromark-util-classify-character@1.1.0: + resolution: {integrity: sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==} + dependencies: + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + + /micromark-util-classify-character@2.0.0: + resolution: {integrity: sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==} + dependencies: + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-util-combine-extensions@1.1.0: + resolution: {integrity: sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==} + dependencies: + micromark-util-chunked: 1.1.0 + micromark-util-types: 1.1.0 + + /micromark-util-combine-extensions@2.0.0: + resolution: {integrity: sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==} + dependencies: + micromark-util-chunked: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-util-decode-numeric-character-reference@1.1.0: + resolution: {integrity: sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==} + dependencies: + micromark-util-symbol: 1.1.0 + + /micromark-util-decode-numeric-character-reference@2.0.1: + resolution: {integrity: sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==} + dependencies: + micromark-util-symbol: 2.0.0 + dev: false + + /micromark-util-decode-string@1.1.0: + resolution: {integrity: sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==} + dependencies: + decode-named-character-reference: 1.0.2 + micromark-util-character: 1.2.0 + micromark-util-decode-numeric-character-reference: 1.1.0 + micromark-util-symbol: 1.1.0 + + /micromark-util-decode-string@2.0.0: + resolution: {integrity: sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==} + dependencies: + decode-named-character-reference: 1.0.2 + micromark-util-character: 2.0.1 + micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-symbol: 2.0.0 + dev: false + + /micromark-util-encode@1.1.0: + resolution: {integrity: sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==} + + /micromark-util-encode@2.0.0: + resolution: {integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==} + dev: false + + /micromark-util-events-to-acorn@2.0.2: + resolution: {integrity: sha512-Fk+xmBrOv9QZnEDguL9OI9/NQQp6Hz4FuQ4YmCb/5V7+9eAh1s6AYSvL20kHkD67YIg7EpE54TiSlcsf3vyZgA==} + dependencies: + '@types/acorn': 4.0.6 + '@types/estree': 1.0.4 + '@types/unist': 3.0.1 + devlop: 1.1.0 + estree-util-visit: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + vfile-message: 4.0.2 + dev: false + + /micromark-util-html-tag-name@1.2.0: + resolution: {integrity: sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==} + + /micromark-util-html-tag-name@2.0.0: + resolution: {integrity: sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==} + dev: false + + /micromark-util-normalize-identifier@1.1.0: + resolution: {integrity: sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==} + dependencies: + micromark-util-symbol: 1.1.0 + + /micromark-util-normalize-identifier@2.0.0: + resolution: {integrity: sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==} + dependencies: + micromark-util-symbol: 2.0.0 + dev: false + + /micromark-util-resolve-all@1.1.0: + resolution: {integrity: sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==} + dependencies: + micromark-util-types: 1.1.0 + + /micromark-util-resolve-all@2.0.0: + resolution: {integrity: sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==} + dependencies: + micromark-util-types: 2.0.0 + dev: false + + /micromark-util-sanitize-uri@1.2.0: + resolution: {integrity: sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==} + dependencies: + micromark-util-character: 1.2.0 + micromark-util-encode: 1.1.0 + micromark-util-symbol: 1.1.0 + + /micromark-util-sanitize-uri@2.0.0: + resolution: {integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==} + dependencies: + micromark-util-character: 2.0.1 + micromark-util-encode: 2.0.0 + micromark-util-symbol: 2.0.0 + dev: false + + /micromark-util-subtokenize@1.1.0: + resolution: {integrity: sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==} + dependencies: + micromark-util-chunked: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + + /micromark-util-subtokenize@2.0.0: + resolution: {integrity: sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg==} + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-util-symbol@1.1.0: + resolution: {integrity: sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==} + + /micromark-util-symbol@2.0.0: + resolution: {integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==} + dev: false + + /micromark-util-types@1.1.0: + resolution: {integrity: sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==} + + /micromark-util-types@2.0.0: + resolution: {integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==} + dev: false + + /micromark@3.2.0: + resolution: {integrity: sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==} + dependencies: + '@types/debug': 4.1.10 + debug: 4.3.4(supports-color@8.1.1) + decode-named-character-reference: 1.0.2 + micromark-core-commonmark: 1.1.0 + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-chunked: 1.1.0 + micromark-util-combine-extensions: 1.1.0 + micromark-util-decode-numeric-character-reference: 1.1.0 + micromark-util-encode: 1.1.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-resolve-all: 1.1.0 + micromark-util-sanitize-uri: 1.2.0 + micromark-util-subtokenize: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + transitivePeerDependencies: + - supports-color + + /micromark@4.0.0: + resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==} + dependencies: + '@types/debug': 4.1.10 + debug: 4.3.4(supports-color@8.1.1) + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-chunked: 2.0.0 + micromark-util-combine-extensions: 2.0.0 + micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-encode: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-resolve-all: 2.0.0 + micromark-util-sanitize-uri: 2.0.0 + micromark-util-subtokenize: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + transitivePeerDependencies: + - supports-color + dev: false + + /micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + + /mime-db@1.33.0: + resolution: {integrity: sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==} + engines: {node: '>= 0.6'} + dev: false + + /mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + /mime-types@2.1.18: + resolution: {integrity: sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.33.0 + dev: false + + /mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + + /mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + + /mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + dev: false + + /mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + dev: false + + /mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + requiresBuild: true + + /mimic-response@4.0.0: + resolution: {integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: false + + /min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + dev: false + + /mini-css-extract-plugin@2.7.6(webpack@5.89.0): + resolution: {integrity: sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw==} + engines: {node: '>= 12.13.0'} + peerDependencies: + webpack: ^5.0.0 + dependencies: + schema-utils: 4.2.0 + webpack: 5.89.0(@swc/core@1.3.95) + dev: false + + /minim@0.23.8: + resolution: {integrity: sha512-bjdr2xW1dBCMsMGGsUeqM4eFI60m94+szhxWys+B1ztIt6gWSfeGBdSVCIawezeHYLYn0j6zrsXdQS/JllBzww==} + engines: {node: '>=6'} + dependencies: + lodash: 4.17.21 + dev: false + + /minimalistic-assert@1.0.1: + resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + dev: false + + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + + /minimatch@5.0.1: + resolution: {integrity: sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==} + engines: {node: '>=10'} + dependencies: + brace-expansion: 2.0.1 + dev: true + + /minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + dependencies: + brace-expansion: 2.0.1 + + /minimatch@7.4.6: + resolution: {integrity: sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==} + engines: {node: '>=10'} + dependencies: + brace-expansion: 2.0.1 + dev: false + + /minimatch@9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.1 + dev: true + + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + /minipass@7.0.4: + resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} + engines: {node: '>=16 || 14 >=14.17'} + dev: true + + /mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + requiresBuild: true + optional: true + + /mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + + /mkdirp@3.0.1: + resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} + engines: {node: '>=10'} + hasBin: true + dev: true + + /mocha-junit-reporter@2.2.1(mocha@10.2.0): + resolution: {integrity: sha512-iDn2tlKHn8Vh8o4nCzcUVW4q7iXp7cC4EB78N0cDHIobLymyHNwe0XG8HEHHjc3hJlXm0Vy6zcrxaIhnI2fWmw==} + peerDependencies: + mocha: '>=2.2.5' + dependencies: + debug: 4.3.4(supports-color@8.1.1) + md5: 2.3.0 + mkdirp: 3.0.1 + mocha: 10.2.0 + strip-ansi: 6.0.1 + xml: 1.0.1 + transitivePeerDependencies: + - supports-color + dev: true + + /mocha-multi-reporters@1.5.1(mocha@10.2.0): + resolution: {integrity: sha512-Yb4QJOaGLIcmB0VY7Wif5AjvLMUFAdV57D2TWEva1Y0kU/3LjKpeRVmlMIfuO1SVbauve459kgtIizADqxMWPg==} + engines: {node: '>=6.0.0'} + peerDependencies: + mocha: '>=3.1.2' + dependencies: + debug: 4.3.4(supports-color@8.1.1) + lodash: 4.17.21 + mocha: 10.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + /mocha@10.2.0: + resolution: {integrity: sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==} + engines: {node: '>= 14.0.0'} + hasBin: true + dependencies: + ansi-colors: 4.1.1 + browser-stdout: 1.3.1 + chokidar: 3.5.3 + debug: 4.3.4(supports-color@8.1.1) + diff: 5.0.0 + escape-string-regexp: 4.0.0 + find-up: 5.0.0 + glob: 7.2.0 + he: 1.2.0 + js-yaml: 4.1.0 + log-symbols: 4.1.0 + minimatch: 5.0.1 + ms: 2.1.3 + nanoid: 3.3.3 + serialize-javascript: 6.0.0 + strip-json-comments: 3.1.1 + supports-color: 8.1.1 + workerpool: 6.2.1 + yargs: 16.2.0 + yargs-parser: 20.2.4 + yargs-unparser: 2.0.0 + dev: true + + /monaco-editor-webpack-plugin@7.1.0(monaco-editor@0.43.0)(webpack@5.89.0): + resolution: {integrity: sha512-ZjnGINHN963JQkFqjjcBtn1XBtUATDZBMgNQhDQwd78w2ukRhFXAPNgWuacaQiDZsUr4h1rWv5Mv6eriKuOSzA==} + peerDependencies: + monaco-editor: '>= 0.31.0' + webpack: ^4.5.0 || 5.x + dependencies: + loader-utils: 2.0.4 + monaco-editor: 0.43.0 + webpack: 5.89.0(@swc/core@1.3.95) + dev: true + + /monaco-editor@0.43.0: + resolution: {integrity: sha512-cnoqwQi/9fml2Szamv1XbSJieGJ1Dc8tENVMD26Kcfl7xGQWp7OBKMjlwKVGYFJ3/AXJjSOGvcqK7Ry/j9BM1Q==} + + /mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + + /mrmime@1.0.1: + resolution: {integrity: sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==} + engines: {node: '>=10'} + dev: false + + /ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + dev: false + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + /ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + /multicast-dns@7.2.5: + resolution: {integrity: sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==} + hasBin: true + dependencies: + dns-packet: 5.6.1 + thunky: 1.1.0 + dev: false + + /mustache@4.2.0: + resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} + hasBin: true + dev: false + + /mute-stream@0.0.8: + resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} + dev: true + + /nan@2.18.0: + resolution: {integrity: sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w==} + requiresBuild: true + dev: false + optional: true + + /nanoid@3.3.3: + resolution: {integrity: sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: true + + /nanoid@3.3.6: + resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + /napi-build-utils@1.0.2: + resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} + requiresBuild: true + optional: true + + /natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + /negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + dev: false + + /neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + /nise@5.1.5: + resolution: {integrity: sha512-VJuPIfUFaXNRzETTQEEItTOP8Y171ijr+JLq42wHes3DiryR8vT+1TXQW/Rx8JNUhyYYWyIvjXTU6dOhJcs9Nw==} + dependencies: + '@sinonjs/commons': 2.0.0 + '@sinonjs/fake-timers': 10.3.0 + '@sinonjs/text-encoding': 0.7.2 + just-extend: 4.2.1 + path-to-regexp: 1.8.0 + dev: true + + /no-case@3.0.4: + resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + dependencies: + lower-case: 2.0.2 + tslib: 2.6.2 + + /node-abi@3.51.0: + resolution: {integrity: sha512-SQkEP4hmNWjlniS5zdnfIXTk1x7Ome85RDzHlTbBtzE97Gfwz/Ipw4v/Ryk20DWIy3yCNVLVlGKApCnmvYoJbA==} + engines: {node: '>=10'} + requiresBuild: true + dependencies: + semver: 7.5.4 + optional: true + + /node-abort-controller@3.1.1: + resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==} + dev: false + + /node-addon-api@4.3.0: + resolution: {integrity: sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==} + requiresBuild: true + dev: true + optional: true + + /node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + dev: false + + /node-emoji@2.1.0: + resolution: {integrity: sha512-tcsBm9C6FmPN5Wo7OjFi9lgMyJjvkAeirmjR/ax8Ttfqy4N8PoFic26uqFTIgayHPNI5FH4ltUvfh9kHzwcK9A==} + dependencies: + '@sindresorhus/is': 3.1.2 + char-regex: 1.0.2 + emojilib: 2.4.0 + skin-tone: 2.0.0 + dev: false + + /node-fetch-commonjs@3.3.2: + resolution: {integrity: sha512-VBlAiynj3VMLrotgwOS3OyECFxas5y7ltLcK4t41lMUZeaK15Ym4QRkqN0EQKAFL42q9i21EPKjzLUPfltR72A==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 3.2.1 + dev: false + + /node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + dev: false + + /node-fetch@3.3.2: + resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + data-uri-to-buffer: 4.0.1 + fetch-blob: 3.2.0 + formdata-polyfill: 4.0.10 + dev: false + + /node-forge@1.3.1: + resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} + engines: {node: '>= 6.13.0'} + dev: false + + /node-releases@2.0.13: + resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} + + /node-watch@0.7.4: + resolution: {integrity: sha512-RinNxoz4W1cep1b928fuFhvAQ5ag/+1UlMDV7rbyGthBIgsiEouS4kvRayvvboxii4m8eolKOIBo3OjDqbc+uQ==} + engines: {node: '>=6'} + dev: false + + /noms@0.0.0: + resolution: {integrity: sha512-lNDU9VJaOPxUmXcLb+HQFeUgQQPtMI24Gt6hgfuMHRJgMRHMF/qZ4HJD3GDru4sSw9IQl2jPjAYnQrdIeLbwow==} + dependencies: + inherits: 2.0.4 + readable-stream: 1.0.34 + dev: true + + /non-layered-tidy-tree-layout@2.0.2: + resolution: {integrity: sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw==} + + /normalize-package-data@2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + dependencies: + hosted-git-info: 2.8.9 + resolve: 1.22.8 + semver: 5.7.2 + validate-npm-package-license: 3.0.4 + dev: false + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + /normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + dev: false + + /normalize-url@6.1.0: + resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} + engines: {node: '>=10'} + + /normalize-url@8.0.0: + resolution: {integrity: sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==} + engines: {node: '>=14.16'} + dev: false + + /npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + dependencies: + path-key: 3.1.1 + dev: false + + /npm-run-path@5.1.0: + resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + path-key: 4.0.0 + dev: false + + /nprogress@0.2.0: + resolution: {integrity: sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==} + dev: false + + /nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + dependencies: + boolbase: 1.0.0 + + /nwsapi@2.2.7: + resolution: {integrity: sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==} + dev: true + + /object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + /object-inspect@1.13.1: + resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + + /object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + dev: false + + /object.assign@4.1.4: + resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + has-symbols: 1.0.3 + object-keys: 1.1.1 + dev: false + + /obuf@1.1.2: + resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} + dev: false + + /on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + dependencies: + ee-first: 1.1.1 + dev: false + + /on-headers@1.0.2: + resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} + engines: {node: '>= 0.8'} + dev: false + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + + /onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + dependencies: + mimic-fn: 2.1.0 + dev: false + + /onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + dependencies: + mimic-fn: 4.0.0 + dev: false + + /onigasm@2.2.5: + resolution: {integrity: sha512-F+th54mPc0l1lp1ZcFMyL/jTs2Tlq4SqIHKIXGZOR/VkHkF9A7Fr5rRr5+ZG/lWeRsyrClLYRq7s/yFQ/XhWCA==} + dependencies: + lru-cache: 5.1.1 + dev: false + + /open@7.4.2: + resolution: {integrity: sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==} + engines: {node: '>=8'} + dependencies: + is-docker: 2.2.1 + is-wsl: 2.2.0 + dev: false + + /open@8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + dependencies: + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 + + /open@9.1.0: + resolution: {integrity: sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==} + engines: {node: '>=14.16'} + dependencies: + default-browser: 4.0.0 + define-lazy-prop: 3.0.0 + is-inside-container: 1.0.0 + is-wsl: 2.2.0 + dev: false + + /opener@1.5.2: + resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==} + hasBin: true + dev: false + + /optionator@0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + engines: {node: '>= 0.8.0'} + dependencies: + '@aashutoshrathi/word-wrap': 1.2.6 + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + + /os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + dev: false + + /p-cancelable@3.0.0: + resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==} + engines: {node: '>=12.20'} + dev: false + + /p-finally@1.0.0: + resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} + engines: {node: '>=4'} + dev: true + + /p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + dependencies: + p-try: 2.2.0 + dev: false + + /p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + + /p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + yocto-queue: 1.0.0 + dev: false + + /p-locate@3.0.0: + resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} + engines: {node: '>=6'} + dependencies: + p-limit: 2.3.0 + dev: false + + /p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + dependencies: + p-limit: 2.3.0 + dev: false + + /p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 + + /p-locate@6.0.0: + resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + p-limit: 4.0.0 + dev: false + + /p-map@4.0.0: + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: '>=10'} + dependencies: + aggregate-error: 3.1.0 + dev: false + + /p-queue@6.6.2: + resolution: {integrity: sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==} + engines: {node: '>=8'} + dependencies: + eventemitter3: 4.0.7 + p-timeout: 3.2.0 + dev: true + + /p-retry@4.6.2: + resolution: {integrity: sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==} + engines: {node: '>=8'} + dependencies: + '@types/retry': 0.12.0 + retry: 0.13.1 + dev: false + + /p-timeout@3.2.0: + resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==} + engines: {node: '>=8'} + dependencies: + p-finally: 1.0.0 + dev: true + + /p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + dev: false + + /package-json@8.1.1: + resolution: {integrity: sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==} + engines: {node: '>=14.16'} + dependencies: + got: 12.6.1 + registry-auth-token: 5.0.2 + registry-url: 6.0.1 + semver: 7.5.4 + dev: false + + /param-case@3.0.4: + resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} + dependencies: + dot-case: 3.0.4 + tslib: 2.6.2 + + /parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + + /parent-module@2.0.0: + resolution: {integrity: sha512-uo0Z9JJeWzv8BG+tRcapBKNJ0dro9cLyczGzulS6EfeyAdeC9sbojtW6XwvYxJkEne9En+J2XEl4zyglVeIwFg==} + engines: {node: '>=8'} + dependencies: + callsites: 3.1.0 + dev: false + + /parse-entities@2.0.0: + resolution: {integrity: sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==} + dependencies: + character-entities: 1.2.4 + character-entities-legacy: 1.1.4 + character-reference-invalid: 1.1.4 + is-alphanumerical: 1.0.4 + is-decimal: 1.0.4 + is-hexadecimal: 1.0.4 + dev: false + + /parse-entities@4.0.1: + resolution: {integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==} + dependencies: + '@types/unist': 2.0.9 + character-entities: 2.0.2 + character-entities-legacy: 3.0.0 + character-reference-invalid: 2.0.1 + decode-named-character-reference: 1.0.2 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + is-hexadecimal: 2.0.1 + dev: false + + /parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + dependencies: + '@babel/code-frame': 7.22.13 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + dev: false + + /parse-numeric-range@1.3.0: + resolution: {integrity: sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==} + dev: false + + /parse-semver@1.1.1: + resolution: {integrity: sha512-Eg1OuNntBMH0ojvEKSrvDSnwLmvVuUOSdylH/pSCPNMIspLlweJyIWXCE+k/5hm3cj/EBUYwmWkjhBALNP4LXQ==} + dependencies: + semver: 5.7.2 + dev: true + + /parse5-htmlparser2-tree-adapter@7.0.0: + resolution: {integrity: sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==} + dependencies: + domhandler: 5.0.3 + parse5: 7.1.2 + + /parse5@6.0.1: + resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} + dev: true + + /parse5@7.1.2: + resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + dependencies: + entities: 4.5.0 + + /parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + dev: false + + /pascal-case@3.1.2: + resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} + dependencies: + no-case: 3.0.4 + tslib: 2.6.2 + + /patch-package@8.0.0: + resolution: {integrity: sha512-da8BVIhzjtgScwDJ2TtKsfT5JFWz1hYoBl9rUQ1f38MC2HwnEIkK8VN3dKMKcP7P7bvvgzNDbfNHtx3MsQb5vA==} + engines: {node: '>=14', npm: '>5'} + hasBin: true + dependencies: + '@yarnpkg/lockfile': 1.1.0 + chalk: 4.1.2 + ci-info: 3.9.0 + cross-spawn: 7.0.3 + find-yarn-workspace-root: 2.0.0 + fs-extra: 9.1.0 + json-stable-stringify: 1.0.2 + klaw-sync: 6.0.0 + minimist: 1.2.8 + open: 7.4.2 + rimraf: 2.7.1 + semver: 7.5.4 + slash: 2.0.0 + tmp: 0.0.33 + yaml: 2.3.3 + dev: false + + /path-case@3.0.4: + resolution: {integrity: sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==} + dependencies: + dot-case: 3.0.4 + tslib: 2.6.2 + + /path-exists@3.0.0: + resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} + engines: {node: '>=4'} + dev: false + + /path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + /path-exists@5.0.0: + resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: false + + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + /path-is-inside@1.0.2: + resolution: {integrity: sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==} + dev: false + + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + /path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + dev: false + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + /path-scurry@1.10.1: + resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + lru-cache: 10.0.1 + minipass: 7.0.4 + dev: true + + /path-to-regexp@0.1.7: + resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} + dev: false + + /path-to-regexp@1.8.0: + resolution: {integrity: sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==} + dependencies: + isarray: 0.0.1 + + /path-to-regexp@2.2.1: + resolution: {integrity: sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ==} + dev: false + + /path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + /pend@1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + dev: true + + /periscopic@3.1.0: + resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} + dependencies: + '@types/estree': 1.0.4 + estree-walker: 3.0.3 + is-reference: 3.0.2 + dev: false + + /picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + /pify@5.0.0: + resolution: {integrity: sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==} + engines: {node: '>=10'} + dev: true + + /pkg-dir@7.0.0: + resolution: {integrity: sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==} + engines: {node: '>=14.16'} + dependencies: + find-up: 6.3.0 + dev: false + + /pkg-up@3.1.0: + resolution: {integrity: sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==} + engines: {node: '>=8'} + dependencies: + find-up: 3.0.0 + dev: false + + /playwright-core@1.39.0: + resolution: {integrity: sha512-+k4pdZgs1qiM+OUkSjx96YiKsXsmb59evFoqv8SKO067qBA+Z2s/dCzJij/ZhdQcs2zlTAgRKfeiiLm8PQ2qvw==} + engines: {node: '>=16'} + hasBin: true + dev: true + + /playwright@1.39.0: + resolution: {integrity: sha512-naE5QT11uC/Oiq0BwZ50gDmy8c8WLPRTEWuSSFVG2egBka/1qMoSqYQcROMT9zLwJ86oPofcTH2jBY/5wWOgIw==} + engines: {node: '>=16'} + hasBin: true + dependencies: + playwright-core: 1.39.0 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /plist@3.1.0: + resolution: {integrity: sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==} + engines: {node: '>=10.4.0'} + dependencies: + '@xmldom/xmldom': 0.8.10 + base64-js: 1.5.1 + xmlbuilder: 15.1.1 + dev: false + + /pluralize@8.0.0: + resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} + engines: {node: '>=4'} + dev: false + + /postcss-calc@8.2.4(postcss@8.4.31): + resolution: {integrity: sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==} + peerDependencies: + postcss: ^8.2.2 + dependencies: + postcss: 8.4.31 + postcss-selector-parser: 6.0.13 + postcss-value-parser: 4.2.0 + + /postcss-colormin@5.3.1(postcss@8.4.31): + resolution: {integrity: sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + browserslist: 4.22.1 + caniuse-api: 3.0.0 + colord: 2.9.3 + postcss: 8.4.31 + postcss-value-parser: 4.2.0 + + /postcss-convert-values@5.1.3(postcss@8.4.31): + resolution: {integrity: sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + browserslist: 4.22.1 + postcss: 8.4.31 + postcss-value-parser: 4.2.0 + + /postcss-discard-comments@5.1.2(postcss@8.4.31): + resolution: {integrity: sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.31 + + /postcss-discard-duplicates@5.1.0(postcss@8.4.31): + resolution: {integrity: sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.31 + + /postcss-discard-empty@5.1.1(postcss@8.4.31): + resolution: {integrity: sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.31 + + /postcss-discard-overridden@5.1.0(postcss@8.4.31): + resolution: {integrity: sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.31 + + /postcss-discard-unused@5.1.0(postcss@8.4.31): + resolution: {integrity: sha512-KwLWymI9hbwXmJa0dkrzpRbSJEh0vVUd7r8t0yOGPcfKzyJJxFM8kLyC5Ev9avji6nY95pOp1W6HqIrfT+0VGw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.31 + postcss-selector-parser: 6.0.13 + dev: false + + /postcss-load-config@3.1.4(postcss@8.4.31): + resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} + engines: {node: '>= 10'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + dependencies: + lilconfig: 2.1.0 + postcss: 8.4.31 + yaml: 1.10.2 + dev: true + + /postcss-loader@7.3.3(postcss@8.4.31)(typescript@5.2.2)(webpack@5.89.0): + resolution: {integrity: sha512-YgO/yhtevGO/vJePCQmTxiaEwER94LABZN0ZMT4A0vsak9TpO+RvKRs7EmJ8peIlB9xfXCsS7M8LjqncsUZ5HA==} + engines: {node: '>= 14.15.0'} + peerDependencies: + postcss: ^7.0.0 || ^8.0.1 + webpack: ^5.0.0 + dependencies: + cosmiconfig: 8.3.6(typescript@5.2.2) + jiti: 1.21.0 + postcss: 8.4.31 + semver: 7.5.4 + webpack: 5.89.0(@swc/core@1.3.95) + transitivePeerDependencies: + - typescript + dev: false + + /postcss-merge-idents@5.1.1(postcss@8.4.31): + resolution: {integrity: sha512-pCijL1TREiCoog5nQp7wUe+TUonA2tC2sQ54UGeMmryK3UFGIYKqDyjnqd6RcuI4znFn9hWSLNN8xKE/vWcUQw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + cssnano-utils: 3.1.0(postcss@8.4.31) + postcss: 8.4.31 + postcss-value-parser: 4.2.0 + dev: false + + /postcss-merge-longhand@5.1.7(postcss@8.4.31): + resolution: {integrity: sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.31 + postcss-value-parser: 4.2.0 + stylehacks: 5.1.1(postcss@8.4.31) + + /postcss-merge-rules@5.1.4(postcss@8.4.31): + resolution: {integrity: sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + browserslist: 4.22.1 + caniuse-api: 3.0.0 + cssnano-utils: 3.1.0(postcss@8.4.31) + postcss: 8.4.31 + postcss-selector-parser: 6.0.13 + + /postcss-minify-font-values@5.1.0(postcss@8.4.31): + resolution: {integrity: sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.31 + postcss-value-parser: 4.2.0 + + /postcss-minify-gradients@5.1.1(postcss@8.4.31): + resolution: {integrity: sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + colord: 2.9.3 + cssnano-utils: 3.1.0(postcss@8.4.31) + postcss: 8.4.31 + postcss-value-parser: 4.2.0 + + /postcss-minify-params@5.1.4(postcss@8.4.31): + resolution: {integrity: sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + browserslist: 4.22.1 + cssnano-utils: 3.1.0(postcss@8.4.31) + postcss: 8.4.31 + postcss-value-parser: 4.2.0 + + /postcss-minify-selectors@5.2.1(postcss@8.4.31): + resolution: {integrity: sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.31 + postcss-selector-parser: 6.0.13 + + /postcss-modules-extract-imports@3.0.0(postcss@8.4.31): + resolution: {integrity: sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + dependencies: + postcss: 8.4.31 + + /postcss-modules-local-by-default@4.0.3(postcss@8.4.31): + resolution: {integrity: sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + dependencies: + icss-utils: 5.1.0(postcss@8.4.31) + postcss: 8.4.31 + postcss-selector-parser: 6.0.13 + postcss-value-parser: 4.2.0 + + /postcss-modules-scope@3.0.0(postcss@8.4.31): + resolution: {integrity: sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + dependencies: + postcss: 8.4.31 + postcss-selector-parser: 6.0.13 + + /postcss-modules-values@4.0.0(postcss@8.4.31): + resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + dependencies: + icss-utils: 5.1.0(postcss@8.4.31) + postcss: 8.4.31 + + /postcss-modules@4.3.1(postcss@8.4.31): + resolution: {integrity: sha512-ItUhSUxBBdNamkT3KzIZwYNNRFKmkJrofvC2nWab3CPKhYBQ1f27XXh1PAPE27Psx58jeelPsxWB/+og+KEH0Q==} + peerDependencies: + postcss: ^8.0.0 + dependencies: + generic-names: 4.0.0 + icss-replace-symbols: 1.1.0 + lodash.camelcase: 4.3.0 + postcss: 8.4.31 + postcss-modules-extract-imports: 3.0.0(postcss@8.4.31) + postcss-modules-local-by-default: 4.0.3(postcss@8.4.31) + postcss-modules-scope: 3.0.0(postcss@8.4.31) + postcss-modules-values: 4.0.0(postcss@8.4.31) + string-hash: 1.1.3 + dev: true + + /postcss-normalize-charset@5.1.0(postcss@8.4.31): + resolution: {integrity: sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.31 + + /postcss-normalize-display-values@5.1.0(postcss@8.4.31): + resolution: {integrity: sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.31 + postcss-value-parser: 4.2.0 + + /postcss-normalize-positions@5.1.1(postcss@8.4.31): + resolution: {integrity: sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.31 + postcss-value-parser: 4.2.0 + + /postcss-normalize-repeat-style@5.1.1(postcss@8.4.31): + resolution: {integrity: sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.31 + postcss-value-parser: 4.2.0 + + /postcss-normalize-string@5.1.0(postcss@8.4.31): + resolution: {integrity: sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.31 + postcss-value-parser: 4.2.0 + + /postcss-normalize-timing-functions@5.1.0(postcss@8.4.31): + resolution: {integrity: sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.31 + postcss-value-parser: 4.2.0 + + /postcss-normalize-unicode@5.1.1(postcss@8.4.31): + resolution: {integrity: sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + browserslist: 4.22.1 + postcss: 8.4.31 + postcss-value-parser: 4.2.0 + + /postcss-normalize-url@5.1.0(postcss@8.4.31): + resolution: {integrity: sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + normalize-url: 6.1.0 + postcss: 8.4.31 + postcss-value-parser: 4.2.0 + + /postcss-normalize-whitespace@5.1.1(postcss@8.4.31): + resolution: {integrity: sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.31 + postcss-value-parser: 4.2.0 + + /postcss-ordered-values@5.1.3(postcss@8.4.31): + resolution: {integrity: sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + cssnano-utils: 3.1.0(postcss@8.4.31) + postcss: 8.4.31 + postcss-value-parser: 4.2.0 + + /postcss-reduce-idents@5.2.0(postcss@8.4.31): + resolution: {integrity: sha512-BTrLjICoSB6gxbc58D5mdBK8OhXRDqud/zodYfdSi52qvDHdMwk+9kB9xsM8yJThH/sZU5A6QVSmMmaN001gIg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.31 + postcss-value-parser: 4.2.0 + dev: false + + /postcss-reduce-initial@5.1.2(postcss@8.4.31): + resolution: {integrity: sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + browserslist: 4.22.1 + caniuse-api: 3.0.0 + postcss: 8.4.31 + + /postcss-reduce-transforms@5.1.0(postcss@8.4.31): + resolution: {integrity: sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.31 + postcss-value-parser: 4.2.0 + + /postcss-selector-parser@6.0.13: + resolution: {integrity: sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==} + engines: {node: '>=4'} + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + /postcss-sort-media-queries@4.4.1(postcss@8.4.31): + resolution: {integrity: sha512-QDESFzDDGKgpiIh4GYXsSy6sek2yAwQx1JASl5AxBtU1Lq2JfKBljIPNdil989NcSKRQX1ToiaKphImtBuhXWw==} + engines: {node: '>=10.0.0'} + peerDependencies: + postcss: ^8.4.16 + dependencies: + postcss: 8.4.31 + sort-css-media-queries: 2.1.0 + dev: false + + /postcss-svgo@5.1.0(postcss@8.4.31): + resolution: {integrity: sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.31 + postcss-value-parser: 4.2.0 + svgo: 2.8.0 + + /postcss-unique-selectors@5.1.1(postcss@8.4.31): + resolution: {integrity: sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.31 + postcss-selector-parser: 6.0.13 + + /postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + /postcss-zindex@5.1.0(postcss@8.4.31): + resolution: {integrity: sha512-fgFMf0OtVSBR1va1JNHYgMxYk73yhn/qb4uQDq1DLGYolz8gHCyr/sesEuGUaYs58E3ZJRcpoGuPVoB7Meiq9A==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.31 + dev: false + + /postcss@8.4.31: + resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.6 + picocolors: 1.0.0 + source-map-js: 1.0.2 + + /prebuild-install@7.1.1: + resolution: {integrity: sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==} + engines: {node: '>=10'} + hasBin: true + requiresBuild: true + dependencies: + detect-libc: 2.0.2 + expand-template: 2.0.3 + github-from-package: 0.0.0 + minimist: 1.2.8 + mkdirp-classic: 0.5.3 + napi-build-utils: 1.0.2 + node-abi: 3.51.0 + pump: 3.0.0 + rc: 1.2.8 + simple-get: 4.0.1 + tar-fs: 2.1.1 + tunnel-agent: 0.6.0 + optional: true + + /prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + /prettier-linter-helpers@1.0.0: + resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + engines: {node: '>=6.0.0'} + dependencies: + fast-diff: 1.3.0 + dev: false + + /prettier-plugin-organize-imports@3.2.3(prettier@3.1.0)(typescript@5.2.2): + resolution: {integrity: sha512-KFvk8C/zGyvUaE3RvxN2MhCLwzV6OBbFSkwZ2OamCrs9ZY4i5L77jQ/w4UmUr+lqX8qbaqVq6bZZkApn+IgJSg==} + peerDependencies: + '@volar/vue-language-plugin-pug': ^1.0.4 + '@volar/vue-typescript': ^1.0.4 + prettier: '>=2.0' + typescript: '>=2.9' + peerDependenciesMeta: + '@volar/vue-language-plugin-pug': + optional: true + '@volar/vue-typescript': + optional: true + dependencies: + prettier: 3.1.0 + typescript: 5.2.2 + dev: true + + /prettier@2.7.1: + resolution: {integrity: sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==} + engines: {node: '>=10.13.0'} + hasBin: true + dev: false + + /prettier@2.8.7: + resolution: {integrity: sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==} + engines: {node: '>=10.13.0'} + hasBin: true + dev: true + + /prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + dev: false + + /prettier@3.1.0: + resolution: {integrity: sha512-TQLvXjq5IAibjh8EpBIkNKxO749UEWABoiIZehEPiY4GNpVdhaFKqSTu+QrlU6D2dPAfubRmtJTi4K4YkQ5eXw==} + engines: {node: '>=14'} + hasBin: true + + /pretty-error@4.0.0: + resolution: {integrity: sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==} + dependencies: + lodash: 4.17.21 + renderkid: 3.0.0 + dev: false + + /pretty-time@1.1.0: + resolution: {integrity: sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==} + engines: {node: '>=4'} + dev: false + + /prex@0.4.9: + resolution: {integrity: sha512-pQCB9AH8MXQRBaelDkhnTkqY6GRiXt1xWlx2hBReZYZwVA0m7EQcnF/K55zr87cCADDHmdD+qq7G6a8Pu+BRFA==} + deprecated: This package has been deprecated in favor of several '@esfx/*' packages that replace it. Please see the README for more information + dependencies: + '@esfx/cancelable': 1.0.0 + '@esfx/disposable': 1.0.0 + dev: true + + /prism-react-renderer@2.1.0(react@18.2.0): + resolution: {integrity: sha512-I5cvXHjA1PVGbGm1MsWCpvBCRrYyxEri0MC7/JbfIfYfcXAxHyO5PaUjs3A8H5GW6kJcLhTHxxMaOZZpRZD2iQ==} + peerDependencies: + react: '>=16.0.0' + dependencies: + '@types/prismjs': 1.26.2 + clsx: 1.2.1 + react: 18.2.0 + dev: false + + /prism-themes@1.9.0: + resolution: {integrity: sha512-tX2AYsehKDw1EORwBps+WhBFKc2kxfoFpQAjxBndbZKr4fRmMkv47XN0BghC/K1qwodB1otbe4oF23vUTFDokw==} + dev: true + + /prismjs@1.27.0: + resolution: {integrity: sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==} + engines: {node: '>=6'} + dev: false + + /prismjs@1.29.0: + resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==} + engines: {node: '>=6'} + dev: false + + /process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + /process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + dev: false + + /promise-debounce@1.0.1: + resolution: {integrity: sha512-jq3Crngf1DaaOXQIOUkPr7LsW4UsWyn0KW1MJ+yMn5njTJ+F1AuHmjjwJhod9HuoNSSMspSLS9PS3V7BrexwjQ==} + dev: true + + /promise.series@0.2.0: + resolution: {integrity: sha512-VWQJyU2bcDTgZw8kpfBpB/ejZASlCrzwz5f2hjb/zlujOEB4oeiAhHygAWq8ubsX2GVkD4kCU5V2dwOTaCY5EQ==} + engines: {node: '>=0.12'} + dev: true + + /promise@7.3.1: + resolution: {integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==} + dependencies: + asap: 2.0.6 + dev: false + + /prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + dev: false + + /prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + + /property-information@5.6.0: + resolution: {integrity: sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==} + dependencies: + xtend: 4.0.2 + dev: false + + /property-information@6.4.0: + resolution: {integrity: sha512-9t5qARVofg2xQqKtytzt+lZ4d1Qvj8t5B8fEwXK6qOfgRLgH/b13QlgEyDh033NOS31nXeFbYv7CLUDG1CeifQ==} + dev: false + + /proto-list@1.2.4: + resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} + dev: false + + /proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + dev: false + + /proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + dev: false + + /psl@1.9.0: + resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} + dev: true + + /pump@3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + requiresBuild: true + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + optional: true + + /punycode@1.4.1: + resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} + dev: false + + /punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + /pupa@3.1.0: + resolution: {integrity: sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==} + engines: {node: '>=12.20'} + dependencies: + escape-goat: 4.0.0 + dev: false + + /pure-color@1.3.0: + resolution: {integrity: sha512-QFADYnsVoBMw1srW7OVKEYjG+MbIa49s54w1MA1EDY6r2r/sTcKKYqRX1f4GYvnXP7eN/Pe9HFcX+hwzmrXRHA==} + dev: false + + /qs@6.11.0: + resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} + engines: {node: '>=0.6'} + dependencies: + side-channel: 1.0.4 + dev: false + + /qs@6.11.2: + resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==} + engines: {node: '>=0.6'} + dependencies: + side-channel: 1.0.4 + + /querystringify@2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + /queue@6.0.2: + resolution: {integrity: sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==} + dependencies: + inherits: 2.0.4 + dev: false + + /quick-lru@5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} + dev: false + + /rambda@7.5.0: + resolution: {integrity: sha512-y/M9weqWAH4iopRd7EHDEQQvpFPHj1AA3oHozE9tfITHUtTR7Z9PSlIRRG2l1GuW7sefC1cXFfIcF+cgnShdBA==} + dev: false + + /ramda-adjunct@4.1.1(ramda@0.29.1): + resolution: {integrity: sha512-BnCGsZybQZMDGram9y7RiryoRHS5uwx8YeGuUeDKuZuvK38XO6JJfmK85BwRWAKFA6pZ5nZBO/HBFtExVaf31w==} + engines: {node: '>=0.10.3'} + peerDependencies: + ramda: '>= 0.29.0' + dependencies: + ramda: 0.29.1 + dev: false + + /ramda@0.29.1: + resolution: {integrity: sha512-OfxIeWzd4xdUNxlWhgFazxsA/nl3mS4/jGZI5n00uWOoSSFRhC1b6gl6xvmzUamgmqELraWp0J/qqVlXYPDPyA==} + dev: false + + /randexp@0.5.3: + resolution: {integrity: sha512-U+5l2KrcMNOUPYvazA3h5ekF80FHTUG+87SEAmHZmolh1M+i/WyTCxVzmi+tidIa1tM4BSe8g2Y/D3loWDjj+w==} + engines: {node: '>=4'} + dependencies: + drange: 1.1.1 + ret: 0.2.2 + dev: false + + /randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + dependencies: + safe-buffer: 5.2.1 + + /range-parser@1.2.0: + resolution: {integrity: sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==} + engines: {node: '>= 0.6'} + dev: false + + /range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + dev: false + + /raw-body@2.5.1: + resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} + engines: {node: '>= 0.8'} + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + dev: false + + /raw-loader@4.0.2(webpack@5.89.0): + resolution: {integrity: sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==} + engines: {node: '>= 10.13.0'} + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + dependencies: + loader-utils: 2.0.4 + schema-utils: 3.3.0 + webpack: 5.89.0(@swc/core@1.3.95) + dev: true + + /rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + + /react-base16-styling@0.6.0: + resolution: {integrity: sha512-yvh/7CArceR/jNATXOKDlvTnPKPmGZz7zsenQ3jUwLzHkNUR0CvY3yGYJbWJ/nnxsL8Sgmt5cO3/SILVuPO6TQ==} + dependencies: + base16: 1.0.0 + lodash.curry: 4.1.1 + lodash.flow: 3.5.0 + pure-color: 1.3.0 + dev: false + + /react-copy-to-clipboard@5.1.0(react@18.2.0): + resolution: {integrity: sha512-k61RsNgAayIJNoy9yDsYzDe/yAZAzEbEgcz3DZMhF686LEyukcE1hzurxe85JandPUG+yTfGVFzuEw3xt8WP/A==} + peerDependencies: + react: ^15.3.0 || 16 || 17 || 18 + dependencies: + copy-to-clipboard: 3.3.3 + prop-types: 15.8.1 + react: 18.2.0 + dev: false + + /react-debounce-input@3.3.0(react@18.2.0): + resolution: {integrity: sha512-VEqkvs8JvY/IIZvh71Z0TC+mdbxERvYF33RcebnodlsUZ8RSgyKe2VWaHXv4+/8aoOgXLxWrdsYs2hDhcwbUgA==} + peerDependencies: + react: ^15.3.0 || 16 || 17 || 18 + dependencies: + lodash.debounce: 4.0.8 + prop-types: 15.8.1 + react: 18.2.0 + dev: false + + /react-dev-utils@12.0.1(eslint@8.52.0)(typescript@5.2.2)(webpack@5.89.0): + resolution: {integrity: sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==} + engines: {node: '>=14'} + dependencies: + '@babel/code-frame': 7.22.13 + address: 1.2.2 + browserslist: 4.22.1 + chalk: 4.1.2 + cross-spawn: 7.0.3 + detect-port-alt: 1.1.6 + escape-string-regexp: 4.0.0 + filesize: 8.0.7 + find-up: 5.0.0 + fork-ts-checker-webpack-plugin: 6.5.3(eslint@8.52.0)(typescript@5.2.2)(webpack@5.89.0) + global-modules: 2.0.0 + globby: 11.1.0 + gzip-size: 6.0.0 + immer: 9.0.21 + is-root: 2.1.0 + loader-utils: 3.2.1 + open: 8.4.2 + pkg-up: 3.1.0 + prompts: 2.4.2 + react-error-overlay: 6.0.11 + recursive-readdir: 2.2.3 + shell-quote: 1.8.1 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - eslint + - typescript + - vue-template-compiler + - webpack + dev: false + + /react-dom@18.2.0(react@18.2.0): + resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} + peerDependencies: + react: ^18.2.0 + dependencies: + loose-envify: 1.4.0 + react: 18.2.0 + scheduler: 0.23.0 + + /react-error-overlay@6.0.11: + resolution: {integrity: sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==} + dev: false + + /react-fast-compare@3.2.2: + resolution: {integrity: sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==} + + /react-helmet-async@1.3.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg==} + peerDependencies: + react: ^16.6.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.6.0 || ^17.0.0 || ^18.0.0 + dependencies: + '@babel/runtime': 7.23.2 + invariant: 2.2.4 + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-fast-compare: 3.2.2 + shallowequal: 1.1.0 + + /react-immutable-proptypes@2.2.0(immutable@3.8.2): + resolution: {integrity: sha512-Vf4gBsePlwdGvSZoLSBfd4HAP93HDauMY4fDjXhreg/vg6F3Fj/MXDNyTbltPC/xZKmZc+cjLu3598DdYK6sgQ==} + peerDependencies: + immutable: '>=3.6.2' + dependencies: + immutable: 3.8.2 + invariant: 2.2.4 + dev: false + + /react-immutable-pure-component@2.2.2(immutable@3.8.2)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-vkgoMJUDqHZfXXnjVlG3keCxSO/U6WeDQ5/Sl0GK2cH8TOxEzQ5jXqDXHEL/jqk6fsNxV05oH5kD7VNMUE2k+A==} + peerDependencies: + immutable: '>= 2 || >= 4.0.0-rc' + react: '>= 16.6' + react-dom: '>= 16.6' + dependencies: + immutable: 3.8.2 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /react-inspector@6.0.2(react@18.2.0): + resolution: {integrity: sha512-x+b7LxhmHXjHoU/VrFAzw5iutsILRoYyDq97EDYdFpPLcvqtEzk4ZSZSQjnFPbr5T57tLXnHcqFYoN1pI6u8uQ==} + peerDependencies: + react: ^16.8.4 || ^17.0.0 || ^18.0.0 + dependencies: + react: 18.2.0 + dev: false + + /react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + /react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + dev: false + + /react-is@18.1.0: + resolution: {integrity: sha512-Fl7FuabXsJnV5Q1qIOQwx/sagGF18kogb4gpfcG4gjLBWO0WDiiz1ko/ExayuxE7InyQkBLkxRFG5oxY6Uu3Kg==} + dev: false + + /react-lifecycles-compat@3.0.4: + resolution: {integrity: sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==} + dev: false + + /react-loadable-ssr-addon-v5-slorber@1.0.1(@docusaurus/react-loadable@5.5.2)(webpack@5.89.0): + resolution: {integrity: sha512-lq3Lyw1lGku8zUEJPDxsNm1AfYHBrO9Y1+olAYwpUJ2IGFBskM0DMKok97A6LWUpHm+o7IvQBOWu9MLenp9Z+A==} + engines: {node: '>=10.13.0'} + peerDependencies: + react-loadable: '*' + webpack: '>=4.41.1 || 5.x' + dependencies: + '@babel/runtime': 7.23.2 + react-loadable: /@docusaurus/react-loadable@5.5.2(react@18.2.0) + webpack: 5.89.0(@swc/core@1.3.95) + dev: false + + /react-redux@8.1.3(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(redux@4.2.1): + resolution: {integrity: sha512-n0ZrutD7DaX/j9VscF+uTALI3oUPa/pO4Z3soOBIjuRn/FzVu6aehhysxZCLi6y7duMf52WNZGMl7CtuK5EnRw==} + peerDependencies: + '@types/react': ^16.8 || ^17.0 || ^18.0 + '@types/react-dom': ^16.8 || ^17.0 || ^18.0 + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + react-native: '>=0.59' + redux: ^4 || ^5.0.0-beta.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + react-dom: + optional: true + react-native: + optional: true + redux: + optional: true + dependencies: + '@babel/runtime': 7.23.2 + '@types/hoist-non-react-statics': 3.3.4 + '@types/react': 18.2.34 + '@types/react-dom': 18.2.14 + '@types/use-sync-external-store': 0.0.3 + hoist-non-react-statics: 3.3.2 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-is: 18.1.0 + redux: 4.2.1 + use-sync-external-store: 1.2.0(react@18.2.0) + dev: false + + /react-refresh@0.14.0: + resolution: {integrity: sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==} + engines: {node: '>=0.10.0'} + + /react-router-config@5.1.1(react-router@5.3.4)(react@18.2.0): + resolution: {integrity: sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg==} + peerDependencies: + react: '>=15' + react-router: '>=5' + dependencies: + '@babel/runtime': 7.23.2 + react: 18.2.0 + react-router: 5.3.4(react@18.2.0) + dev: false + + /react-router-dom@5.3.4(react@18.2.0): + resolution: {integrity: sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ==} + peerDependencies: + react: '>=15' + dependencies: + '@babel/runtime': 7.23.2 + history: 4.10.1 + loose-envify: 1.4.0 + prop-types: 15.8.1 + react: 18.2.0 + react-router: 5.3.4(react@18.2.0) + tiny-invariant: 1.3.1 + tiny-warning: 1.0.3 + dev: false + + /react-router@5.3.4(react@18.2.0): + resolution: {integrity: sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==} + peerDependencies: + react: '>=15' + dependencies: + '@babel/runtime': 7.23.2 + history: 4.10.1 + hoist-non-react-statics: 3.3.2 + loose-envify: 1.4.0 + path-to-regexp: 1.8.0 + prop-types: 15.8.1 + react: 18.2.0 + react-is: 16.13.1 + tiny-invariant: 1.3.1 + tiny-warning: 1.0.3 + dev: false + + /react-syntax-highlighter@15.5.0(react@18.2.0): + resolution: {integrity: sha512-+zq2myprEnQmH5yw6Gqc8lD55QHnpKaU8TOcFeC/Lg/MQSs8UknEA0JC4nTZGFAXC2J2Hyj/ijJ7NlabyPi2gg==} + peerDependencies: + react: '>= 0.14.0' + dependencies: + '@babel/runtime': 7.23.2 + highlight.js: 10.7.3 + lowlight: 1.20.0 + prismjs: 1.29.0 + react: 18.2.0 + refractor: 3.6.0 + dev: false + + /react-textarea-autosize@8.3.4(@types/react@18.2.34)(react@18.2.0): + resolution: {integrity: sha512-CdtmP8Dc19xL8/R6sWvtknD/eCXkQr30dtvC4VmGInhRsfF8X/ihXCq6+9l9qbxmKRiq407/7z5fxE7cVWQNgQ==} + engines: {node: '>=10'} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + '@babel/runtime': 7.23.2 + react: 18.2.0 + use-composed-ref: 1.3.0(react@18.2.0) + use-latest: 1.2.1(@types/react@18.2.34)(react@18.2.0) + transitivePeerDependencies: + - '@types/react' + dev: false + + /react-transition-group@4.4.5(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==} + peerDependencies: + react: '>=16.6.0' + react-dom: '>=16.6.0' + dependencies: + '@babel/runtime': 7.23.2 + dom-helpers: 5.2.1 + loose-envify: 1.4.0 + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /react@18.2.0: + resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} + engines: {node: '>=0.10.0'} + dependencies: + loose-envify: 1.4.0 + + /read-pkg-up@7.0.1: + resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} + engines: {node: '>=8'} + dependencies: + find-up: 4.1.0 + read-pkg: 5.2.0 + type-fest: 0.8.1 + dev: false + + /read-pkg@5.2.0: + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} + engines: {node: '>=8'} + dependencies: + '@types/normalize-package-data': 2.4.3 + normalize-package-data: 2.5.0 + parse-json: 5.2.0 + type-fest: 0.6.0 + dev: false + + /read@1.0.7: + resolution: {integrity: sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==} + engines: {node: '>=0.8'} + dependencies: + mute-stream: 0.0.8 + dev: true + + /readable-stream@1.0.34: + resolution: {integrity: sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==} + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 0.0.1 + string_decoder: 0.10.31 + dev: true + + /readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + /readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + /readable-stream@4.4.2: + resolution: {integrity: sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + abort-controller: 3.0.0 + buffer: 6.0.3 + events: 3.3.0 + process: 0.11.10 + string_decoder: 1.3.0 + dev: false + + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + + /reading-time@1.5.0: + resolution: {integrity: sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==} + dev: false + + /rechoir@0.6.2: + resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} + engines: {node: '>= 0.10'} + dependencies: + resolve: 1.22.8 + dev: false + + /recursive-readdir@2.2.3: + resolution: {integrity: sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==} + engines: {node: '>=6.0.0'} + dependencies: + minimatch: 3.1.2 + dev: false + + /reduce-flatten@2.0.0: + resolution: {integrity: sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==} + engines: {node: '>=6'} + dev: true + + /redux-immutable@4.0.0(immutable@3.8.2): + resolution: {integrity: sha512-SchSn/DWfGb3oAejd+1hhHx01xUoxY+V7TeK0BKqpkLKiQPVFf7DYzEaKmrEVxsWxielKfSK9/Xq66YyxgR1cg==} + peerDependencies: + immutable: ^3.8.1 || ^4.0.0-rc.1 + dependencies: + immutable: 3.8.2 + dev: false + + /redux@4.2.1: + resolution: {integrity: sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==} + dependencies: + '@babel/runtime': 7.23.2 + dev: false + + /refractor@3.6.0: + resolution: {integrity: sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==} + dependencies: + hastscript: 6.0.0 + parse-entities: 2.0.0 + prismjs: 1.27.0 + dev: false + + /regenerate-unicode-properties@10.1.1: + resolution: {integrity: sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==} + engines: {node: '>=4'} + dependencies: + regenerate: 1.4.2 + dev: false + + /regenerate@1.4.2: + resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} + dev: false + + /regenerator-runtime@0.14.0: + resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==} + + /regenerator-transform@0.15.2: + resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} + dependencies: + '@babel/runtime': 7.23.2 + dev: false + + /regexp-tree@0.1.27: + resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} + hasBin: true + dev: false + + /regexpu-core@5.3.2: + resolution: {integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==} + engines: {node: '>=4'} + dependencies: + '@babel/regjsgen': 0.8.0 + regenerate: 1.4.2 + regenerate-unicode-properties: 10.1.1 + regjsparser: 0.9.1 + unicode-match-property-ecmascript: 2.0.0 + unicode-match-property-value-ecmascript: 2.1.0 + dev: false + + /registry-auth-token@5.0.2: + resolution: {integrity: sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==} + engines: {node: '>=14'} + dependencies: + '@pnpm/npm-conf': 2.2.2 + dev: false + + /registry-url@6.0.1: + resolution: {integrity: sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==} + engines: {node: '>=12'} + dependencies: + rc: 1.2.8 + dev: false + + /regjsparser@0.10.0: + resolution: {integrity: sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==} + hasBin: true + dependencies: + jsesc: 0.5.0 + dev: false + + /regjsparser@0.9.1: + resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==} + hasBin: true + dependencies: + jsesc: 0.5.0 + dev: false + + /rehype-raw@7.0.0: + resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} + dependencies: + '@types/hast': 3.0.2 + hast-util-raw: 9.0.1 + vfile: 6.0.1 + dev: false + + /relateurl@0.2.7: + resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} + engines: {node: '>= 0.10'} + dev: false + + /remark-directive@3.0.0: + resolution: {integrity: sha512-l1UyWJ6Eg1VPU7Hm/9tt0zKtReJQNOA4+iDMAxTyZNWnJnFlbS/7zhiel/rogTLQ2vMYwDzSJa4BiVNqGlqIMA==} + dependencies: + '@types/mdast': 4.0.2 + mdast-util-directive: 3.0.0 + micromark-extension-directive: 3.0.0 + unified: 11.0.4 + transitivePeerDependencies: + - supports-color + dev: false + + /remark-emoji@4.0.1: + resolution: {integrity: sha512-fHdvsTR1dHkWKev9eNyhTo4EFwbUvJ8ka9SgeWkMPYFX4WoI7ViVBms3PjlQYgw5TLvNQso3GUB/b/8t3yo+dg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + '@types/mdast': 4.0.2 + emoticon: 4.0.1 + mdast-util-find-and-replace: 3.0.1 + node-emoji: 2.1.0 + unified: 11.0.4 + dev: false + + /remark-frontmatter@5.0.0: + resolution: {integrity: sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==} + dependencies: + '@types/mdast': 4.0.2 + mdast-util-frontmatter: 2.0.1 + micromark-extension-frontmatter: 2.0.0 + unified: 11.0.4 + transitivePeerDependencies: + - supports-color + dev: false + + /remark-gfm@4.0.0: + resolution: {integrity: sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==} + dependencies: + '@types/mdast': 4.0.2 + mdast-util-gfm: 3.0.0 + micromark-extension-gfm: 3.0.0 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.4 + transitivePeerDependencies: + - supports-color + dev: false + + /remark-mdx@3.0.0: + resolution: {integrity: sha512-O7yfjuC6ra3NHPbRVxfflafAj3LTwx3b73aBvkEFU5z4PsD6FD4vrqJAkE5iNGLz71GdjXfgRqm3SQ0h0VuE7g==} + dependencies: + mdast-util-mdx: 3.0.0 + micromark-extension-mdxjs: 3.0.0 + transitivePeerDependencies: + - supports-color + dev: false + + /remark-parse@11.0.0: + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + dependencies: + '@types/mdast': 4.0.2 + mdast-util-from-markdown: 2.0.0 + micromark-util-types: 2.0.0 + unified: 11.0.4 + transitivePeerDependencies: + - supports-color + dev: false + + /remark-rehype@11.0.0: + resolution: {integrity: sha512-vx8x2MDMcxuE4lBmQ46zYUDfcFMmvg80WYX+UNLeG6ixjdCCLcw1lrgAukwBTuOFsS78eoAedHGn9sNM0w7TPw==} + dependencies: + '@types/hast': 3.0.2 + '@types/mdast': 4.0.2 + mdast-util-to-hast: 13.0.2 + unified: 11.0.4 + vfile: 6.0.1 + dev: false + + /remark-stringify@11.0.0: + resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + dependencies: + '@types/mdast': 4.0.2 + mdast-util-to-markdown: 2.1.0 + unified: 11.0.4 + dev: false + + /remarkable@2.0.1: + resolution: {integrity: sha512-YJyMcOH5lrR+kZdmB0aJJ4+93bEojRZ1HGDn9Eagu6ibg7aVZhc3OWbbShRid+Q5eAfsEqWxpe+g5W5nYNfNiA==} + engines: {node: '>= 6.0.0'} + hasBin: true + dependencies: + argparse: 1.0.10 + autolinker: 3.16.2 + dev: false + + /renderkid@3.0.0: + resolution: {integrity: sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==} + dependencies: + css-select: 4.3.0 + dom-converter: 0.2.0 + htmlparser2: 6.1.0 + lodash: 4.17.21 + strip-ansi: 6.0.1 + dev: false + + /repeat-string@1.6.1: + resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} + engines: {node: '>=0.10'} + dev: false + + /require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + /require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + /require-like@0.1.2: + resolution: {integrity: sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A==} + dev: false + + /requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + + /reselect@4.1.8: + resolution: {integrity: sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==} + dev: false + + /resolve-alpn@1.2.1: + resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + dev: false + + /resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + /resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + /resolve-global@1.0.0: + resolution: {integrity: sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==} + engines: {node: '>=8'} + dependencies: + global-dirs: 0.1.1 + dev: false + + /resolve-pathname@3.0.0: + resolution: {integrity: sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==} + dev: false + + /resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + /responselike@3.0.0: + resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==} + engines: {node: '>=14.16'} + dependencies: + lowercase-keys: 3.0.0 + dev: false + + /ret@0.2.2: + resolution: {integrity: sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ==} + engines: {node: '>=4'} + dev: false + + /retry@0.13.1: + resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} + engines: {node: '>= 4'} + dev: false + + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + /rimraf@2.7.1: + resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} + hasBin: true + dependencies: + glob: 7.2.3 + dev: false + + /rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + dependencies: + glob: 7.2.3 + + /rimraf@5.0.5: + resolution: {integrity: sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==} + engines: {node: '>=14'} + hasBin: true + dependencies: + glob: 10.3.10 + dev: true + + /robust-predicates@3.0.2: + resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} + + /rollup-plugin-dts@6.1.0(rollup@3.29.4)(typescript@5.2.2): + resolution: {integrity: sha512-ijSCPICkRMDKDLBK9torss07+8dl9UpY9z1N/zTeA1cIqdzMlpkV3MOOC7zukyvQfDyxa1s3Dl2+DeiP/G6DOw==} + engines: {node: '>=16'} + peerDependencies: + rollup: ^3.29.4 || ^4 + typescript: ^4.5 || ^5.0 + dependencies: + magic-string: 0.30.5 + rollup: 3.29.4 + typescript: 5.2.2 + optionalDependencies: + '@babel/code-frame': 7.22.13 + dev: true + + /rollup-plugin-postcss@4.0.2(postcss@8.4.31): + resolution: {integrity: sha512-05EaY6zvZdmvPUDi3uCcAQoESDcYnv8ogJJQRp6V5kZ6J6P7uAVJlrTZcaaA20wTH527YTnKfkAoPxWI/jPp4w==} + engines: {node: '>=10'} + peerDependencies: + postcss: 8.x + dependencies: + chalk: 4.1.2 + concat-with-sourcemaps: 1.1.0 + cssnano: 5.1.15(postcss@8.4.31) + import-cwd: 3.0.0 + p-queue: 6.6.2 + pify: 5.0.0 + postcss: 8.4.31 + postcss-load-config: 3.1.4(postcss@8.4.31) + postcss-modules: 4.3.1(postcss@8.4.31) + promise.series: 0.2.0 + resolve: 1.22.8 + rollup-pluginutils: 2.8.2 + safe-identifier: 0.4.2 + style-inject: 0.3.0 + transitivePeerDependencies: + - ts-node + dev: true + + /rollup-plugin-visualizer@5.9.2(rollup@3.29.4): + resolution: {integrity: sha512-waHktD5mlWrYFrhOLbti4YgQCn1uR24nYsNuXxg7LkPH8KdTXVWR9DNY1WU0QqokyMixVXJS4J04HNrVTMP01A==} + engines: {node: '>=14'} + hasBin: true + peerDependencies: + rollup: 2.x || 3.x + peerDependenciesMeta: + rollup: + optional: true + dependencies: + open: 8.4.2 + picomatch: 2.3.1 + rollup: 3.29.4 + source-map: 0.7.4 + yargs: 17.7.2 + dev: true + + /rollup-pluginutils@2.8.2: + resolution: {integrity: sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==} + dependencies: + estree-walker: 0.6.1 + dev: true + + /rollup@3.29.4: + resolution: {integrity: sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.3 + + /rtl-css-js@1.16.1: + resolution: {integrity: sha512-lRQgou1mu19e+Ya0LsTvKrVJ5TYUbqCVPAiImX3UfLTenarvPUl1QFdvu5Z3PYmHT9RCcwIfbjRQBntExyj3Zg==} + dependencies: + '@babel/runtime': 7.23.2 + dev: false + + /rtl-detect@1.1.2: + resolution: {integrity: sha512-PGMBq03+TTG/p/cRB7HCLKJ1MgDIi07+QU1faSjiYRfmY5UsAttV9Hs08jDAHVwcOwmVLcSJkpwyfXszVjWfIQ==} + dev: false + + /rtlcss@4.1.1: + resolution: {integrity: sha512-/oVHgBtnPNcggP2aVXQjSy6N1mMAfHg4GSag0QtZBlD5bdDgAHwr4pydqJGd+SUCu9260+Pjqbjwtvu7EMH1KQ==} + engines: {node: '>=12.0.0'} + hasBin: true + dependencies: + escalade: 3.1.1 + picocolors: 1.0.0 + postcss: 8.4.31 + strip-json-comments: 3.1.1 + dev: false + + /run-applescript@5.0.0: + resolution: {integrity: sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==} + engines: {node: '>=12'} + dependencies: + execa: 5.1.1 + dev: false + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + + /rw@1.3.3: + resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} + + /rxjs@7.8.1: + resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + dependencies: + tslib: 2.6.2 + dev: false + + /sade@1.8.1: + resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} + engines: {node: '>=6'} + dependencies: + mri: 1.2.0 + + /safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + /safe-identifier@0.4.2: + resolution: {integrity: sha512-6pNbSMW6OhAi9j+N8V+U715yBQsaWJ7eyEUaOrawX+isg5ZxhUlV1NipNtgaKHmFGiABwt+ZF04Ii+3Xjkg+8w==} + dev: true + + /safe-regex@2.1.1: + resolution: {integrity: sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==} + dependencies: + regexp-tree: 0.1.27 + dev: false + + /safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + /sax@1.3.0: + resolution: {integrity: sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==} + + /saxes@5.0.1: + resolution: {integrity: sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==} + engines: {node: '>=10'} + dependencies: + xmlchars: 2.2.0 + dev: true + + /scheduler@0.20.2: + resolution: {integrity: sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==} + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + dev: false + + /scheduler@0.23.0: + resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} + dependencies: + loose-envify: 1.4.0 + + /schema-utils@2.7.0: + resolution: {integrity: sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==} + engines: {node: '>= 8.9.0'} + dependencies: + '@types/json-schema': 7.0.14 + ajv: 6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) + dev: false + + /schema-utils@3.3.0: + resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} + engines: {node: '>= 10.13.0'} + dependencies: + '@types/json-schema': 7.0.14 + ajv: 6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) + + /schema-utils@4.2.0: + resolution: {integrity: sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==} + engines: {node: '>= 12.13.0'} + dependencies: + '@types/json-schema': 7.0.14 + ajv: 8.12.0 + ajv-formats: 2.1.1(ajv@8.12.0) + ajv-keywords: 5.1.0(ajv@8.12.0) + dev: false + + /search-insights@2.9.0: + resolution: {integrity: sha512-bkWW9nIHOFkLwjQ1xqVaMbjjO5vhP26ERsH9Y3pKr8imthofEFIxlnOabkmGcw6ksRj9jWidcI65vvjJH/nTGg==} + dev: false + + /section-matter@1.0.0: + resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} + engines: {node: '>=4'} + dependencies: + extend-shallow: 2.0.1 + kind-of: 6.0.3 + dev: false + + /select-hose@2.0.0: + resolution: {integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==} + dev: false + + /selfsigned@2.4.1: + resolution: {integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==} + engines: {node: '>=10'} + dependencies: + '@types/node-forge': 1.3.8 + node-forge: 1.3.1 + dev: false + + /semver-diff@4.0.0: + resolution: {integrity: sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==} + engines: {node: '>=12'} + dependencies: + semver: 7.5.4 + dev: false + + /semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + + /semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + /semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + + /send@0.18.0: + resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} + engines: {node: '>= 0.8.0'} + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.0 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + dev: false + + /sentence-case@3.0.4: + resolution: {integrity: sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==} + dependencies: + no-case: 3.0.4 + tslib: 2.6.2 + upper-case-first: 2.0.2 + + /serialize-error@8.1.0: + resolution: {integrity: sha512-3NnuWfM6vBYoy5gZFvHiYsVbafvI9vZv/+jlIigFn4oP4zjNPK3LhcY0xSCgeb1a5L8jO71Mit9LlNoi2UfDDQ==} + engines: {node: '>=10'} + dependencies: + type-fest: 0.20.2 + dev: false + + /serialize-javascript@6.0.0: + resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} + dependencies: + randombytes: 2.1.0 + dev: true + + /serialize-javascript@6.0.1: + resolution: {integrity: sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==} + dependencies: + randombytes: 2.1.0 + + /serve-handler@6.1.5: + resolution: {integrity: sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg==} + dependencies: + bytes: 3.0.0 + content-disposition: 0.5.2 + fast-url-parser: 1.1.3 + mime-types: 2.1.18 + minimatch: 3.1.2 + path-is-inside: 1.0.2 + path-to-regexp: 2.2.1 + range-parser: 1.2.0 + dev: false + + /serve-index@1.9.1: + resolution: {integrity: sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==} + engines: {node: '>= 0.8.0'} + dependencies: + accepts: 1.3.8 + batch: 0.6.1 + debug: 2.6.9 + escape-html: 1.0.3 + http-errors: 1.6.3 + mime-types: 2.1.35 + parseurl: 1.3.3 + dev: false + + /serve-static@1.15.0: + resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} + engines: {node: '>= 0.8.0'} + dependencies: + encodeurl: 1.0.2 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.18.0 + dev: false + + /set-function-length@1.1.1: + resolution: {integrity: sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.1 + get-intrinsic: 1.2.2 + gopd: 1.0.1 + has-property-descriptors: 1.0.1 + + /setimmediate@1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + dev: false + + /setprototypeof@1.1.0: + resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} + dev: false + + /setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + dev: false + + /sha.js@2.4.11: + resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} + hasBin: true + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + dev: false + + /shallow-clone@3.0.1: + resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} + engines: {node: '>=8'} + dependencies: + kind-of: 6.0.3 + + /shallowequal@1.1.0: + resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} + + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + /shell-quote@1.8.1: + resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} + dev: false + + /shelljs@0.8.5: + resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==} + engines: {node: '>=4'} + hasBin: true + dependencies: + glob: 7.2.3 + interpret: 1.4.0 + rechoir: 0.6.2 + dev: false + + /shiki@0.14.5: + resolution: {integrity: sha512-1gCAYOcmCFONmErGTrS1fjzJLA7MGZmKzrBNX7apqSwhyITJg2O102uFzXUeBxNnEkDA9vHIKLyeKq0V083vIw==} + dependencies: + ansi-sequence-parser: 1.1.1 + jsonc-parser: 3.2.0 + vscode-oniguruma: 1.7.0 + vscode-textmate: 8.0.0 + dev: true + + /short-unique-id@5.0.3: + resolution: {integrity: sha512-yhniEILouC0s4lpH0h7rJsfylZdca10W9mDJRAFh3EpcSUanCHGb0R7kcFOIUCZYSAPo0PUD5ZxWQdW0T4xaug==} + hasBin: true + dev: false + + /side-channel@1.0.4: + resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + dependencies: + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + object-inspect: 1.13.1 + + /signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + /signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + dev: true + + /simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + requiresBuild: true + optional: true + + /simple-get@4.0.1: + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + requiresBuild: true + dependencies: + decompress-response: 6.0.0 + once: 1.4.0 + simple-concat: 1.0.1 + optional: true + + /sinon@17.0.1: + resolution: {integrity: sha512-wmwE19Lie0MLT+ZYNpDymasPHUKTaZHUH/pKEubRXIzySv9Atnlw+BUMGCzWgV7b7wO+Hw6f1TEOr0IUnmU8/g==} + dependencies: + '@sinonjs/commons': 3.0.0 + '@sinonjs/fake-timers': 11.2.2 + '@sinonjs/samsam': 8.0.0 + diff: 5.1.0 + nise: 5.1.5 + supports-color: 7.2.0 + dev: true + + /sirv@2.0.3: + resolution: {integrity: sha512-O9jm9BsID1P+0HOi81VpXPoDxYP374pkOLzACAoyUQ/3OUVndNpsz6wMnY2z+yOxzbllCKZrM+9QrWsv4THnyA==} + engines: {node: '>= 10'} + dependencies: + '@polka/url': 1.0.0-next.23 + mrmime: 1.0.1 + totalist: 3.0.1 + dev: false + + /sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + dev: false + + /sitemap@7.1.1: + resolution: {integrity: sha512-mK3aFtjz4VdJN0igpIJrinf3EO8U8mxOPsTBzSsy06UtjZQJ3YY3o3Xa7zSc5nMqcMrRwlChHZ18Kxg0caiPBg==} + engines: {node: '>=12.0.0', npm: '>=5.6.0'} + hasBin: true + dependencies: + '@types/node': 17.0.45 + '@types/sax': 1.2.6 + arg: 5.0.2 + sax: 1.3.0 + dev: false + + /skin-tone@2.0.0: + resolution: {integrity: sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==} + engines: {node: '>=8'} + dependencies: + unicode-emoji-modifier-base: 1.0.0 + dev: false + + /slash@2.0.0: + resolution: {integrity: sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==} + engines: {node: '>=6'} + dev: false + + /slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + /slash@4.0.0: + resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} + engines: {node: '>=12'} + dev: false + + /snake-case@3.0.4: + resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} + dependencies: + dot-case: 3.0.4 + tslib: 2.6.2 + + /sockjs@0.3.24: + resolution: {integrity: sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==} + dependencies: + faye-websocket: 0.11.4 + uuid: 8.3.2 + websocket-driver: 0.7.4 + dev: false + + /sort-css-media-queries@2.1.0: + resolution: {integrity: sha512-IeWvo8NkNiY2vVYdPa27MCQiR0MN0M80johAYFVxWWXQ44KU84WNxjslwBHmc/7ZL2ccwkM7/e6S5aiKZXm7jA==} + engines: {node: '>= 6.3.0'} + dev: false + + /source-map-js@1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + + /source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + /source-map@0.5.7: + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + engines: {node: '>=0.10.0'} + dev: false + + /source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + /source-map@0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} + + /space-separated-tokens@1.1.5: + resolution: {integrity: sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==} + dev: false + + /space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + dev: false + + /spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.16 + dev: false + + /spdx-exceptions@2.3.0: + resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} + dev: false + + /spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + dependencies: + spdx-exceptions: 2.3.0 + spdx-license-ids: 3.0.16 + dev: false + + /spdx-license-ids@3.0.16: + resolution: {integrity: sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==} + dev: false + + /spdy-transport@3.0.0: + resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==} + dependencies: + debug: 4.3.4(supports-color@8.1.1) + detect-node: 2.1.0 + hpack.js: 2.1.6 + obuf: 1.1.2 + readable-stream: 3.6.2 + wbuf: 1.7.3 + transitivePeerDependencies: + - supports-color + dev: false + + /spdy@4.0.2: + resolution: {integrity: sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==} + engines: {node: '>=6.0.0'} + dependencies: + debug: 4.3.4(supports-color@8.1.1) + handle-thing: 2.0.1 + http-deceiver: 1.2.7 + select-hose: 2.0.0 + spdy-transport: 3.0.0 + transitivePeerDependencies: + - supports-color + dev: false + + /sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + /srcset@4.0.0: + resolution: {integrity: sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw==} + engines: {node: '>=12'} + dev: false + + /stable@0.1.8: + resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==} + deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility' + + /stampit@4.3.2: + resolution: {integrity: sha512-pE2org1+ZWQBnIxRPrBM2gVupkuDD0TTNIo1H6GdT/vO82NXli2z8lRE8cu/nBIHrcOCXFBAHpb9ZldrB2/qOA==} + dev: false + + /statuses@1.5.0: + resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} + engines: {node: '>= 0.6'} + dev: false + + /statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + dev: false + + /std-env@3.4.3: + resolution: {integrity: sha512-f9aPhy8fYBuMN+sNfakZV18U39PbalgjXG3lLB9WkaYTxijru61wb57V9wxxNthXM5Sd88ETBWi29qLAsHO52Q==} + dev: false + + /stoppable@1.1.0: + resolution: {integrity: sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==} + engines: {node: '>=4', npm: '>=6'} + dev: false + + /string-hash@1.1.3: + resolution: {integrity: sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A==} + dev: true + + /string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + /string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + + /string_decoder@0.10.31: + resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} + dev: true + + /string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + dependencies: + safe-buffer: 5.1.2 + + /string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + + /stringify-entities@4.0.3: + resolution: {integrity: sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==} + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + dev: false + + /stringify-object@3.3.0: + resolution: {integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==} + engines: {node: '>=4'} + dependencies: + get-own-enumerable-property-symbols: 3.0.2 + is-obj: 1.0.1 + is-regexp: 1.0.0 + dev: false + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + + /strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + dependencies: + ansi-regex: 6.0.1 + + /strip-bom-string@1.0.0: + resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} + engines: {node: '>=0.10.0'} + dev: false + + /strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + dev: false + + /strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + dev: false + + /strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + dependencies: + min-indent: 1.0.1 + dev: false + + /strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + requiresBuild: true + + /strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + /strip-json-comments@5.0.1: + resolution: {integrity: sha512-0fk9zBqO67Nq5M/m45qHCJxylV/DhBlIOVExqgOMiCCrzrhU6tCibRXNqE3jwJLftzE9SNuZtYbpzcO+i9FiKw==} + engines: {node: '>=14.16'} + dev: false + + /style-inject@0.3.0: + resolution: {integrity: sha512-IezA2qp+vcdlhJaVm5SOdPPTUu0FCEqfNSli2vRuSIBbu5Nq5UvygTk/VzeCqfLz2Atj3dVII5QBKGZRZ0edzw==} + dev: true + + /style-to-object@0.4.4: + resolution: {integrity: sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==} + dependencies: + inline-style-parser: 0.1.1 + dev: false + + /stylehacks@5.1.1(postcss@8.4.31): + resolution: {integrity: sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + browserslist: 4.22.1 + postcss: 8.4.31 + postcss-selector-parser: 6.0.13 + + /stylis@4.2.0: + resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} + dev: false + + /stylis@4.3.0: + resolution: {integrity: sha512-E87pIogpwUsUwXw7dNyU4QDjdgVMy52m+XEOPEKUn161cCzWjjhPSQhByfd1CcNvrOLnXQ6OnnZDwnJrz/Z4YQ==} + + /supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + + /supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + dependencies: + has-flag: 4.0.0 + + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + /svg-parser@2.0.4: + resolution: {integrity: sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==} + dev: false + + /svgo@2.8.0: + resolution: {integrity: sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==} + engines: {node: '>=10.13.0'} + hasBin: true + dependencies: + '@trysound/sax': 0.2.0 + commander: 7.2.0 + css-select: 4.3.0 + css-tree: 1.1.3 + csso: 4.2.0 + picocolors: 1.0.0 + stable: 0.1.8 + + /swagger-client@3.24.2: + resolution: {integrity: sha512-JToPUkOtiiL8r0GtWlGp6iN0dj5e+6EihVjRJDLv3FhnnFc6QBahmuOxX/j3t4oky10jj3rgGwf0WaSjSql6Dw==} + dependencies: + '@babel/runtime-corejs3': 7.23.2 + '@swagger-api/apidom-core': 0.82.0 + '@swagger-api/apidom-json-pointer': 0.82.0 + '@swagger-api/apidom-ns-openapi-3-1': 0.82.0 + '@swagger-api/apidom-reference': 0.82.0 + cookie: 0.5.0 + deepmerge: 4.3.1 + fast-json-patch: 3.1.1 + is-plain-object: 5.0.0 + js-yaml: 4.1.0 + node-abort-controller: 3.1.1 + node-fetch-commonjs: 3.3.2 + qs: 6.11.2 + traverse: 0.6.7 + undici: 5.27.0 + transitivePeerDependencies: + - debug + dev: false + + /swagger-ui-react@5.7.2(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-Bzf6feEFx7i429kkM2XncsBoMR7WAGyk9lKjenaEsZaLf8ccOq2jspPRyZWBdGT3BmG8sO4x9S98CpKs5POk1w==} + peerDependencies: + react: '>=17.0.0' + react-dom: '>=17.0.0' + dependencies: + '@babel/runtime-corejs3': 7.23.2 + '@braintree/sanitize-url': 6.0.4 + base64-js: 1.5.1 + classnames: 2.3.2 + css.escape: 1.5.1 + deep-extend: 0.6.0 + dompurify: 3.0.5 + ieee754: 1.2.1 + immutable: 3.8.2 + js-file-download: 0.4.12 + js-yaml: 4.1.0 + lodash: 4.17.21 + patch-package: 8.0.0 + prop-types: 15.8.1 + randexp: 0.5.3 + randombytes: 2.1.0 + react: 18.2.0 + react-copy-to-clipboard: 5.1.0(react@18.2.0) + react-debounce-input: 3.3.0(react@18.2.0) + react-dom: 18.2.0(react@18.2.0) + react-immutable-proptypes: 2.2.0(immutable@3.8.2) + react-immutable-pure-component: 2.2.2(immutable@3.8.2)(react-dom@18.2.0)(react@18.2.0) + react-inspector: 6.0.2(react@18.2.0) + react-redux: 8.1.3(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0)(redux@4.2.1) + react-syntax-highlighter: 15.5.0(react@18.2.0) + redux: 4.2.1 + redux-immutable: 4.0.0(immutable@3.8.2) + remarkable: 2.0.1 + reselect: 4.1.8 + serialize-error: 8.1.0 + sha.js: 2.4.11 + swagger-client: 3.24.2 + url-parse: 1.5.10 + xml: 1.0.1 + xml-but-prettier: 1.0.1 + zenscroll: 4.0.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - debug + - react-native + dev: false + + /swc-loader@0.2.3(@swc/core@1.3.95)(webpack@5.89.0): + resolution: {integrity: sha512-D1p6XXURfSPleZZA/Lipb3A8pZ17fP4NObZvFCDjK/OKljroqDpPmsBdTraWhVBqUNpcWBQY1imWdoPScRlQ7A==} + peerDependencies: + '@swc/core': ^1.2.147 + webpack: '>=2' + dependencies: + '@swc/core': 1.3.95 + webpack: 5.89.0(@swc/core@1.3.95) + dev: true + + /symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + dev: true + + /synckit@0.8.5: + resolution: {integrity: sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==} + engines: {node: ^14.18.0 || >=16.0.0} + dependencies: + '@pkgr/utils': 2.4.2 + tslib: 2.6.2 + dev: false + + /table-layout@1.0.2: + resolution: {integrity: sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==} + engines: {node: '>=8.0.0'} + dependencies: + array-back: 4.0.2 + deep-extend: 0.6.0 + typical: 5.2.0 + wordwrapjs: 4.0.1 + dev: true + + /tabster@4.7.0: + resolution: {integrity: sha512-8+arpE2WOvhdU2bvU5GEaoaICbLBNNh8WhW9q85KeSOg4sIvRPfAI2/j18UxUnKT8Fv32zkbvEfToEf9Y1Sfug==} + dependencies: + keyborg: 2.1.0 + tslib: 2.6.2 + dev: false + + /tapable@1.1.3: + resolution: {integrity: sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==} + engines: {node: '>=6'} + dev: false + + /tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + + /tar-fs@2.1.1: + resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} + requiresBuild: true + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.0 + tar-stream: 2.2.0 + optional: true + + /tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + requiresBuild: true + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.4 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + optional: true + + /terser-webpack-plugin@5.3.9(@swc/core@1.3.95)(webpack@5.89.0): + resolution: {integrity: sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + dependencies: + '@jridgewell/trace-mapping': 0.3.20 + '@swc/core': 1.3.95 + jest-worker: 27.5.1 + schema-utils: 3.3.0 + serialize-javascript: 6.0.1 + terser: 5.24.0 + webpack: 5.89.0(@swc/core@1.3.95) + + /terser-webpack-plugin@5.3.9(webpack@5.89.0): + resolution: {integrity: sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + dependencies: + '@jridgewell/trace-mapping': 0.3.20 + jest-worker: 27.5.1 + schema-utils: 3.3.0 + serialize-javascript: 6.0.1 + terser: 5.24.0 + webpack: 5.89.0 + + /terser@5.24.0: + resolution: {integrity: sha512-ZpGR4Hy3+wBEzVEnHvstMvqpD/nABNelQn/z2r0fjVWGQsN3bpOLzQlqDxmb4CDZnXq5lpjnQ+mHQLAOpfM5iw==} + engines: {node: '>=10'} + hasBin: true + dependencies: + '@jridgewell/source-map': 0.3.5 + acorn: 8.11.2 + commander: 2.20.3 + source-map-support: 0.5.21 + + /test-exclude@6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 7.2.3 + minimatch: 3.1.2 + dev: true + + /text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + /through2@2.0.5: + resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} + dependencies: + readable-stream: 2.3.8 + xtend: 4.0.2 + dev: true + + /thunky@1.1.0: + resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==} + dev: false + + /tiny-invariant@1.3.1: + resolution: {integrity: sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==} + dev: false + + /tiny-warning@1.0.3: + resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==} + dev: false + + /titleize@3.0.0: + resolution: {integrity: sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==} + engines: {node: '>=12'} + dev: false + + /tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + dependencies: + os-tmpdir: 1.0.2 + dev: false + + /tmp@0.2.1: + resolution: {integrity: sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==} + engines: {node: '>=8.17.0'} + dependencies: + rimraf: 3.0.2 + dev: true + + /to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + + /toggle-selection@1.0.6: + resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==} + dev: false + + /toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + dev: false + + /totalist@3.0.1: + resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} + engines: {node: '>=6'} + dev: false + + /tough-cookie@4.1.3: + resolution: {integrity: sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==} + engines: {node: '>=6'} + dependencies: + psl: 1.9.0 + punycode: 2.3.1 + universalify: 0.2.0 + url-parse: 1.5.10 + dev: true + + /tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + dev: false + + /tr46@3.0.0: + resolution: {integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==} + engines: {node: '>=12'} + dependencies: + punycode: 2.3.1 + dev: true + + /traverse@0.6.7: + resolution: {integrity: sha512-/y956gpUo9ZNCb99YjxG7OaslxZWHfCHAUUfshwqOXmxUIvqLjVO581BT+gM59+QV9tFe6/CGG53tsA1Y7RSdg==} + dev: false + + /tree-sitter-json@0.20.1: + resolution: {integrity: sha512-482hf7J+aBwhksSw8yWaqI8nyP1DrSwnS4IMBShsnkFWD3SE8oalHnsEik59fEVi3orcTCUtMzSjZx+0Tpa6Vw==} + requiresBuild: true + dependencies: + nan: 2.18.0 + dev: false + optional: true + + /tree-sitter-yaml@0.5.0: + resolution: {integrity: sha512-POJ4ZNXXSWIG/W4Rjuyg36MkUD4d769YRUGKRqN+sVaj/VCo6Dh6Pkssn1Rtewd5kybx+jT1BWMyWN0CijXnMA==} + requiresBuild: true + dependencies: + nan: 2.18.0 + dev: false + optional: true + + /tree-sitter@0.20.4: + resolution: {integrity: sha512-rjfR5dc4knG3jnJNN/giJ9WOoN1zL/kZyrS0ILh+eqq8RNcIbiXA63JsMEgluug0aNvfQvK4BfCErN1vIzvKog==} + requiresBuild: true + dependencies: + nan: 2.18.0 + prebuild-install: 7.1.1 + dev: false + optional: true + + /trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + dev: false + + /trough@2.1.0: + resolution: {integrity: sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==} + dev: false + + /ts-api-utils@1.0.3(typescript@5.2.2): + resolution: {integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==} + engines: {node: '>=16.13.0'} + peerDependencies: + typescript: '>=4.2.0' + dependencies: + typescript: 5.2.2 + + /ts-dedent@2.2.0: + resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} + engines: {node: '>=6.10'} + + /ts-toolbelt@9.6.0: + resolution: {integrity: sha512-nsZd8ZeNUzukXPlJmTBwUAuABDe/9qtVDelJeT/qW0ow3ZS3BsQJtNkan1802aM9Uf68/Y8ljw86Hu0h5IUW3w==} + dev: false + + /tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + dev: false + + /tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + + /tsutils@3.21.0(typescript@5.2.2): + resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} + engines: {node: '>= 6'} + peerDependencies: + typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + dependencies: + tslib: 1.14.1 + typescript: 5.2.2 + dev: false + + /tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + requiresBuild: true + dependencies: + safe-buffer: 5.2.1 + optional: true + + /tunnel@0.0.6: + resolution: {integrity: sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==} + engines: {node: '>=0.6.11 <=0.7.0 || >=0.7.3'} + + /type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + + /type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + dev: true + + /type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + /type-fest@0.6.0: + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} + engines: {node: '>=8'} + dev: false + + /type-fest@0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + dev: false + + /type-fest@1.4.0: + resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} + engines: {node: '>=10'} + dev: false + + /type-fest@2.19.0: + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} + engines: {node: '>=12.20'} + dev: false + + /type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + dev: false + + /typed-rest-client@1.8.11: + resolution: {integrity: sha512-5UvfMpd1oelmUPRbbaVnq+rHP7ng2cE4qoQkQeAqxRL6PklkxsM0g32/HL0yfvruK6ojQ5x8EE+HF4YV6DtuCA==} + dependencies: + qs: 6.11.2 + tunnel: 0.0.6 + underscore: 1.13.6 + dev: true + + /typedarray-to-buffer@3.1.5: + resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + dependencies: + is-typedarray: 1.0.0 + dev: false + + /typedoc-plugin-markdown@4.0.0-next.25(typedoc@0.25.2): + resolution: {integrity: sha512-OAucyztjyTcJhpyH8lK3r6W/9lGYxRnEphmphAi8CLL4pBqzA9A00OaOWt4ybkcFBnB8zNIZ4SGCz1sk9NBA3g==} + peerDependencies: + typedoc: '>=0.25.0' + dependencies: + typedoc: 0.25.2(typescript@5.2.2) + dev: true + + /typedoc@0.25.2(typescript@5.2.2): + resolution: {integrity: sha512-286F7BeATBiWe/qC4PCOCKlSTwfnsLbC/4cZ68oGBbvAqb9vV33quEOXx7q176OXotD+JdEerdQ1OZGJ818lnA==} + engines: {node: '>= 16'} + hasBin: true + peerDependencies: + typescript: 4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x + dependencies: + lunr: 2.3.9 + marked: 4.3.0 + minimatch: 9.0.3 + shiki: 0.14.5 + typescript: 5.2.2 + dev: true + + /types-ramda@0.29.5: + resolution: {integrity: sha512-u+bAYXHDPJR+amB0qMrMU/NXRB2PG8QqpO2v6j7yK/0mPZhlaaZj++ynYjnVpkPEpCkZEGxNpWY3X7qyLCGE3w==} + dependencies: + ts-toolbelt: 9.6.0 + dev: false + + /typescript@5.2.2: + resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} + engines: {node: '>=14.17'} + hasBin: true + + /typical@4.0.0: + resolution: {integrity: sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==} + engines: {node: '>=8'} + dev: true + + /typical@5.2.0: + resolution: {integrity: sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==} + engines: {node: '>=8'} + dev: true + + /ua-parser-js@1.0.37: + resolution: {integrity: sha512-bhTyI94tZofjo+Dn8SN6Zv8nBDvyXTymAdM3LDI/0IboIUwTu1rEhW7v2TfiVsoYWgkQ4kOVqnI8APUFbIQIFQ==} + dev: false + + /uc.micro@1.0.6: + resolution: {integrity: sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==} + dev: true + + /underscore@1.13.6: + resolution: {integrity: sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==} + dev: true + + /undici@5.27.0: + resolution: {integrity: sha512-l3ydWhlhOJzMVOYkymLykcRRXqbUaQriERtR70B9LzNkZ4bX52Fc8wbTDneMiwo8T+AemZXvXaTx+9o5ROxrXg==} + engines: {node: '>=14.0'} + dependencies: + '@fastify/busboy': 2.0.0 + dev: false + + /unicode-canonical-property-names-ecmascript@2.0.0: + resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} + engines: {node: '>=4'} + dev: false + + /unicode-emoji-modifier-base@1.0.0: + resolution: {integrity: sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==} + engines: {node: '>=4'} + dev: false + + /unicode-match-property-ecmascript@2.0.0: + resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} + engines: {node: '>=4'} + dependencies: + unicode-canonical-property-names-ecmascript: 2.0.0 + unicode-property-aliases-ecmascript: 2.1.0 + dev: false + + /unicode-match-property-value-ecmascript@2.1.0: + resolution: {integrity: sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==} + engines: {node: '>=4'} + dev: false + + /unicode-property-aliases-ecmascript@2.1.0: + resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} + engines: {node: '>=4'} + dev: false + + /unified@11.0.4: + resolution: {integrity: sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==} + dependencies: + '@types/unist': 3.0.1 + bail: 2.0.2 + devlop: 1.1.0 + extend: 3.0.2 + is-plain-obj: 4.1.0 + trough: 2.1.0 + vfile: 6.0.1 + dev: false + + /unique-string@2.0.0: + resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} + engines: {node: '>=8'} + dependencies: + crypto-random-string: 2.0.0 + dev: false + + /unique-string@3.0.0: + resolution: {integrity: sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==} + engines: {node: '>=12'} + dependencies: + crypto-random-string: 4.0.0 + dev: false + + /unist-util-is@6.0.0: + resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + dependencies: + '@types/unist': 3.0.1 + dev: false + + /unist-util-position-from-estree@2.0.0: + resolution: {integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==} + dependencies: + '@types/unist': 3.0.1 + dev: false + + /unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + dependencies: + '@types/unist': 3.0.1 + dev: false + + /unist-util-remove-position@5.0.0: + resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} + dependencies: + '@types/unist': 3.0.1 + unist-util-visit: 5.0.0 + dev: false + + /unist-util-stringify-position@3.0.3: + resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} + dependencies: + '@types/unist': 2.0.9 + + /unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + dependencies: + '@types/unist': 3.0.1 + dev: false + + /unist-util-visit-parents@6.0.1: + resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + dependencies: + '@types/unist': 3.0.1 + unist-util-is: 6.0.0 + dev: false + + /unist-util-visit@5.0.0: + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + dependencies: + '@types/unist': 3.0.1 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + dev: false + + /universalify@0.2.0: + resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} + engines: {node: '>= 4.0.0'} + dev: true + + /universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + dev: false + + /unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + dev: false + + /unraw@3.0.0: + resolution: {integrity: sha512-08/DA66UF65OlpUDIQtbJyrqTR0jTAlJ+jsnkQ4jxR7+K5g5YG1APZKQSMCE1vqqmD+2pv6+IdEjmopFatacvg==} + dev: false + + /untildify@4.0.0: + resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} + engines: {node: '>=8'} + + /update-browserslist-db@1.0.13(browserslist@4.22.1): + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.22.1 + escalade: 3.1.1 + picocolors: 1.0.0 + + /update-notifier@6.0.2: + resolution: {integrity: sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==} + engines: {node: '>=14.16'} + dependencies: + boxen: 7.1.1 + chalk: 5.3.0 + configstore: 6.0.0 + has-yarn: 3.0.0 + import-lazy: 4.0.0 + is-ci: 3.0.1 + is-installed-globally: 0.4.0 + is-npm: 6.0.0 + is-yarn-global: 0.4.1 + latest-version: 7.0.0 + pupa: 3.1.0 + semver: 7.5.4 + semver-diff: 4.0.0 + xdg-basedir: 5.1.0 + dev: false + + /upper-case-first@2.0.2: + resolution: {integrity: sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==} + dependencies: + tslib: 2.6.2 + + /upper-case@2.0.2: + resolution: {integrity: sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==} + dependencies: + tslib: 2.6.2 + + /uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.3.1 + + /url-join@4.0.1: + resolution: {integrity: sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==} + dev: true + + /url-loader@4.1.1(file-loader@6.2.0)(webpack@5.89.0): + resolution: {integrity: sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==} + engines: {node: '>= 10.13.0'} + peerDependencies: + file-loader: '*' + webpack: ^4.0.0 || ^5.0.0 + peerDependenciesMeta: + file-loader: + optional: true + dependencies: + file-loader: 6.2.0(webpack@5.89.0) + loader-utils: 2.0.4 + mime-types: 2.1.35 + schema-utils: 3.3.0 + webpack: 5.89.0(@swc/core@1.3.95) + dev: false + + /url-parse@1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + dependencies: + querystringify: 2.2.0 + requires-port: 1.0.0 + + /use-composed-ref@1.3.0(react@18.2.0): + resolution: {integrity: sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + react: 18.2.0 + dev: false + + /use-disposable@1.0.2(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-UMaXVlV77dWOu4GqAFNjRzHzowYKUKbJBQfCexvahrYeIz4OkUYUjna4Tjjdf92NH8Nm8J7wEfFRgTIwYjO5jg==} + peerDependencies: + '@types/react': '>=16.8.0 <19.0.0' + '@types/react-dom': '>=16.8.0 <19.0.0' + react: '>=16.8.0 <19.0.0' + react-dom: '>=16.8.0 <19.0.0' + dependencies: + '@types/react': 18.2.34 + '@types/react-dom': 18.2.14 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /use-isomorphic-layout-effect@1.1.2(@types/react@18.2.34)(react@18.2.0): + resolution: {integrity: sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.2.34 + react: 18.2.0 + dev: false + + /use-latest@1.2.1(@types/react@18.2.34)(react@18.2.0): + resolution: {integrity: sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw==} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.2.34 + react: 18.2.0 + use-isomorphic-layout-effect: 1.1.2(@types/react@18.2.34)(react@18.2.0) + dev: false + + /use-sync-external-store@1.2.0(react@18.2.0): + resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + react: 18.2.0 + dev: false + + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + /utila@0.4.0: + resolution: {integrity: sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==} + dev: false + + /utility-types@3.10.0: + resolution: {integrity: sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==} + engines: {node: '>= 4'} + + /utils-merge@1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + dev: false + + /uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + dev: false + + /uuid@9.0.1: + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + hasBin: true + + /uvu@0.5.6: + resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==} + engines: {node: '>=8'} + hasBin: true + dependencies: + dequal: 2.0.3 + diff: 5.1.0 + kleur: 4.1.5 + sade: 1.8.1 + + /v8-to-istanbul@9.1.3: + resolution: {integrity: sha512-9lDD+EVI2fjFsMWXc6dy5JJzBsVTcQ2fVkfBvncZ6xJWG9wtBhOldG+mHkSL0+V1K/xgZz0JDO5UT5hFwHUghg==} + engines: {node: '>=10.12.0'} + dependencies: + '@jridgewell/trace-mapping': 0.3.20 + '@types/istanbul-lib-coverage': 2.0.5 + convert-source-map: 2.0.0 + dev: true + + /validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + dev: false + + /value-equal@1.0.1: + resolution: {integrity: sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==} + dev: false + + /vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + dev: false + + /vfile-location@5.0.2: + resolution: {integrity: sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==} + dependencies: + '@types/unist': 3.0.1 + vfile: 6.0.1 + dev: false + + /vfile-message@4.0.2: + resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} + dependencies: + '@types/unist': 3.0.1 + unist-util-stringify-position: 4.0.0 + dev: false + + /vfile@6.0.1: + resolution: {integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==} + dependencies: + '@types/unist': 3.0.1 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.2 + dev: false + + /vite@4.5.0(@types/node@18.11.19): + resolution: {integrity: sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + '@types/node': 18.11.19 + esbuild: 0.18.20 + postcss: 8.4.31 + rollup: 3.29.4 + optionalDependencies: + fsevents: 2.3.3 + + /vscode-jsonrpc@6.0.0: + resolution: {integrity: sha512-wnJA4BnEjOSyFMvjZdpiOwhSq9uDoK8e/kpRJDTaMYzwlkrhG1fwDIZI94CLsLzlCK5cIbMMtFlJlfR57Lavmg==} + engines: {node: '>=8.0.0 || >=10.0.0'} + dev: false + + /vscode-jsonrpc@8.0.2: + resolution: {integrity: sha512-RY7HwI/ydoC1Wwg4gJ3y6LpU9FJRZAUnTYMXthqhFXXu77ErDd/xkREpGuk4MyYkk4a+XDWAMqe0S3KkelYQEQ==} + engines: {node: '>=14.0.0'} + dev: false + + /vscode-jsonrpc@8.2.0: + resolution: {integrity: sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==} + engines: {node: '>=14.0.0'} + + /vscode-languageclient@9.0.1: + resolution: {integrity: sha512-JZiimVdvimEuHh5olxhxkht09m3JzUGwggb5eRUkzzJhZ2KjCN0nh55VfiED9oez9DyF8/fz1g1iBV3h+0Z2EA==} + engines: {vscode: ^1.82.0} + dependencies: + minimatch: 5.1.6 + semver: 7.5.4 + vscode-languageserver-protocol: 3.17.5 + dev: true + + /vscode-languageserver-protocol@3.16.0: + resolution: {integrity: sha512-sdeUoAawceQdgIfTI+sdcwkiK2KU+2cbEYA0agzM2uqaUy2UpnnGHtWTHVEtS0ES4zHU0eMFRGN+oQgDxlD66A==} + dependencies: + vscode-jsonrpc: 6.0.0 + vscode-languageserver-types: 3.16.0 + dev: false + + /vscode-languageserver-protocol@3.17.2: + resolution: {integrity: sha512-8kYisQ3z/SQ2kyjlNeQxbkkTNmVFoQCqkmGrzLH6A9ecPlgTbp3wDTnUNqaUxYr4vlAcloxx8zwy7G5WdguYNg==} + dependencies: + vscode-jsonrpc: 8.0.2 + vscode-languageserver-types: 3.17.2 + dev: false + + /vscode-languageserver-protocol@3.17.5: + resolution: {integrity: sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==} + dependencies: + vscode-jsonrpc: 8.2.0 + vscode-languageserver-types: 3.17.5 + + /vscode-languageserver-textdocument@1.0.11: + resolution: {integrity: sha512-X+8T3GoiwTVlJbicx/sIAF+yuJAqz8VvwJyoMVhwEMoEKE/fkDmrqUgDMyBECcM2A2frVZIUj5HI/ErRXCfOeA==} + dev: false + + /vscode-languageserver-types@3.16.0: + resolution: {integrity: sha512-k8luDIWJWyenLc5ToFQQMaSrqCHiLwyKPHKPQZ5zz21vM+vIVUSvsRpcbiECH4WR88K2XZqc4ScRcZ7nk/jbeA==} + dev: false + + /vscode-languageserver-types@3.17.2: + resolution: {integrity: sha512-zHhCWatviizPIq9B7Vh9uvrH6x3sK8itC84HkamnBWoDFJtzBf7SWlpLCZUit72b3os45h6RWQNC9xHRDF8dRA==} + dev: false + + /vscode-languageserver-types@3.17.5: + resolution: {integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==} + + /vscode-languageserver@7.0.0: + resolution: {integrity: sha512-60HTx5ID+fLRcgdHfmz0LDZAXYEV68fzwG0JWwEPBode9NuMYTIxuYXPg4ngO8i8+Ou0lM7y6GzaYWbiDL0drw==} + hasBin: true + dependencies: + vscode-languageserver-protocol: 3.16.0 + dev: false + + /vscode-languageserver@8.0.2: + resolution: {integrity: sha512-bpEt2ggPxKzsAOZlXmCJ50bV7VrxwCS5BI4+egUmure/oI/t4OlFzi/YNtVvY24A2UDOZAgwFGgnZPwqSJubkA==} + hasBin: true + dependencies: + vscode-languageserver-protocol: 3.17.2 + dev: false + + /vscode-languageserver@9.0.1: + resolution: {integrity: sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==} + hasBin: true + dependencies: + vscode-languageserver-protocol: 3.17.5 + dev: false + + /vscode-oniguruma@1.7.0: + resolution: {integrity: sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==} + dev: true + + /vscode-oniguruma@2.0.1: + resolution: {integrity: sha512-poJU8iHIWnC3vgphJnrLZyI3YdqRlR27xzqDmpPXYzA93R4Gk8z7T6oqDzDoHjoikA2aS82crdXFkjELCdJsjQ==} + dev: true + + /vscode-textmate@8.0.0: + resolution: {integrity: sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==} + dev: true + + /vscode-textmate@9.0.0: + resolution: {integrity: sha512-Cl65diFGxz7gpwbav10HqiY/eVYTO1sjQpmRmV991Bj7wAoOAjGQ97PpQcXorDE2Uc4hnGWLY17xme+5t6MlSg==} + dev: true + + /vscode-uri@3.0.8: + resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} + dev: false + + /w3c-hr-time@1.0.2: + resolution: {integrity: sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==} + deprecated: Use your platform's native performance.now() and performance.timeOrigin. + dependencies: + browser-process-hrtime: 1.0.0 + dev: true + + /w3c-xmlserializer@3.0.0: + resolution: {integrity: sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg==} + engines: {node: '>=12'} + dependencies: + xml-name-validator: 4.0.0 + dev: true + + /wait-on@7.0.1: + resolution: {integrity: sha512-9AnJE9qTjRQOlTZIldAaf/da2eW0eSRSgcqq85mXQja/DW3MriHxkpODDSUEg+Gri/rKEcXUZHe+cevvYItaog==} + engines: {node: '>=12.0.0'} + hasBin: true + dependencies: + axios: 0.27.2 + joi: 17.11.0 + lodash: 4.17.21 + minimist: 1.2.8 + rxjs: 7.8.1 + transitivePeerDependencies: + - debug + dev: false + + /watchpack@2.4.0: + resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} + engines: {node: '>=10.13.0'} + dependencies: + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + + /wbuf@1.7.3: + resolution: {integrity: sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==} + dependencies: + minimalistic-assert: 1.0.1 + dev: false + + /web-namespaces@2.0.1: + resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + dev: false + + /web-streams-polyfill@3.2.1: + resolution: {integrity: sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==} + engines: {node: '>= 8'} + dev: false + + /web-tree-sitter@0.20.3: + resolution: {integrity: sha512-zKGJW9r23y3BcJusbgvnOH2OYAW40MXAOi9bi3Gcc7T4Gms9WWgXF8m6adsJWpGJEhgOzCrfiz1IzKowJWrtYw==} + requiresBuild: true + dev: false + optional: true + + /web-worker@1.2.0: + resolution: {integrity: sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA==} + + /webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + dev: false + + /webidl-conversions@7.0.0: + resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} + engines: {node: '>=12'} + dev: true + + /webpack-bundle-analyzer@4.9.1: + resolution: {integrity: sha512-jnd6EoYrf9yMxCyYDPj8eutJvtjQNp8PHmni/e/ulydHBWhT5J3menXt3HEkScsu9YqMAcG4CfFjs3rj5pVU1w==} + engines: {node: '>= 10.13.0'} + hasBin: true + dependencies: + '@discoveryjs/json-ext': 0.5.7 + acorn: 8.11.2 + acorn-walk: 8.3.0 + commander: 7.2.0 + escape-string-regexp: 4.0.0 + gzip-size: 6.0.0 + is-plain-object: 5.0.0 + lodash.debounce: 4.0.8 + lodash.escape: 4.0.1 + lodash.flatten: 4.4.0 + lodash.invokemap: 4.6.0 + lodash.pullall: 4.2.0 + lodash.uniqby: 4.7.0 + opener: 1.5.2 + picocolors: 1.0.0 + sirv: 2.0.3 + ws: 7.5.9 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: false + + /webpack-dev-middleware@5.3.3(webpack@5.89.0): + resolution: {integrity: sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==} + engines: {node: '>= 12.13.0'} + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + dependencies: + colorette: 2.0.20 + memfs: 3.5.3 + mime-types: 2.1.35 + range-parser: 1.2.1 + schema-utils: 4.2.0 + webpack: 5.89.0(@swc/core@1.3.95) + dev: false + + /webpack-dev-server@4.15.1(webpack@5.89.0): + resolution: {integrity: sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==} + engines: {node: '>= 12.13.0'} + hasBin: true + peerDependencies: + webpack: ^4.37.0 || ^5.0.0 + webpack-cli: '*' + peerDependenciesMeta: + webpack: + optional: true + webpack-cli: + optional: true + dependencies: + '@types/bonjour': 3.5.12 + '@types/connect-history-api-fallback': 1.5.2 + '@types/express': 4.17.20 + '@types/serve-index': 1.9.3 + '@types/serve-static': 1.15.4 + '@types/sockjs': 0.3.35 + '@types/ws': 8.5.8 + ansi-html-community: 0.0.8 + bonjour-service: 1.1.1 + chokidar: 3.5.3 + colorette: 2.0.20 + compression: 1.7.4 + connect-history-api-fallback: 2.0.0 + default-gateway: 6.0.3 + express: 4.18.2 + graceful-fs: 4.2.11 + html-entities: 2.4.0 + http-proxy-middleware: 2.0.6(@types/express@4.17.20) + ipaddr.js: 2.1.0 + launch-editor: 2.6.1 + open: 8.4.2 + p-retry: 4.6.2 + rimraf: 3.0.2 + schema-utils: 4.2.0 + selfsigned: 2.4.1 + serve-index: 1.9.1 + sockjs: 0.3.24 + spdy: 4.0.2 + webpack: 5.89.0(@swc/core@1.3.95) + webpack-dev-middleware: 5.3.3(webpack@5.89.0) + ws: 8.14.2 + transitivePeerDependencies: + - bufferutil + - debug + - supports-color + - utf-8-validate + dev: false + + /webpack-merge@5.10.0: + resolution: {integrity: sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==} + engines: {node: '>=10.0.0'} + dependencies: + clone-deep: 4.0.1 + flat: 5.0.2 + wildcard: 2.0.1 + + /webpack-sources@3.2.3: + resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} + engines: {node: '>=10.13.0'} + + /webpack@5.89.0: + resolution: {integrity: sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + dependencies: + '@types/eslint-scope': 3.7.6 + '@types/estree': 1.0.4 + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/wasm-edit': 1.11.6 + '@webassemblyjs/wasm-parser': 1.11.6 + acorn: 8.11.2 + acorn-import-assertions: 1.9.0(acorn@8.11.2) + browserslist: 4.22.1 + chrome-trace-event: 1.0.3 + enhanced-resolve: 5.15.0 + es-module-lexer: 1.3.1 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.0 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 3.3.0 + tapable: 2.2.1 + terser-webpack-plugin: 5.3.9(webpack@5.89.0) + watchpack: 2.4.0 + webpack-sources: 3.2.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + + /webpack@5.89.0(@swc/core@1.3.95): + resolution: {integrity: sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + dependencies: + '@types/eslint-scope': 3.7.6 + '@types/estree': 1.0.4 + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/wasm-edit': 1.11.6 + '@webassemblyjs/wasm-parser': 1.11.6 + acorn: 8.11.2 + acorn-import-assertions: 1.9.0(acorn@8.11.2) + browserslist: 4.22.1 + chrome-trace-event: 1.0.3 + enhanced-resolve: 5.15.0 + es-module-lexer: 1.3.1 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.0 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 3.3.0 + tapable: 2.2.1 + terser-webpack-plugin: 5.3.9(@swc/core@1.3.95)(webpack@5.89.0) + watchpack: 2.4.0 + webpack-sources: 3.2.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + + /webpackbar@5.0.2(webpack@5.89.0): + resolution: {integrity: sha512-BmFJo7veBDgQzfWXl/wwYXr/VFus0614qZ8i9znqcl9fnEdiVkdbi0TedLQ6xAK92HZHDJ0QmyQ0fmuZPAgCYQ==} + engines: {node: '>=12'} + peerDependencies: + webpack: 3 || 4 || 5 + dependencies: + chalk: 4.1.2 + consola: 2.15.3 + pretty-time: 1.1.0 + std-env: 3.4.3 + webpack: 5.89.0(@swc/core@1.3.95) + dev: false + + /websocket-driver@0.7.4: + resolution: {integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==} + engines: {node: '>=0.8.0'} + dependencies: + http-parser-js: 0.5.8 + safe-buffer: 5.2.1 + websocket-extensions: 0.1.4 + dev: false + + /websocket-extensions@0.1.4: + resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==} + engines: {node: '>=0.8.0'} + dev: false + + /whatwg-encoding@2.0.0: + resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==} + engines: {node: '>=12'} + dependencies: + iconv-lite: 0.6.3 + dev: true + + /whatwg-mimetype@3.0.0: + resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} + engines: {node: '>=12'} + dev: true + + /whatwg-url@10.0.0: + resolution: {integrity: sha512-CLxxCmdUby142H5FZzn4D8ikO1cmypvXVQktsgosNy4a4BHrDHeciBBGZhb0bNoR5/MltoCatso+vFjjGx8t0w==} + engines: {node: '>=12'} + dependencies: + tr46: 3.0.0 + webidl-conversions: 7.0.0 + dev: true + + /whatwg-url@11.0.0: + resolution: {integrity: sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==} + engines: {node: '>=12'} + dependencies: + tr46: 3.0.0 + webidl-conversions: 7.0.0 + dev: true + + /whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + dev: false + + /which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: false + + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + + /widest-line@4.0.1: + resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==} + engines: {node: '>=12'} + dependencies: + string-width: 5.1.2 + dev: false + + /wildcard@2.0.1: + resolution: {integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==} + + /wordwrapjs@4.0.1: + resolution: {integrity: sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==} + engines: {node: '>=8.0.0'} + dependencies: + reduce-flatten: 2.0.0 + typical: 5.2.0 + dev: true + + /workerpool@6.2.1: + resolution: {integrity: sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==} + dev: true + + /wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + /wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + /write-file-atomic@3.0.3: + resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} + dependencies: + imurmurhash: 0.1.4 + is-typedarray: 1.0.0 + signal-exit: 3.0.7 + typedarray-to-buffer: 3.1.5 + dev: false + + /ws@7.5.9: + resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: false + + /ws@8.14.2: + resolution: {integrity: sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + /xdg-basedir@4.0.0: + resolution: {integrity: sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==} + engines: {node: '>=8'} + dev: false + + /xdg-basedir@5.1.0: + resolution: {integrity: sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==} + engines: {node: '>=12'} + dev: false + + /xml-but-prettier@1.0.1: + resolution: {integrity: sha512-C2CJaadHrZTqESlH03WOyw0oZTtoy2uEg6dSDF6YRg+9GnYNub53RRemLpnvtbHDFelxMx4LajiFsYeR6XJHgQ==} + dependencies: + repeat-string: 1.6.1 + dev: false + + /xml-js@1.6.11: + resolution: {integrity: sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==} + hasBin: true + dependencies: + sax: 1.3.0 + dev: false + + /xml-name-validator@4.0.0: + resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} + engines: {node: '>=12'} + dev: true + + /xml2js@0.5.0: + resolution: {integrity: sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==} + engines: {node: '>=4.0.0'} + dependencies: + sax: 1.3.0 + xmlbuilder: 11.0.1 + + /xml@1.0.1: + resolution: {integrity: sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==} + + /xmlbuilder@11.0.1: + resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} + engines: {node: '>=4.0'} + + /xmlbuilder@15.1.1: + resolution: {integrity: sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==} + engines: {node: '>=8.0'} + + /xmlchars@2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + dev: true + + /xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + + /y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + /yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + /yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + + /yaml@2.3.3: + resolution: {integrity: sha512-zw0VAJxgeZ6+++/su5AFoqBbZbrEakwu+X0M5HmcwUiBL7AzcuPKjj5we4xfQLp78LkEMpD0cOnUhmgOVy3KdQ==} + engines: {node: '>= 14'} + dev: false + + /yargs-parser@20.2.4: + resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} + engines: {node: '>=10'} + dev: true + + /yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + /yargs-unparser@2.0.0: + resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} + engines: {node: '>=10'} + dependencies: + camelcase: 6.3.0 + decamelize: 4.0.0 + flat: 5.0.2 + is-plain-obj: 2.1.0 + dev: true + + /yargs@16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} + dependencies: + cliui: 7.0.4 + escalade: 3.1.1 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 20.2.4 + dev: true + + /yargs@17.3.1: + resolution: {integrity: sha512-WUANQeVgjLbNsEmGk20f+nlHgOqzRFpiGWVaBrYGYIGANIIu3lWjoyi0fNlFmJkvfhCZ6BXINe7/W2O2bV4iaA==} + engines: {node: '>=12'} + dependencies: + cliui: 7.0.4 + escalade: 3.1.1 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + dev: false + + /yargs@17.6.2: + resolution: {integrity: sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==} + engines: {node: '>=12'} + dependencies: + cliui: 8.0.1 + escalade: 3.1.1 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + dev: false + + /yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + dependencies: + cliui: 8.0.1 + escalade: 3.1.1 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + /yauzl@2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 + dev: true + + /yazl@2.5.1: + resolution: {integrity: sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==} + dependencies: + buffer-crc32: 0.2.13 + dev: true + + /yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + /yocto-queue@1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} + dev: false + + /zenscroll@4.0.2: + resolution: {integrity: sha512-jEA1znR7b4C/NnaycInCU6h/d15ZzCd1jmsruqOKnZP6WXQSMH3W2GL+OXbkruslU4h+Tzuos0HdswzRUk/Vgg==} + dev: false + + /zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + dev: false diff --git a/common/config/rush/repo-state.json b/common/config/rush/repo-state.json new file mode 100644 index 0000000000..0e7b144099 --- /dev/null +++ b/common/config/rush/repo-state.json @@ -0,0 +1,4 @@ +// DO NOT MODIFY THIS FILE MANUALLY BUT DO COMMIT IT. It is generated and used by Rush. +{ + "preferredVersionsHash": "bf21a9e8fbc5a3846fb05b4fa0859e0917b2202f" +} diff --git a/common/config/rush/version-policies.json b/common/config/rush/version-policies.json new file mode 100644 index 0000000000..f46761a193 --- /dev/null +++ b/common/config/rush/version-policies.json @@ -0,0 +1,100 @@ +/** + * This is configuration file is used for advanced publishing configurations with Rush. + * For full documentation, please see https://rushjs.io + */ + +/** + * A list of version policy definitions. A "version policy" is a custom package versioning + * strategy that affets "rush change", "rush version", and "rush publish". The strategy applies + * to a set of projects that are specified using the "versionPolicyName" field in rush.json. + */ +[ + { + "definitionName": "lockStepVersion", + "policyName": "typespec-azure", + "version": "0.37.0", + "nextBump": "minor" + }, + { + "definitionName": "individualVersion", + "policyName": "nuget" + } + // { + // /** + // * (Required) Indicates the kind of version policy being defined ("lockStepVersion" or "individualVersion"). + // * + // * The "lockStepVersion" mode specifies that the projects will use "lock-step versioning". This + // * strategy is appropriate for a set of packages that act as selectable components of a + // * unified product. The entire set of packages are always published together, and always share + // * the same NPM version number. When the packages depend on other packages in the set, the + // * SemVer range is usually restricted to a single version. + // */ + // "definitionName": "lockStepVersion", + // + // /** + // * (Required) The name that will be used for the "versionPolicyName" field in rush.json. + // * This name is also used command-line parameters such as "--version-policy" + // * and "--to-version-policy". + // */ + // "policyName": "MyBigFramework", + // + // /** + // * (Required) The current version. All packages belonging to the set should have this version + // * in the current branch. When bumping versions, Rush uses this to determine the next version. + // * (The "version" field in package.json is NOT considered.) + // */ + // "version": "1.0.0", + // + // /** + // * (Required) The type of bump that will be performed when publishing the next release. + // * When creating a release branch in Git, this field should be updated according to the + // * type of release. + // * + // * Valid values are: "prerelease", "release", "minor", "patch", "major" + // */ + // "nextBump": "prerelease", + // + // /** + // * (Optional) If specified, all packages in the set share a common CHANGELOG.md file. + // * This file is stored with the specified "main" project, which must be a member of the set. + // * + // * If this field is omitted, then a separate CHANGELOG.md file will be maintained for each + // * package in the set. + // */ + // "mainProject": "my-app" + // }, + // + // { + // /** + // * (Required) Indicates the kind of version policy being defined ("lockStepVersion" or "individualVersion"). + // * + // * The "individualVersion" mode specifies that the projects will use "individual versioning". + // * This is the typical NPM model where each package has an independent version number + // * and CHANGELOG.md file. Although a single CI definition is responsible for publishing the + // * packages, they otherwise don't have any special relationship. The version bumping will + // * depend on how developers answer the "rush change" questions for each package that + // * is changed. + // */ + // "definitionName": "individualVersion", + // + // "policyName": "MyRandomLibraries", + // + // /** + // * (Optional) This can be used to enforce that all packages in the set must share a common + // * major version number, e.g. because they are from the same major release branch. + // * It can also be used to discourage people from accidentally making "MAJOR" SemVer changes + // * inappropriately. The minor/patch version parts will be bumped independently according + // * to the types of changes made to each project, according to the "rush change" command. + // */ + // "lockedMajor": 3, + // + // /** + // * (Optional) When publishing is managed by Rush, by default the "rush change" command will + // * request changes for any projects that are modified by a pull request. These change entries + // * will produce a CHANGELOG.md file. If you author your CHANGELOG.md manually or announce updates + // * in some other way, set "exemptFromRushChange" to true to tell "rush change" to ignore the projects + // * belonging to this version policy. + // */ + // "exemptFromRushChange": false + // } +] diff --git a/common/scripts/install-run-rush-pnpm.js b/common/scripts/install-run-rush-pnpm.js new file mode 100644 index 0000000000..72a7bfdf08 --- /dev/null +++ b/common/scripts/install-run-rush-pnpm.js @@ -0,0 +1,28 @@ +// THIS FILE WAS GENERATED BY A TOOL. ANY MANUAL MODIFICATIONS WILL GET OVERWRITTEN WHENEVER RUSH IS UPGRADED. +// +// This script is intended for usage in an automated build environment where the Rush command may not have +// been preinstalled, or may have an unpredictable version. This script will automatically install the version of Rush +// specified in the rush.json configuration file (if not already installed), and then pass a command-line to the +// rush-pnpm command. +// +// An example usage would be: +// +// node common/scripts/install-run-rush-pnpm.js pnpm-command +// +// For more information, see: https://rushjs.io/pages/maintainer/setup_new_repo/ + +/******/ (() => { // webpackBootstrap +/******/ "use strict"; +var __webpack_exports__ = {}; +/*!*****************************************************!*\ + !*** ./lib-esnext/scripts/install-run-rush-pnpm.js ***! + \*****************************************************/ + +// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license. +// See LICENSE in the project root for license information. +require('./install-run-rush'); +//# sourceMappingURL=install-run-rush-pnpm.js.map +module.exports = __webpack_exports__; +/******/ })() +; +//# sourceMappingURL=install-run-rush-pnpm.js.map \ No newline at end of file diff --git a/common/scripts/install-run-rush.js b/common/scripts/install-run-rush.js new file mode 100644 index 0000000000..fe5101a2ad --- /dev/null +++ b/common/scripts/install-run-rush.js @@ -0,0 +1,215 @@ +// THIS FILE WAS GENERATED BY A TOOL. ANY MANUAL MODIFICATIONS WILL GET OVERWRITTEN WHENEVER RUSH IS UPGRADED. +// +// This script is intended for usage in an automated build environment where the Rush command may not have +// been preinstalled, or may have an unpredictable version. This script will automatically install the version of Rush +// specified in the rush.json configuration file (if not already installed), and then pass a command-line to it. +// An example usage would be: +// +// node common/scripts/install-run-rush.js install +// +// For more information, see: https://rushjs.io/pages/maintainer/setup_new_repo/ + +/******/ (() => { // webpackBootstrap +/******/ "use strict"; +/******/ var __webpack_modules__ = ({ + +/***/ 657147: +/*!*********************!*\ + !*** external "fs" ***! + \*********************/ +/***/ ((module) => { + +module.exports = require("fs"); + +/***/ }), + +/***/ 371017: +/*!***********************!*\ + !*** external "path" ***! + \***********************/ +/***/ ((module) => { + +module.exports = require("path"); + +/***/ }) + +/******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/compat get default export */ +/******/ (() => { +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = (module) => { +/******/ var getter = module && module.__esModule ? +/******/ () => (module['default']) : +/******/ () => (module); +/******/ __webpack_require__.d(getter, { a: getter }); +/******/ return getter; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = (exports, definition) => { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/******/ /* webpack/runtime/make namespace object */ +/******/ (() => { +/******/ // define __esModule on exports +/******/ __webpack_require__.r = (exports) => { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ })(); +/******/ +/************************************************************************/ +var __webpack_exports__ = {}; +// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk. +(() => { +/*!************************************************!*\ + !*** ./lib-esnext/scripts/install-run-rush.js ***! + \************************************************/ +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! path */ 371017); +/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! fs */ 657147); +/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(fs__WEBPACK_IMPORTED_MODULE_1__); +// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license. +// See LICENSE in the project root for license information. +/* eslint-disable no-console */ + + +const { installAndRun, findRushJsonFolder, RUSH_JSON_FILENAME, runWithErrorAndStatusCode } = require('./install-run'); +const PACKAGE_NAME = '@microsoft/rush'; +const RUSH_PREVIEW_VERSION = 'RUSH_PREVIEW_VERSION'; +const INSTALL_RUN_RUSH_LOCKFILE_PATH_VARIABLE = 'INSTALL_RUN_RUSH_LOCKFILE_PATH'; +function _getRushVersion(logger) { + const rushPreviewVersion = process.env[RUSH_PREVIEW_VERSION]; + if (rushPreviewVersion !== undefined) { + logger.info(`Using Rush version from environment variable ${RUSH_PREVIEW_VERSION}=${rushPreviewVersion}`); + return rushPreviewVersion; + } + const rushJsonFolder = findRushJsonFolder(); + const rushJsonPath = path__WEBPACK_IMPORTED_MODULE_0__.join(rushJsonFolder, RUSH_JSON_FILENAME); + try { + const rushJsonContents = fs__WEBPACK_IMPORTED_MODULE_1__.readFileSync(rushJsonPath, 'utf-8'); + // Use a regular expression to parse out the rushVersion value because rush.json supports comments, + // but JSON.parse does not and we don't want to pull in more dependencies than we need to in this script. + const rushJsonMatches = rushJsonContents.match(/\"rushVersion\"\s*\:\s*\"([0-9a-zA-Z.+\-]+)\"/); + return rushJsonMatches[1]; + } + catch (e) { + throw new Error(`Unable to determine the required version of Rush from rush.json (${rushJsonFolder}). ` + + "The 'rushVersion' field is either not assigned in rush.json or was specified " + + 'using an unexpected syntax.'); + } +} +function _getBin(scriptName) { + switch (scriptName.toLowerCase()) { + case 'install-run-rush-pnpm.js': + return 'rush-pnpm'; + case 'install-run-rushx.js': + return 'rushx'; + default: + return 'rush'; + } +} +function _run() { + const [nodePath /* Ex: /bin/node */, scriptPath /* /repo/common/scripts/install-run-rush.js */, ...packageBinArgs /* [build, --to, myproject] */] = process.argv; + // Detect if this script was directly invoked, or if the install-run-rushx script was invokved to select the + // appropriate binary inside the rush package to run + const scriptName = path__WEBPACK_IMPORTED_MODULE_0__.basename(scriptPath); + const bin = _getBin(scriptName); + if (!nodePath || !scriptPath) { + throw new Error('Unexpected exception: could not detect node path or script path'); + } + let commandFound = false; + let logger = { info: console.log, error: console.error }; + for (const arg of packageBinArgs) { + if (arg === '-q' || arg === '--quiet') { + // The -q/--quiet flag is supported by both `rush` and `rushx`, and will suppress + // any normal informational/diagnostic information printed during startup. + // + // To maintain the same user experience, the install-run* scripts pass along this + // flag but also use it to suppress any diagnostic information normally printed + // to stdout. + logger = { + info: () => { }, + error: console.error + }; + } + else if (!arg.startsWith('-') || arg === '-h' || arg === '--help') { + // We either found something that looks like a command (i.e. - doesn't start with a "-"), + // or we found the -h/--help flag, which can be run without a command + commandFound = true; + } + } + if (!commandFound) { + console.log(`Usage: ${scriptName} [args...]`); + if (scriptName === 'install-run-rush-pnpm.js') { + console.log(`Example: ${scriptName} pnpm-command`); + } + else if (scriptName === 'install-run-rush.js') { + console.log(`Example: ${scriptName} build --to myproject`); + } + else { + console.log(`Example: ${scriptName} custom-command`); + } + process.exit(1); + } + runWithErrorAndStatusCode(logger, () => { + const version = _getRushVersion(logger); + logger.info(`The rush.json configuration requests Rush version ${version}`); + const lockFilePath = process.env[INSTALL_RUN_RUSH_LOCKFILE_PATH_VARIABLE]; + if (lockFilePath) { + logger.info(`Found ${INSTALL_RUN_RUSH_LOCKFILE_PATH_VARIABLE}="${lockFilePath}", installing with lockfile.`); + } + return installAndRun(logger, PACKAGE_NAME, version, bin, packageBinArgs, lockFilePath); + }); +} +_run(); +//# sourceMappingURL=install-run-rush.js.map +})(); + +module.exports = __webpack_exports__; +/******/ })() +; +//# sourceMappingURL=install-run-rush.js.map \ No newline at end of file diff --git a/common/scripts/install-run-rushx.js b/common/scripts/install-run-rushx.js new file mode 100644 index 0000000000..0a0235f29a --- /dev/null +++ b/common/scripts/install-run-rushx.js @@ -0,0 +1,28 @@ +// THIS FILE WAS GENERATED BY A TOOL. ANY MANUAL MODIFICATIONS WILL GET OVERWRITTEN WHENEVER RUSH IS UPGRADED. +// +// This script is intended for usage in an automated build environment where the Rush command may not have +// been preinstalled, or may have an unpredictable version. This script will automatically install the version of Rush +// specified in the rush.json configuration file (if not already installed), and then pass a command-line to the +// rushx command. +// +// An example usage would be: +// +// node common/scripts/install-run-rushx.js custom-command +// +// For more information, see: https://rushjs.io/pages/maintainer/setup_new_repo/ + +/******/ (() => { // webpackBootstrap +/******/ "use strict"; +var __webpack_exports__ = {}; +/*!*************************************************!*\ + !*** ./lib-esnext/scripts/install-run-rushx.js ***! + \*************************************************/ + +// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license. +// See LICENSE in the project root for license information. +require('./install-run-rush'); +//# sourceMappingURL=install-run-rushx.js.map +module.exports = __webpack_exports__; +/******/ })() +; +//# sourceMappingURL=install-run-rushx.js.map \ No newline at end of file diff --git a/common/scripts/install-run.js b/common/scripts/install-run.js new file mode 100644 index 0000000000..bf89cd2311 --- /dev/null +++ b/common/scripts/install-run.js @@ -0,0 +1,716 @@ +// THIS FILE WAS GENERATED BY A TOOL. ANY MANUAL MODIFICATIONS WILL GET OVERWRITTEN WHENEVER RUSH IS UPGRADED. +// +// This script is intended for usage in an automated build environment where a Node tool may not have +// been preinstalled, or may have an unpredictable version. This script will automatically install the specified +// version of the specified tool (if not already installed), and then pass a command-line to it. +// An example usage would be: +// +// node common/scripts/install-run.js qrcode@1.2.2 qrcode https://rushjs.io +// +// For more information, see: https://rushjs.io/pages/maintainer/setup_new_repo/ + +/******/ (() => { // webpackBootstrap +/******/ "use strict"; +/******/ var __webpack_modules__ = ({ + +/***/ 679877: +/*!************************************************!*\ + !*** ./lib-esnext/utilities/npmrcUtilities.js ***! + \************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "isVariableSetInNpmrcFile": () => (/* binding */ isVariableSetInNpmrcFile), +/* harmony export */ "syncNpmrc": () => (/* binding */ syncNpmrc) +/* harmony export */ }); +/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! fs */ 657147); +/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(fs__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! path */ 371017); +/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_1__); +// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license. +// See LICENSE in the project root for license information. +// IMPORTANT - do not use any non-built-in libraries in this file + + +/** + * This function reads the content for given .npmrc file path, and also trims + * unusable lines from the .npmrc file. + * + * @returns + * The text of the the .npmrc. + */ +// create a global _combinedNpmrc for cache purpose +const _combinedNpmrcMap = new Map(); +function _trimNpmrcFile(sourceNpmrcPath) { + const combinedNpmrcFromCache = _combinedNpmrcMap.get(sourceNpmrcPath); + if (combinedNpmrcFromCache !== undefined) { + return combinedNpmrcFromCache; + } + let npmrcFileLines = fs__WEBPACK_IMPORTED_MODULE_0__.readFileSync(sourceNpmrcPath).toString().split('\n'); + npmrcFileLines = npmrcFileLines.map((line) => (line || '').trim()); + const resultLines = []; + // This finds environment variable tokens that look like "${VAR_NAME}" + const expansionRegExp = /\$\{([^\}]+)\}/g; + // Comment lines start with "#" or ";" + const commentRegExp = /^\s*[#;]/; + // Trim out lines that reference environment variables that aren't defined + for (let line of npmrcFileLines) { + let lineShouldBeTrimmed = false; + //remove spaces before or after key and value + line = line + .split('=') + .map((lineToTrim) => lineToTrim.trim()) + .join('='); + // Ignore comment lines + if (!commentRegExp.test(line)) { + const environmentVariables = line.match(expansionRegExp); + if (environmentVariables) { + for (const token of environmentVariables) { + // Remove the leading "${" and the trailing "}" from the token + const environmentVariableName = token.substring(2, token.length - 1); + // Is the environment variable defined? + if (!process.env[environmentVariableName]) { + // No, so trim this line + lineShouldBeTrimmed = true; + break; + } + } + } + } + if (lineShouldBeTrimmed) { + // Example output: + // "; MISSING ENVIRONMENT VARIABLE: //my-registry.com/npm/:_authToken=${MY_AUTH_TOKEN}" + resultLines.push('; MISSING ENVIRONMENT VARIABLE: ' + line); + } + else { + resultLines.push(line); + } + } + const combinedNpmrc = resultLines.join('\n'); + //save the cache + _combinedNpmrcMap.set(sourceNpmrcPath, combinedNpmrc); + return combinedNpmrc; +} +/** + * As a workaround, copyAndTrimNpmrcFile() copies the .npmrc file to the target folder, and also trims + * unusable lines from the .npmrc file. + * + * Why are we trimming the .npmrc lines? NPM allows environment variables to be specified in + * the .npmrc file to provide different authentication tokens for different registry. + * However, if the environment variable is undefined, it expands to an empty string, which + * produces a valid-looking mapping with an invalid URL that causes an error. Instead, + * we'd prefer to skip that line and continue looking in other places such as the user's + * home directory. + * + * @returns + * The text of the the .npmrc with lines containing undefined variables commented out. + */ +function _copyAndTrimNpmrcFile(logger, sourceNpmrcPath, targetNpmrcPath) { + logger.info(`Transforming ${sourceNpmrcPath}`); // Verbose + logger.info(` --> "${targetNpmrcPath}"`); + const combinedNpmrc = _trimNpmrcFile(sourceNpmrcPath); + fs__WEBPACK_IMPORTED_MODULE_0__.writeFileSync(targetNpmrcPath, combinedNpmrc); + return combinedNpmrc; +} +/** + * syncNpmrc() copies the .npmrc file to the target folder, and also trims unusable lines from the .npmrc file. + * If the source .npmrc file not exist, then syncNpmrc() will delete an .npmrc that is found in the target folder. + * + * IMPORTANT: THIS CODE SHOULD BE KEPT UP TO DATE WITH Utilities._syncNpmrc() + * + * @returns + * The text of the the synced .npmrc, if one exists. If one does not exist, then undefined is returned. + */ +function syncNpmrc(sourceNpmrcFolder, targetNpmrcFolder, useNpmrcPublish, logger = { + // eslint-disable-next-line no-console + info: console.log, + // eslint-disable-next-line no-console + error: console.error +}) { + const sourceNpmrcPath = path__WEBPACK_IMPORTED_MODULE_1__.join(sourceNpmrcFolder, !useNpmrcPublish ? '.npmrc' : '.npmrc-publish'); + const targetNpmrcPath = path__WEBPACK_IMPORTED_MODULE_1__.join(targetNpmrcFolder, '.npmrc'); + try { + if (fs__WEBPACK_IMPORTED_MODULE_0__.existsSync(sourceNpmrcPath)) { + return _copyAndTrimNpmrcFile(logger, sourceNpmrcPath, targetNpmrcPath); + } + else if (fs__WEBPACK_IMPORTED_MODULE_0__.existsSync(targetNpmrcPath)) { + // If the source .npmrc doesn't exist and there is one in the target, delete the one in the target + logger.info(`Deleting ${targetNpmrcPath}`); // Verbose + fs__WEBPACK_IMPORTED_MODULE_0__.unlinkSync(targetNpmrcPath); + } + } + catch (e) { + throw new Error(`Error syncing .npmrc file: ${e}`); + } +} +function isVariableSetInNpmrcFile(sourceNpmrcFolder, variableKey) { + const sourceNpmrcPath = `${sourceNpmrcFolder}/.npmrc`; + //if .npmrc file does not exist, return false directly + if (!fs__WEBPACK_IMPORTED_MODULE_0__.existsSync(sourceNpmrcPath)) { + return false; + } + const trimmedNpmrcFile = _trimNpmrcFile(sourceNpmrcPath); + const variableKeyRegExp = new RegExp(`^${variableKey}=`, 'm'); + return trimmedNpmrcFile.match(variableKeyRegExp) !== null; +} +//# sourceMappingURL=npmrcUtilities.js.map + +/***/ }), + +/***/ 532081: +/*!********************************!*\ + !*** external "child_process" ***! + \********************************/ +/***/ ((module) => { + +module.exports = require("child_process"); + +/***/ }), + +/***/ 657147: +/*!*********************!*\ + !*** external "fs" ***! + \*********************/ +/***/ ((module) => { + +module.exports = require("fs"); + +/***/ }), + +/***/ 822037: +/*!*********************!*\ + !*** external "os" ***! + \*********************/ +/***/ ((module) => { + +module.exports = require("os"); + +/***/ }), + +/***/ 371017: +/*!***********************!*\ + !*** external "path" ***! + \***********************/ +/***/ ((module) => { + +module.exports = require("path"); + +/***/ }) + +/******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/compat get default export */ +/******/ (() => { +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = (module) => { +/******/ var getter = module && module.__esModule ? +/******/ () => (module['default']) : +/******/ () => (module); +/******/ __webpack_require__.d(getter, { a: getter }); +/******/ return getter; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = (exports, definition) => { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/******/ /* webpack/runtime/make namespace object */ +/******/ (() => { +/******/ // define __esModule on exports +/******/ __webpack_require__.r = (exports) => { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ })(); +/******/ +/************************************************************************/ +var __webpack_exports__ = {}; +// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk. +(() => { +/*!*******************************************!*\ + !*** ./lib-esnext/scripts/install-run.js ***! + \*******************************************/ +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "RUSH_JSON_FILENAME": () => (/* binding */ RUSH_JSON_FILENAME), +/* harmony export */ "findRushJsonFolder": () => (/* binding */ findRushJsonFolder), +/* harmony export */ "getNpmPath": () => (/* binding */ getNpmPath), +/* harmony export */ "installAndRun": () => (/* binding */ installAndRun), +/* harmony export */ "runWithErrorAndStatusCode": () => (/* binding */ runWithErrorAndStatusCode) +/* harmony export */ }); +/* harmony import */ var child_process__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! child_process */ 532081); +/* harmony import */ var child_process__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(child_process__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! fs */ 657147); +/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(fs__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var os__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! os */ 822037); +/* harmony import */ var os__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(os__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! path */ 371017); +/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _utilities_npmrcUtilities__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utilities/npmrcUtilities */ 679877); +// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license. +// See LICENSE in the project root for license information. +/* eslint-disable no-console */ + + + + + +const RUSH_JSON_FILENAME = 'rush.json'; +const RUSH_TEMP_FOLDER_ENV_VARIABLE_NAME = 'RUSH_TEMP_FOLDER'; +const INSTALL_RUN_LOCKFILE_PATH_VARIABLE = 'INSTALL_RUN_LOCKFILE_PATH'; +const INSTALLED_FLAG_FILENAME = 'installed.flag'; +const NODE_MODULES_FOLDER_NAME = 'node_modules'; +const PACKAGE_JSON_FILENAME = 'package.json'; +/** + * Parse a package specifier (in the form of name\@version) into name and version parts. + */ +function _parsePackageSpecifier(rawPackageSpecifier) { + rawPackageSpecifier = (rawPackageSpecifier || '').trim(); + const separatorIndex = rawPackageSpecifier.lastIndexOf('@'); + let name; + let version = undefined; + if (separatorIndex === 0) { + // The specifier starts with a scope and doesn't have a version specified + name = rawPackageSpecifier; + } + else if (separatorIndex === -1) { + // The specifier doesn't have a version + name = rawPackageSpecifier; + } + else { + name = rawPackageSpecifier.substring(0, separatorIndex); + version = rawPackageSpecifier.substring(separatorIndex + 1); + } + if (!name) { + throw new Error(`Invalid package specifier: ${rawPackageSpecifier}`); + } + return { name, version }; +} +let _npmPath = undefined; +/** + * Get the absolute path to the npm executable + */ +function getNpmPath() { + if (!_npmPath) { + try { + if (os__WEBPACK_IMPORTED_MODULE_2__.platform() === 'win32') { + // We're on Windows + const whereOutput = child_process__WEBPACK_IMPORTED_MODULE_0__.execSync('where npm', { stdio: [] }).toString(); + const lines = whereOutput.split(os__WEBPACK_IMPORTED_MODULE_2__.EOL).filter((line) => !!line); + // take the last result, we are looking for a .cmd command + // see https://github.com/microsoft/rushstack/issues/759 + _npmPath = lines[lines.length - 1]; + } + else { + // We aren't on Windows - assume we're on *NIX or Darwin + _npmPath = child_process__WEBPACK_IMPORTED_MODULE_0__.execSync('command -v npm', { stdio: [] }).toString(); + } + } + catch (e) { + throw new Error(`Unable to determine the path to the NPM tool: ${e}`); + } + _npmPath = _npmPath.trim(); + if (!fs__WEBPACK_IMPORTED_MODULE_1__.existsSync(_npmPath)) { + throw new Error('The NPM executable does not exist'); + } + } + return _npmPath; +} +function _ensureFolder(folderPath) { + if (!fs__WEBPACK_IMPORTED_MODULE_1__.existsSync(folderPath)) { + const parentDir = path__WEBPACK_IMPORTED_MODULE_3__.dirname(folderPath); + _ensureFolder(parentDir); + fs__WEBPACK_IMPORTED_MODULE_1__.mkdirSync(folderPath); + } +} +/** + * Create missing directories under the specified base directory, and return the resolved directory. + * + * Does not support "." or ".." path segments. + * Assumes the baseFolder exists. + */ +function _ensureAndJoinPath(baseFolder, ...pathSegments) { + let joinedPath = baseFolder; + try { + for (let pathSegment of pathSegments) { + pathSegment = pathSegment.replace(/[\\\/]/g, '+'); + joinedPath = path__WEBPACK_IMPORTED_MODULE_3__.join(joinedPath, pathSegment); + if (!fs__WEBPACK_IMPORTED_MODULE_1__.existsSync(joinedPath)) { + fs__WEBPACK_IMPORTED_MODULE_1__.mkdirSync(joinedPath); + } + } + } + catch (e) { + throw new Error(`Error building local installation folder (${path__WEBPACK_IMPORTED_MODULE_3__.join(baseFolder, ...pathSegments)}): ${e}`); + } + return joinedPath; +} +function _getRushTempFolder(rushCommonFolder) { + const rushTempFolder = process.env[RUSH_TEMP_FOLDER_ENV_VARIABLE_NAME]; + if (rushTempFolder !== undefined) { + _ensureFolder(rushTempFolder); + return rushTempFolder; + } + else { + return _ensureAndJoinPath(rushCommonFolder, 'temp'); + } +} +/** + * Compare version strings according to semantic versioning. + * Returns a positive integer if "a" is a later version than "b", + * a negative integer if "b" is later than "a", + * and 0 otherwise. + */ +function _compareVersionStrings(a, b) { + const aParts = a.split(/[.-]/); + const bParts = b.split(/[.-]/); + const numberOfParts = Math.max(aParts.length, bParts.length); + for (let i = 0; i < numberOfParts; i++) { + if (aParts[i] !== bParts[i]) { + return (Number(aParts[i]) || 0) - (Number(bParts[i]) || 0); + } + } + return 0; +} +/** + * Resolve a package specifier to a static version + */ +function _resolvePackageVersion(logger, rushCommonFolder, { name, version }) { + if (!version) { + version = '*'; // If no version is specified, use the latest version + } + if (version.match(/^[a-zA-Z0-9\-\+\.]+$/)) { + // If the version contains only characters that we recognize to be used in static version specifiers, + // pass the version through + return version; + } + else { + // version resolves to + try { + const rushTempFolder = _getRushTempFolder(rushCommonFolder); + const sourceNpmrcFolder = path__WEBPACK_IMPORTED_MODULE_3__.join(rushCommonFolder, 'config', 'rush'); + (0,_utilities_npmrcUtilities__WEBPACK_IMPORTED_MODULE_4__.syncNpmrc)(sourceNpmrcFolder, rushTempFolder, undefined, logger); + const npmPath = getNpmPath(); + // This returns something that looks like: + // ``` + // [ + // "3.0.0", + // "3.0.1", + // ... + // "3.0.20" + // ] + // ``` + // + // if multiple versions match the selector, or + // + // ``` + // "3.0.0" + // ``` + // + // if only a single version matches. + const npmVersionSpawnResult = child_process__WEBPACK_IMPORTED_MODULE_0__.spawnSync(npmPath, ['view', `${name}@${version}`, 'version', '--no-update-notifier', '--json'], { + cwd: rushTempFolder, + stdio: [] + }); + if (npmVersionSpawnResult.status !== 0) { + throw new Error(`"npm view" returned error code ${npmVersionSpawnResult.status}`); + } + const npmViewVersionOutput = npmVersionSpawnResult.stdout.toString(); + const parsedVersionOutput = JSON.parse(npmViewVersionOutput); + const versions = Array.isArray(parsedVersionOutput) + ? parsedVersionOutput + : [parsedVersionOutput]; + let latestVersion = versions[0]; + for (let i = 1; i < versions.length; i++) { + const latestVersionCandidate = versions[i]; + if (_compareVersionStrings(latestVersionCandidate, latestVersion) > 0) { + latestVersion = latestVersionCandidate; + } + } + if (!latestVersion) { + throw new Error('No versions found for the specified version range.'); + } + return latestVersion; + } + catch (e) { + throw new Error(`Unable to resolve version ${version} of package ${name}: ${e}`); + } + } +} +let _rushJsonFolder; +/** + * Find the absolute path to the folder containing rush.json + */ +function findRushJsonFolder() { + if (!_rushJsonFolder) { + let basePath = __dirname; + let tempPath = __dirname; + do { + const testRushJsonPath = path__WEBPACK_IMPORTED_MODULE_3__.join(basePath, RUSH_JSON_FILENAME); + if (fs__WEBPACK_IMPORTED_MODULE_1__.existsSync(testRushJsonPath)) { + _rushJsonFolder = basePath; + break; + } + else { + basePath = tempPath; + } + } while (basePath !== (tempPath = path__WEBPACK_IMPORTED_MODULE_3__.dirname(basePath))); // Exit the loop when we hit the disk root + if (!_rushJsonFolder) { + throw new Error('Unable to find rush.json.'); + } + } + return _rushJsonFolder; +} +/** + * Detects if the package in the specified directory is installed + */ +function _isPackageAlreadyInstalled(packageInstallFolder) { + try { + const flagFilePath = path__WEBPACK_IMPORTED_MODULE_3__.join(packageInstallFolder, INSTALLED_FLAG_FILENAME); + if (!fs__WEBPACK_IMPORTED_MODULE_1__.existsSync(flagFilePath)) { + return false; + } + const fileContents = fs__WEBPACK_IMPORTED_MODULE_1__.readFileSync(flagFilePath).toString(); + return fileContents.trim() === process.version; + } + catch (e) { + return false; + } +} +/** + * Delete a file. Fail silently if it does not exist. + */ +function _deleteFile(file) { + try { + fs__WEBPACK_IMPORTED_MODULE_1__.unlinkSync(file); + } + catch (err) { + if (err.code !== 'ENOENT' && err.code !== 'ENOTDIR') { + throw err; + } + } +} +/** + * Removes the following files and directories under the specified folder path: + * - installed.flag + * - + * - node_modules + */ +function _cleanInstallFolder(rushTempFolder, packageInstallFolder, lockFilePath) { + try { + const flagFile = path__WEBPACK_IMPORTED_MODULE_3__.resolve(packageInstallFolder, INSTALLED_FLAG_FILENAME); + _deleteFile(flagFile); + const packageLockFile = path__WEBPACK_IMPORTED_MODULE_3__.resolve(packageInstallFolder, 'package-lock.json'); + if (lockFilePath) { + fs__WEBPACK_IMPORTED_MODULE_1__.copyFileSync(lockFilePath, packageLockFile); + } + else { + // Not running `npm ci`, so need to cleanup + _deleteFile(packageLockFile); + const nodeModulesFolder = path__WEBPACK_IMPORTED_MODULE_3__.resolve(packageInstallFolder, NODE_MODULES_FOLDER_NAME); + if (fs__WEBPACK_IMPORTED_MODULE_1__.existsSync(nodeModulesFolder)) { + const rushRecyclerFolder = _ensureAndJoinPath(rushTempFolder, 'rush-recycler'); + fs__WEBPACK_IMPORTED_MODULE_1__.renameSync(nodeModulesFolder, path__WEBPACK_IMPORTED_MODULE_3__.join(rushRecyclerFolder, `install-run-${Date.now().toString()}`)); + } + } + } + catch (e) { + throw new Error(`Error cleaning the package install folder (${packageInstallFolder}): ${e}`); + } +} +function _createPackageJson(packageInstallFolder, name, version) { + try { + const packageJsonContents = { + name: 'ci-rush', + version: '0.0.0', + dependencies: { + [name]: version + }, + description: "DON'T WARN", + repository: "DON'T WARN", + license: 'MIT' + }; + const packageJsonPath = path__WEBPACK_IMPORTED_MODULE_3__.join(packageInstallFolder, PACKAGE_JSON_FILENAME); + fs__WEBPACK_IMPORTED_MODULE_1__.writeFileSync(packageJsonPath, JSON.stringify(packageJsonContents, undefined, 2)); + } + catch (e) { + throw new Error(`Unable to create package.json: ${e}`); + } +} +/** + * Run "npm install" in the package install folder. + */ +function _installPackage(logger, packageInstallFolder, name, version, command) { + try { + logger.info(`Installing ${name}...`); + const npmPath = getNpmPath(); + const result = child_process__WEBPACK_IMPORTED_MODULE_0__.spawnSync(npmPath, [command], { + stdio: 'inherit', + cwd: packageInstallFolder, + env: process.env + }); + if (result.status !== 0) { + throw new Error(`"npm ${command}" encountered an error`); + } + logger.info(`Successfully installed ${name}@${version}`); + } + catch (e) { + throw new Error(`Unable to install package: ${e}`); + } +} +/** + * Get the ".bin" path for the package. + */ +function _getBinPath(packageInstallFolder, binName) { + const binFolderPath = path__WEBPACK_IMPORTED_MODULE_3__.resolve(packageInstallFolder, NODE_MODULES_FOLDER_NAME, '.bin'); + const resolvedBinName = os__WEBPACK_IMPORTED_MODULE_2__.platform() === 'win32' ? `${binName}.cmd` : binName; + return path__WEBPACK_IMPORTED_MODULE_3__.resolve(binFolderPath, resolvedBinName); +} +/** + * Write a flag file to the package's install directory, signifying that the install was successful. + */ +function _writeFlagFile(packageInstallFolder) { + try { + const flagFilePath = path__WEBPACK_IMPORTED_MODULE_3__.join(packageInstallFolder, INSTALLED_FLAG_FILENAME); + fs__WEBPACK_IMPORTED_MODULE_1__.writeFileSync(flagFilePath, process.version); + } + catch (e) { + throw new Error(`Unable to create installed.flag file in ${packageInstallFolder}`); + } +} +function installAndRun(logger, packageName, packageVersion, packageBinName, packageBinArgs, lockFilePath = process.env[INSTALL_RUN_LOCKFILE_PATH_VARIABLE]) { + const rushJsonFolder = findRushJsonFolder(); + const rushCommonFolder = path__WEBPACK_IMPORTED_MODULE_3__.join(rushJsonFolder, 'common'); + const rushTempFolder = _getRushTempFolder(rushCommonFolder); + const packageInstallFolder = _ensureAndJoinPath(rushTempFolder, 'install-run', `${packageName}@${packageVersion}`); + if (!_isPackageAlreadyInstalled(packageInstallFolder)) { + // The package isn't already installed + _cleanInstallFolder(rushTempFolder, packageInstallFolder, lockFilePath); + const sourceNpmrcFolder = path__WEBPACK_IMPORTED_MODULE_3__.join(rushCommonFolder, 'config', 'rush'); + (0,_utilities_npmrcUtilities__WEBPACK_IMPORTED_MODULE_4__.syncNpmrc)(sourceNpmrcFolder, packageInstallFolder, undefined, logger); + _createPackageJson(packageInstallFolder, packageName, packageVersion); + const command = lockFilePath ? 'ci' : 'install'; + _installPackage(logger, packageInstallFolder, packageName, packageVersion, command); + _writeFlagFile(packageInstallFolder); + } + const statusMessage = `Invoking "${packageBinName} ${packageBinArgs.join(' ')}"`; + const statusMessageLine = new Array(statusMessage.length + 1).join('-'); + logger.info('\n' + statusMessage + '\n' + statusMessageLine + '\n'); + const binPath = _getBinPath(packageInstallFolder, packageBinName); + const binFolderPath = path__WEBPACK_IMPORTED_MODULE_3__.resolve(packageInstallFolder, NODE_MODULES_FOLDER_NAME, '.bin'); + // Windows environment variables are case-insensitive. Instead of using SpawnSyncOptions.env, we need to + // assign via the process.env proxy to ensure that we append to the right PATH key. + const originalEnvPath = process.env.PATH || ''; + let result; + try { + // Node.js on Windows can not spawn a file when the path has a space on it + // unless the path gets wrapped in a cmd friendly way and shell mode is used + const shouldUseShell = binPath.includes(' ') && os__WEBPACK_IMPORTED_MODULE_2__.platform() === 'win32'; + const platformBinPath = shouldUseShell ? `"${binPath}"` : binPath; + process.env.PATH = [binFolderPath, originalEnvPath].join(path__WEBPACK_IMPORTED_MODULE_3__.delimiter); + result = child_process__WEBPACK_IMPORTED_MODULE_0__.spawnSync(platformBinPath, packageBinArgs, { + stdio: 'inherit', + windowsVerbatimArguments: false, + shell: shouldUseShell, + cwd: process.cwd(), + env: process.env + }); + } + finally { + process.env.PATH = originalEnvPath; + } + if (result.status !== null) { + return result.status; + } + else { + throw result.error || new Error('An unknown error occurred.'); + } +} +function runWithErrorAndStatusCode(logger, fn) { + process.exitCode = 1; + try { + const exitCode = fn(); + process.exitCode = exitCode; + } + catch (e) { + logger.error('\n\n' + e.toString() + '\n\n'); + } +} +function _run() { + const [nodePath /* Ex: /bin/node */, scriptPath /* /repo/common/scripts/install-run-rush.js */, rawPackageSpecifier /* qrcode@^1.2.0 */, packageBinName /* qrcode */, ...packageBinArgs /* [-f, myproject/lib] */] = process.argv; + if (!nodePath) { + throw new Error('Unexpected exception: could not detect node path'); + } + if (path__WEBPACK_IMPORTED_MODULE_3__.basename(scriptPath).toLowerCase() !== 'install-run.js') { + // If install-run.js wasn't directly invoked, don't execute the rest of this function. Return control + // to the script that (presumably) imported this file + return; + } + if (process.argv.length < 4) { + console.log('Usage: install-run.js @ [args...]'); + console.log('Example: install-run.js qrcode@1.2.2 qrcode https://rushjs.io'); + process.exit(1); + } + const logger = { info: console.log, error: console.error }; + runWithErrorAndStatusCode(logger, () => { + const rushJsonFolder = findRushJsonFolder(); + const rushCommonFolder = _ensureAndJoinPath(rushJsonFolder, 'common'); + const packageSpecifier = _parsePackageSpecifier(rawPackageSpecifier); + const name = packageSpecifier.name; + const version = _resolvePackageVersion(logger, rushCommonFolder, packageSpecifier); + if (packageSpecifier.version !== version) { + console.log(`Resolved to ${name}@${version}`); + } + return installAndRun(logger, name, version, packageBinName, packageBinArgs); + }); +} +_run(); +//# sourceMappingURL=install-run.js.map +})(); + +module.exports = __webpack_exports__; +/******/ })() +; +//# sourceMappingURL=install-run.js.map \ No newline at end of file diff --git a/core b/core new file mode 160000 index 0000000000..e52a32c76a --- /dev/null +++ b/core @@ -0,0 +1 @@ +Subproject commit e52a32c76af68f2113584bec070753ea19f791db diff --git a/cspell.yaml b/cspell.yaml new file mode 100644 index 0000000000..b219e454f3 --- /dev/null +++ b/cspell.yaml @@ -0,0 +1,48 @@ +version: "0.2" +language: en +allowCompoundWords: true +import: + - core/cspell.yaml +dictionaries: + - node + - typescript +ignorePaths: + - "**/node_modules/**" + - "**/dist/**" + - "**/dist-dev/**" + - "**/CHANGELOG.md" + - common/scripts/* + - packages/website/build/* +enableFiletypes: + - cadl +words: + - allof + - apim + - apos + - azsdk + - Bazs + - byos + - clsx + - DMSS + - Donezo + - dynatrace + - foos + - horiz + - Howtos + - liftr + - logz + - LRO + - msazure + - msdata + - odata + - Onco + - oncophenotype + - prismjs + - regionality + - rpaasoneboxacr + - rpass + - SERVICERP + - userrp + - lropaging + - armId + - tcgc diff --git a/design/unions.md b/design/unions.md new file mode 100644 index 0000000000..d590f9ca95 --- /dev/null +++ b/design/unions.md @@ -0,0 +1,294 @@ +## Design for support of unions in TypeSpec + +### TypeSpec Unions + +There are two ways to define a union in TypeSpec. + +1. using the "|" symbol, e.g. `Cat | Dog`. +2. with a `union` statement, which (currently) requires that each variant of the union has a name. E.g. + +``` +union Pet { cat: Cat, dog: Dog } +``` + +#### typespec-autorest + +In typespec-autorest, any union containing more than one non-null model is an error, +except as the return-type of an operation, where union variants can represent the body of different responses (status codes). + +#### openapi3 + +openapi3 will emit "|" unions as an `anyOf`. + +openapi3 will support a `@oneOf` decorator on the `union` statement which specifies that a union defined in a `union` statement should be emitted as a `oneOf`: + +E .g. + +```typespec +model Cat extends Pet { + kind: "cat"; + meow: int32; +} + +model Dog extends Pet { + kind: "dog"; + bark: string; +} + +@oneOf +union Pet { + cat: Cat, + dog: Dog, +} +``` + +will be rendered in openapi3 as: + +```yaml +components: + schemas: + Pet: + oneOf: + - $ref: "#/components/schemas/Cat" + - $ref: "#/components/schemas/Dog" + + Cat: + properties: + kind: + type: string + enum: ["cat"] + meow: + type: integer + required: ["kind", "meow"] + Dog: + properties: + kind: + type: string + enum: ["dog"] + bark: + type: string + required: ["kind", "bark"] +``` + +In openapi3, a union defined with a `union` statement without an `@oneOf` decorator will be rendered as an `anyOf` + +openapi3 will ignore the "names" for variants in named unions. + +### Discriminated Unions + +Both typespec-autorest and openapi3 will support the `@discriminator(propertyName)` decorator on a `model`. + +E .g. + +```typespec +@discriminator("kind") +model Pet {} + +model Cat extends Pet { + kind: "cat"; + meow: int32; +} + +model Dog extends Pet { + kind: "dog"; + bark: string; +} +``` + +Notes: + +- Until the subtyping feature is implemented, this will implicitly define `propertyName` as a required string property of the model. +- When subtyping is implemented, `propertyName` should be defined in the model. It can be defined either as "string" -- "open" style, or as a union of string literals or as an enum -- a "closed" type. +- The model can have other properties besides the discriminator. +- When `@discriminator` is specified we should verify that "propertyName" is defined in each model that extends the discriminated model as a string property and required. We should also ensure that all constant values of the discriminator are unique. + +#### typespec-autorest + +In typespec-autorest, a model with the @discriminator decorator and all models that extend it will produce an "oas2 discriminated union" with autorest extensions, e.g.: + +```yaml +definitions: + Pet: + discriminator: kind + properties: + kind: + type: string + required: + - kind + + Cat: + x-ms-discriminator-value: cat + allOf: + - "#/defintions/Pet" + properties: + kind: + type: string + meow: + type: integer + required: ["kind", "meow"] + Dog: + x-ms-discriminator-value: dog + allOf: + - "#/defintions/Pet" + properties: + kind: + type: string + bark: + type: string + required: ["kind", "bark"] +``` + +Notes: + +- typespec-autorest will issue a warning if the discriminator property in a variant is not a string literal value. +- typespec-autorest suppresses the `enum` for the discriminator property since autorest does not allow it. +- The `x-ms-discriminator-value` extension is only produced if the discriminator property in the variant is a (single) string constant. + +#### openapi3 + +In openapi3, a model with the @discriminator decorator and all models that extend it will produce an ["oas3 models with polymorphism pattern"](https://github.com/OAI/OpenAPI-Specification/blob/3.0.3/versions/3.0.3.md#models-with-polymorphism-support). + +```yaml +components: + schemas: + Pet: + discriminator: + propertyName: kind + mapping: + cat: "#/components/schemas/Cat" + dog: "#/components/schemas/Dog" + + Cat: + allof: + - $ref: "#/components/schemas/Pet" + properties: + kind: + type: string + enum: ["cat"] + meow: + type: integer + required: ["kind", "meow"] + Dog: + allof: + - $ref: "#/components/schemas/Pet" + properties: + kind: + type: string + enum: ["dog"] + bark: + type: string + required: ["kind", "bark"] +``` + +Notes: + +- oas3 allows but does not require the discriminator property to be defined in the parent model. +- The "mapping" part of the discriminator will reflect any variants with a discriminator property defined as a string literal. OpenAPI 3 does not require the mapping to be exhaustive. +- openapi3 will allow a variant to define its discriminator with more than one string literal. E.g. `kind: "cat" | "dog"`. + +### Discriminated Unions with "fat" base models + +As mentioned above, a model with the @discriminator decorator may contain properties other than discriminator. + +E.g. + +```typespec +@discriminator("kind") +model Pet { + name: string; + weight: float32; +} + +model Cat extends Pet { + kind: "cat"; + meow: int32; +} + +model Dog extends Pet { + kind: "dog"; + bark: string; +} +``` + +#### typespec-autorest + +In typespec-autorest this is rendered as: + +```yaml +definitions: + Pet: + discriminator: kind + properties: + kind: + type: string + name: + type: string + weight: + type: number + format: float + required: ["kind", "name", "weight"] + + Cat: + x-ms-discriminator-value: cat + allOf: + - "#/components/schemas/Pet" + properties: + kind: + type: string + meow: + type: integer + required: ["kind", "meow"] + Dog: + x-ms-discriminator-value: dog + allOf: + - "#/components/schemas/Pet" + properties: + kind: + type: string + bark: + type: string + required: ["kind", "bark"] +``` + +### openapi3 + +In openapi3 this is rendered as + +```yaml +components: + schemas: + Pet: + properties: + name: + type: string + weight: + type: number + format: float + required: ["name", "weight"] + discriminator: + propertyName: kind + mapping: + cat: "#/components/schemas/Cat" + dog: "#/components/schemas/Dog" + + Cat: + allOf: + - $ref: "#/components/schemas/Pet" + properties: + kind: + type: string + enum: ["cat"] + meow: + type: integer + required: ["kind", "meow"] + Dog: + allOf: + - $ref: "#/components/schemas/Pet" + properties: + kind: + type: string + enum: ["dog"] + bark: + type: string + required: ["kind", "bark"] +``` diff --git a/docs/emitters/typespec-autorest/index.md b/docs/emitters/typespec-autorest/index.md new file mode 100644 index 0000000000..36b97d5f33 --- /dev/null +++ b/docs/emitters/typespec-autorest/index.md @@ -0,0 +1,198 @@ +--- +title: Overview +sidebar_position: 0 +--- + +# TypeSpec AutoRest Library + +This is a TypeSpec library that will emit an enriched OpenAPI 2.0 specification that can be consumed by AutoRest. +The generated OpenAPI spec will have custom `x-ms-` extensions properties and conform to standards required by AutoRest to generate a more accurate SDK. + +## Getting started + +1. Include `@azure-tools/typespec-autorest` dependencies in package.json + +```json +{ + ... + "dependencies": { + ... + "@azure-tools/typespec-autorest": "latest" + } +} +``` + +2. Run `npm install` to install the dependency +3. Import `@azure-tools/typespec-autorest` in your `main.tsp` file + +```typespec +import "@azure-tools/typespec-autorest"; +``` + +4. Run `tsp compile`. This will result in a `swagger.json` file crated in `./tsp-output/swagger.json` + +## Use in autorest + +Generate the OpenAPI spec as shown above then run autorest cli directly on it. + +```bash +autorest --input-file= +# Example +autorest --input-file=./tsp-output/@azure-tools/typespec-autorest/openapi.json --python +``` + +## Configuration + +### Emitter options: + +Emitter options can be configured via the `tspconfig.yaml` configuration: + +```yaml +emitters: + '@azure-tools/typespec-autorest': + : + + +# For example +emitters: + '@azure-tools/typespec-autorest': + output-file: my-custom-swagger.json +``` + +or via the command line with + +```bash +--option "@azure-tools/typespec-autorest.=" + +# For example +--option "@azure-tools/typespec-autorest.output-file=my-custom-swagger.json" +``` + +#### `azure-resource-provider-folder` + +`resource-manager` directory under your service folder are located so the emitter can emit correct sub-folder structure and swagger files for each of the API versions. You must specify it for ARM specs with folder path relative to the TypeSpec files. + +#### `emitter-output-dir` + +Set the emitter output-dir. [See here](https://microsoft.github.io/typespec/introduction/configuration#emitter-output-dir) + +#### `output-file` + +Configure the name of the swagger output file relative to the `output-dir`. + +Output file will interpolate the following values: + +- service-name: Name of the service if multiple +- version: Version of the service if multiple +- azure-resource-provider-folder: Value of the azure-resource-provider-folder option +- version-status: Only enabled if azure-resource-provider-folder is set. `preview` if version contains preview, stable otherwise. + +Default: `{azure-resource-provider-folder}/{service-name}/{version-status}/{version}/openapi.json` + +Example: Single service no versioning + +- `openapi.yaml` + +Example: Multiple services no versioning + +- `openapi.Org1.Service1.yaml` +- `openapi.Org1.Service2.yaml` + +Example: Single service with versioning + +- `openapi.v1.yaml` +- `openapi.v2.yaml` + +Example: Multiple service with versioning + +- `openapi.Org1.Service1.v1.yaml` +- `openapi.Org1.Service1.v2.yaml` +- `openapi.Org1.Service2.v1.0.yaml` +- `openapi.Org1.Service2.v1.1.yaml` + +Example: azureResourceProviderFolder is provided + +- `arm-folder/AzureService/preview/2020-01-01.yaml` +- `arm-folder/AzureService/preview/2020-01-01.yaml` + +#### `examples-directory` + +Directory where the x-ms-examples are located so the emitter can automatically link. + +#### `version` + +Select which version should be emitted if the spec support versioning. By default all the version with be emitted in this format `..json` + +### `new-line` + +Set the newline character for emitting files. Can be either: + +- `lf`(Default) +- `crlf` + +### `omit-unreachable-types` + +Only include types referenced via an operation. + +## Decorators + +- [@collectionFormat](#collectionformat) +- [@example](#example) +- [@useRef](#useref) + +### @collectionFormat + +Syntax: + +``` +@collectionFormat(formatString) +``` + +`@collectionFormat` specifies array property type serialization format. Valid format strings are "csv", "multi", "ssv", "tsv", "pipes" though "csv" or "multi" are recommended. + +`@collectionFormat` can only be specified on model properties that are arrays. + +### @example + +Syntax: + +``` +@example(pathOrUri, title) +``` + +`@example` attaches example files to an operation. Multiple examples can be specified. + +`@example` can only be specified on operations. + +### @useRef + +Syntax: + +``` +@useRef(urlString) +``` + +`@useRef` is used to replace the TypeSpec model type in emitter output with a pre-existing named OpenAPI schema such as ARM common types. + +## How to + +### Include `x-ms-skip-url-encoding` in `x-ms-parmaeterized-host` parameter + +Every parameter of type `uri` in `@server` will be marked with `x-ms-skip-url-encoding`. + +```typespec +@server("{endpoint}/v2", "Account endpoint", {endpoint: url}) +``` + +Result in + +```json5 +{ + in: "path", + name: "endpoint", + required: true, + type: "string", + format: "uri", + "x-ms-skip-url-encoding": true, +} +``` diff --git a/docs/emitters/typespec-autorest/reference/decorators.md b/docs/emitters/typespec-autorest/reference/decorators.md new file mode 100644 index 0000000000..4f366d6c08 --- /dev/null +++ b/docs/emitters/typespec-autorest/reference/decorators.md @@ -0,0 +1,50 @@ +--- +title: "Decorators" +toc_min_heading_level: 2 +toc_max_heading_level: 3 +--- + +# Decorators + +## Autorest + +### `@example` {#@Autorest.example} + +`@example` - attaches example files to an operation. Multiple examples can be specified. + +`@example` can be specified on Operations. + +```typespec +@Autorest.example(pathOrUri: valueof string, title: valueof string) +``` + +#### Target + +`Operation` + +#### Parameters + +| Name | Type | Description | +| --------- | ----------------------- | ---------------------------------------- | +| pathOrUri | `valueof scalar string` | path or Uri to the example file. | +| title | `valueof scalar string` | name or description of the example file. | + +### `@useRef` {#@Autorest.useRef} + +`@useRef` - is used to replace the TypeSpec model type in emitter output with a pre-existing named OpenAPI schema such as ARM common types. + +`@useRef` can be specified on Models and ModelProperty. + +```typespec +@Autorest.useRef(jsonRef: valueof string) +``` + +#### Target + +`union Model | ModelProperty` + +#### Parameters + +| Name | Type | Description | +| ------- | ----------------------- | --------------------------------- | +| jsonRef | `valueof scalar string` | path or Uri to an OpenAPI schema. | diff --git a/docs/emitters/typespec-autorest/reference/emitter.md b/docs/emitters/typespec-autorest/reference/emitter.md new file mode 100644 index 0000000000..d7075fe3dd --- /dev/null +++ b/docs/emitters/typespec-autorest/reference/emitter.md @@ -0,0 +1,115 @@ +--- +title: "Emitter usage" +toc_min_heading_level: 2 +toc_max_heading_level: 3 +--- + +# Emitter + +## Usage + +1. Via the command line + +```bash +tsp compile . --emit=@azure-tools/typespec-autorest +``` + +2. Via the config + +```yaml +emit: + - "@azure-tools/typespec-autorest" +``` + +## Emitter options + +### `output-dir` + +**Type:** `string` + +Deprecated DO NOT USE. Use built-in emitter-output-dir instead + +### `output-file` + +**Type:** `string` + +Name of the output file. +Output file will interpolate the following values: + +- service-name: Name of the service if multiple +- version: Version of the service if multiple +- azure-resource-provider-folder: Value of the azure-resource-provider-folder option +- version-status: Only enabled if azure-resource-provider-folder is set. `preview` if version contains preview, stable otherwise. + +Default: `{azure-resource-provider-folder}/{service-name}/{version-status}/{version}/openapi.json` + +Example: Single service no versioning + +- `openapi.yaml` + +Example: Multiple services no versioning + +- `openapi.Org1.Service1.yaml` +- `openapi.Org1.Service2.yaml` + +Example: Single service with versioning + +- `openapi.v1.yaml` +- `openapi.v2.yaml` + +Example: Multiple service with versioning + +- `openapi.Org1.Service1.v1.yaml` +- `openapi.Org1.Service1.v2.yaml` +- `openapi.Org1.Service2.v1.0.yaml` +- `openapi.Org1.Service2.v1.1.yaml` + +Example: azureResourceProviderFolder is provided + +- `arm-folder/AzureService/preview/2020-01-01.yaml` +- `arm-folder/AzureService/preview/2020-01-01.yaml` + +### `examples-directory` + +**Type:** `string` + +Directory where the examples are located. Default: `{cwd}/examples`. + +### `version` + +**Type:** `string` + +### `azure-resource-provider-folder` + +**Type:** `string` + +### `arm-types-dir` + +**Type:** `string` + +Path to the common-types.json file folder. Default: '${project-root}/../../common-types/resource-management' + +### `new-line` + +**Type:** `"crlf" | "lf"` + +Set the newline character for emitting files. + +### `omit-unreachable-types` + +**Type:** `boolean` + +Omit unreachable types. By default all types declared under the service namespace will be included. With this flag on only types references in an operation will be emitted. + +### `include-x-typespec-name` + +**Type:** `"inline-only" | "never"` + +If the generated openapi types should have the `x-typespec-name` extension set with the name of the TypeSpec type that created it. +This extension is meant for debugging and should not be depended on. + +### `use-read-only-status-schema` + +**Type:** `boolean` + +Create read-only property schema for lro status diff --git a/docs/emitters/typespec-autorest/reference/index.mdx b/docs/emitters/typespec-autorest/reference/index.mdx new file mode 100644 index 0000000000..6a73452610 --- /dev/null +++ b/docs/emitters/typespec-autorest/reference/index.mdx @@ -0,0 +1,43 @@ +--- +title: Overview +sidebar_position: 0 +toc_min_heading_level: 2 +toc_max_heading_level: 3 +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Overview + +TypeSpec library for emitting openapi from the TypeSpec REST protocol binding + +## Install + + + + +```bash +npm install @azure-tools/typespec-autorest +``` + + + + +```bash +npm install --save-peer @azure-tools/typespec-autorest +``` + + + + +## Emitter usage + +[See documentation](./emitter.md) + +## Autorest + +### Decorators + +- [`@example`](./decorators.md#@Autorest.example) +- [`@useRef`](./decorators.md#@Autorest.useRef) diff --git a/docs/emitters/typespec-csharp/index.md b/docs/emitters/typespec-csharp/index.md new file mode 100644 index 0000000000..1590860a76 --- /dev/null +++ b/docs/emitters/typespec-csharp/index.md @@ -0,0 +1,6 @@ +--- +title: Overview +sidebar_position: 0 +--- + +# TypeSpec CSharp Emitter diff --git a/docs/emitters/typespec-service-csharp/reference/emitter.md b/docs/emitters/typespec-service-csharp/reference/emitter.md new file mode 100644 index 0000000000..3c9bc19485 --- /dev/null +++ b/docs/emitters/typespec-service-csharp/reference/emitter.md @@ -0,0 +1,30 @@ +--- +title: "Emitter usage" +toc_min_heading_level: 2 +toc_max_heading_level: 3 +--- + +# Emitter + +## Usage + +1. Via the command line + +```bash +tsp compile . --emit=@azure-tools/typespec-service-csharp +``` + +2. Via the config + +```yaml +emit: + - "@azure-tools/typespec-service-csharp" +``` + +## Emitter options + +### `skip-format` + +**Type:** `boolean` + +Skips formatting of generated C# Types. By default, C# files are formatted using 'dotnet format'. diff --git a/docs/emitters/typespec-service-csharp/reference/index.mdx b/docs/emitters/typespec-service-csharp/reference/index.mdx new file mode 100644 index 0000000000..55d2094eac --- /dev/null +++ b/docs/emitters/typespec-service-csharp/reference/index.mdx @@ -0,0 +1,36 @@ +--- +title: Overview +sidebar_position: 0 +toc_min_heading_level: 2 +toc_max_heading_level: 3 +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Overview + +Azure TypeSpec service code generator for c-sharp + +## Install + + + + +```bash +npm install @azure-tools/typespec-service-csharp +``` + + + + +```bash +npm install --save-peer @azure-tools/typespec-service-csharp +``` + + + + +## Emitter usage + +[See documentation](./emitter.md) diff --git a/docs/getstarted/azure-core/step01.md b/docs/getstarted/azure-core/step01.md new file mode 100644 index 0000000000..ff47f5fba7 --- /dev/null +++ b/docs/getstarted/azure-core/step01.md @@ -0,0 +1,23 @@ +# 1. Writing Your First Service + +The Azure Data Plane Service template will create a very basic TypeSpec file in `main.tsp`: + +```typespec +import "@typespec/rest"; +import "@typespec/versioning"; +import "@azure-tools/typespec-autorest"; +import "@azure-tools/typespec-azure-core"; +``` + +These lines import the libraries you will need to build your first service. + +> **NOTE:** The `@azure-tools/typespec-autorest` import is not explicitly needed for this tutorial. + +**Add the following lines** to bring the models, operations, and decorators you will need into the specification: + +```typespec +using TypeSpec.Http; +using TypeSpec.Rest; +using TypeSpec.Versioning; +using Azure.Core; +``` diff --git a/docs/getstarted/azure-core/step02.md b/docs/getstarted/azure-core/step02.md new file mode 100644 index 0000000000..043bedc290 --- /dev/null +++ b/docs/getstarted/azure-core/step02.md @@ -0,0 +1,12 @@ +# 2. Create the service namespace + +To describe a service, you first need to define a "blockless" (file-level, no curly braces) namespace and use the `@service` decorator to mark it as the service namespace: + +```typespec +@service({ + title: "Contoso Widget Manager", +}) +namespace Contoso.WidgetManager; +``` + +This marks the `Contoso.WidgetManager` namespace as a service namespace in this TypeSpec specification and sets its title to "Contoso Widget Manager." diff --git a/docs/getstarted/azure-core/step03.md b/docs/getstarted/azure-core/step03.md new file mode 100644 index 0000000000..256509b207 --- /dev/null +++ b/docs/getstarted/azure-core/step03.md @@ -0,0 +1,15 @@ +# 3. Using the versioned Azure.Core types + +Before you can use the models and operations defined in the `Azure.Core` namespace, you will need to specify the API version of the `Azure.Core` library that your service uses. You can do this by adding the `@useDependency` decorator to the `Contoso.WidgetManager` namespace as seen here: + +```typespec +@service({ + title: "Contoso Widget Manager", +}) +@useDependency(Azure.Core.Versions.v1_0_Preview_2) +namespace Contoso.WidgetManager; +``` + +See the sections [Versioning your service](./step10.md#versioning-your-service) and [Using Azure.Core versions](./step10.md#using-azurecore-versions) for more details about service versioning. + +> **NOTE:** The `Azure.Core` version used in this tutorial may be out of date! The `typespec-azure-core` [README.md](https://github.com/Azure/typespec-azure/blob/main/packages/typespec-azure-core/README.md) file contains the versions listing which describes the available versions. diff --git a/docs/getstarted/azure-core/step04.md b/docs/getstarted/azure-core/step04.md new file mode 100644 index 0000000000..1aab64233e --- /dev/null +++ b/docs/getstarted/azure-core/step04.md @@ -0,0 +1,28 @@ +# 4. Defining your first resource + +Now we're ready to describe our first resource type. A "resource" is a model type that represents a fundamental type in the domain model of your service. + +For our `WidgetService`, the most obvious model type that we will need is called `Widget`. We can create it by creating a `model` that is annotated with the `@resource` decorator. Add the following lines after the top-level `namespace` declaration: + +```typespec +@doc("A widget.") +@resource("widgets") +model Widget { + @key("widgetName") + @doc("The widget name.") + @visibility("read") + name: string; + + @doc("The ID of the widget's manufacturer.") + manufacturerId: string; +} +``` + +There are a few important things to point out here: + +- The `Widget` model has a `@resource` decorator with a parameter of `"widgets"`. This string is the "collection name" of the resource and affects where the resource appears in the service URI layout. +- The `name` property has a `@key` decorator with a parameter of `"widgetName"`. This string customizes the name of the path parameter (and the parameter name itself) in operations that use this resource type. There _must_ be one property with a `@key` decorator on all resource types! +- The `@visibility("read")` decorator on the `name` property says that the `name` property should only appear in operation responses but not in operations that allow you to change properties of the `Widget` resource. +- We use `@doc` decorators on the model type and all properties to describe. Documentation strings are enforced by linting rule when authoring specs with `Azure.Core`! + +Great, now we have a resource type! Now, how do we define operations for this resource? diff --git a/docs/getstarted/azure-core/step05.md b/docs/getstarted/azure-core/step05.md new file mode 100644 index 0000000000..b8d7e02442 --- /dev/null +++ b/docs/getstarted/azure-core/step05.md @@ -0,0 +1,121 @@ +# 5. Defining standard resource operations + +The `Azure.Core` namespace provides a number of [standard lifecycle operations](https://azure.github.io/typespec-azure/docs/libraries/azure-core/reference/interfaces#Azure.Core.ResourceOperations) for resource types which encode many of the requirements of the [Azure REST API Guidelines](https://github.com/microsoft/api-guidelines/blob/vNext/azure/Guidelines.md). + +## Defining the Operation Interface + +The first step to defining standard operations for a resource type is to create an instance of the `ResourceOperations` interface that is tailored to the service you are describing. Here is a canonical example: + +```typespec +import "@azure-tools/typespec-azure-core"; + +using Azure.Core; +using Azure.Core.Traits; + +alias ServiceTraits = SupportsRepeatableRequests & + SupportsConditionalRequests & + SupportsClientRequestId; + +alias Operations = Azure.Core.ResourceOperations; +``` + +There are two things happening here: + +1. We define an alias called `ServiceTraits` which is defined as the intersection of three trait model types. You can learn more about interface-level service traits [here](https://azure.github.io/typespec-azure/docs/getstarted/azure-core/step09#applying-traits-to-all-resource-operations). +2. Then, define an alias called `Operations` which is defined as the instantiation of `Azure.Core.ResourceOperations` with the trait type you defined. + +> **NOTE:** We use the name `Operations` here as a convenience, but it is possible that you will define multiple aliases of `ResourceOperation` for a single service to apply different customizations for some operations. You might choose to name it something more explicit like `StandardOperations`. + +We will now use this interface alias to define the standard resource operations we need. + +## Defining Resource Operations + +Let's define the standard set of CRUD (Create, Read, Update, Delete) operations that are typically needed for a resource type in an Azure service. + +We will do that by defining an interface called `Widgets` which reaches into the `Operations` interface to use the standard resource operation shapes that it contains: + +```typespec +interface Widgets { + @doc("Fetch a Widget by name.") + getWidget is Operations.ResourceRead; + + @doc("Creates or updates a Widget.") + createOrUpdateWidget is Operations.ResourceCreateOrUpdate; + + @doc("Delete a Widget.") + deleteWidget is Operations.ResourceDelete; + + @doc("List Widget resources.") + listWidgets is Operations.ResourceList; +} +``` + +> **NOTE:** It is not necessary to define your resource operations inside of an `interface`. You can also define them in a sub-namespace of your service or inside the top-level namespace of the service. However, it is a best practice in TypeSpec to use `interface` to encapsulate the operations of a particular resource type. + +The `Widget` interface defines the following standard lifecycle operations: + +- `ResourceRead` - defines a "read" operation for a single resource instance +- `ResourceCreateOrUpdate` - defines an "upsert" operation which either creates or updates an instance of the resource type depending on whether it already exists +- `ResourceDelete` - defines a "delete" operation to delete a specific instance of the resource +- `ResourceList` - defines an operation that lists all instances of the resource type + +> **NOTE:** There are both instantaneous and long-running versions of "create", "update", and "delete" operations for resource types depending on what you need for a particular resource! + +Based on the configuration of the `Widget` type and the use of these standard operation templates, these operations will all exist under the route path: + +``` +/widgets/{widgetName} +``` + +The list operation will simply generate the path `/widgets`. + +## Customizing the Error Response + +If your service needs to use a custom error response type for all resource operations (this is uncommon), you may pass in a custom error response type to the `ResourceOperations` interface: + +```typespec +import "@azure-tools/typespec-azure-core"; + +using Azure.Core; +using Azure.Core.Traits; + +alias ServiceTraits = SupportsRepeatableRequests & + SupportsConditionalRequests & + SupportsClientRequestId; + +@error +@doc("A custom error response type.") +model ErrorResponse { + @doc("The error code.") + code: string; + + @doc("The error message.") + message: string; +} + +alias Operations = Azure.Core.ResourceOperations; +``` + +You can also reuse the standard Azure Core error types with minor customizations: + +```typespec +import "@azure-tools/typespec-azure-core"; + +using Azure.Core; +using Azure.Core.Traits; + +alias ServiceTraits = SupportsRepeatableRequests & + SupportsConditionalRequests & + SupportsClientRequestId; + +@doc("A custom error type.") +model Error is Azure.Core.Foundations.Error { + @doc("The environment where the error occurred.") + environment: string; +} + +alias Operations = Azure.Core.ResourceOperations< + ServiceTraits, + Azure.Core.Foundations.ErrorResponseBase +>; +``` diff --git a/docs/getstarted/azure-core/step06.md b/docs/getstarted/azure-core/step06.md new file mode 100644 index 0000000000..4c408c3ab2 --- /dev/null +++ b/docs/getstarted/azure-core/step06.md @@ -0,0 +1,45 @@ +# 6. Defining long-running resource operations + +If your service uses any long-running operations (LROs; see [our guidelines](https://github.com/microsoft/api-guidelines/blob/vNext/azure/Guidelines.md#long-running-operations--jobs) for specifics), you will need to define a "status monitor" operation which can report the status of the operation. + +Let's say that we want to make our `createOrUpdateWidget` and `deleteWidget` operations long-running. Here's how we can update our `Widgets` interface to accomplish that: + +```typespec +import "@azure-tools/typespec-azure-core"; + +using Azure.Core; +using Azure.Core.Traits; + +alias ServiceTraits = SupportsRepeatableRequests & + SupportsConditionalRequests & + SupportsClientRequestId; + +alias Operations = Azure.Core.ResourceOperations; + +interface Widgets { + @doc("Gets status of a Widget operation.") + getWidgetOperationStatus is Operations.GetResourceOperationStatus; + + @doc("Fetch a Widget by name.") + getWidget is Operations.ResourceRead; + + @doc("Creates or updates a Widget asynchronously.") + @pollingOperation(Widgets.getWidgetOperationStatus) + createOrUpdateWidget is Operations.LongRunningResourceCreateOrUpdate; + + @doc("Delete a Widget asynchronously.") + @pollingOperation(Widgets.getWidgetOperationStatus) + deleteWidget is Operations.LongRunningResourceDelete; + + @doc("List Widget resources.") + listWidgets is Operations.ResourceList; +} +``` + +1. We change `createOrUpdateWidget` to use `LongRunningResourceCreateOrUpdate` and `deleteWidget` to use `LongRunningResourceDelete`. +2. We define the `getWidgetOperationStatus` operation based on the `GetResourceOperationStatus` signature. This defines the operation status monitor as a child resource of the `Widget` type so that it shows up under that resource in the route hierarchy. +3. We **must** add the `pollingOperation` decorator to both of the long-running operations and reference the `Widgets.getWidgetOperationStatus` operation. This connects the long-running operations to their associated status monitor operation to make it easier for service clients to be generated. + +> **NOTE:** The status monitor operation **must** be defined earlier in the interface than the long-running operations that reference it otherwise TypeSpec will not be able to resolve the reference! + +See [considerations for service design](https://github.com/microsoft/api-guidelines/blob/vNext/azure/ConsiderationsForServiceDesign.md#long-running-operations) for more information about LROs. diff --git a/docs/getstarted/azure-core/step07.md b/docs/getstarted/azure-core/step07.md new file mode 100644 index 0000000000..66b3c3d718 --- /dev/null +++ b/docs/getstarted/azure-core/step07.md @@ -0,0 +1,48 @@ +# 7. Defining child resources + +Sometimes your resource types will need to have child resources that relate to their parent types. You can identify that a resource type is the child of another resource by using the `@parentResource` decorator. + +For example, here's how you could create a new `WidgetPart` resource under the `Widget` defined above: + +```typespec +@doc("A WidgetPart resource belonging to a Widget resource.") +@resource("parts") +@parentResource(Widget) +model WidgetPart { + @key("partName") + name: string; + + @doc("The part number.") + number: string; + + @doc("The part name.") + partName: string; +} +``` + +When you use the standard resource operations with child resource types, their operation routes will include the route of the parent resource. For example, we might define the following operations for `WidgetPart`: + +```typespec +import "@azure-tools/typespec-azure-core"; + +using Azure.Core; +using Azure.Core.Traits; + +alias ServiceTraits = SupportsRepeatableRequests & + SupportsConditionalRequests & + SupportsClientRequestId; + +alias Operations = Azure.Core.ResourceOperations; + +@doc("Creates a WidgetPart") +createWidgetPart is Operations.ResourceCreateWithServiceProvidedName; + +@doc("Get a WidgetPart") +getWidgetPart is Operations.ResourceRead; +``` + +These operations will be defined under the route path: + +``` +/widgets/{widgetName}/parts/{partName} +``` diff --git a/docs/getstarted/azure-core/step08.md b/docs/getstarted/azure-core/step08.md new file mode 100644 index 0000000000..0601c1b2d8 --- /dev/null +++ b/docs/getstarted/azure-core/step08.md @@ -0,0 +1,56 @@ +# 8. Defining custom resource actions + +Often your resource types will need additional operations that are not covered by the standard resource operation shapes. For this, there are a set of operation signatures for defining _resource actions_ at the instance and collection level. + +To define a custom action you can use the `ResourceAction` and `ResourceCollectionAction` signatures from the `Azure.Core.ResourceOperations` interface. Let's define a couple of custom actions for the `Widget` and `WidgetPart` resources: + +```typespec +import "@azure-tools/typespec-azure-core"; + +using Azure.Core; +using Azure.Core.Traits; + +alias ServiceTraits = SupportsRepeatableRequests & + SupportsConditionalRequests & + SupportsClientRequestId; + +alias Operations = Azure.Core.ResourceOperations; + +// In the Widgets interface... +@doc("Schedule a widget for repairs.") +scheduleRepairs is Operations.ResourceAction< + Widget, + WidgetRepairRequest, + WidgetRepairRequest +>; + +// In the WidgetParts interface... +@doc("Reorder all parts for the widget.") +reorderParts is Operations.ResourceCollectionAction< + WidgetPart, + WidgetPartReorderRequest, + WidgetPartReorderRequest +>; +``` + +The `scheduleRepairs` operation defines a custom action for all instances of the `Widget` resource. **All collection action templates expect 3 parameters:** the resource type, the request action parameters, and the response type. In this case, `WidgetRepairRequest` is both the parameter and response type because we are using it as the body of both the request and the response of this operation. + +> **NOTE:** The request parameters and response type **do not** have to be the same type! + +We also define an collection operation called `reorderParts`. Similarly to `scheduleRepairs`, it uses the `WidgetPartReorderRequest` as the request and response body. + +Here are what the routes of these two operations will look like: + +``` +/widgets/{widgetName}:scheduleRepairs +/widgets/{widgetName}/parts:reorderParts +``` + +Notice that the operation name is used as the action name in the route! + +There are also long-running operation versions of these two operations: + +- `LongRunningResourceAction` +- `LongRunningResourceCollectionAction` + +The same rules described in the [long-running operations](step06) section also apply to these long-running action signatures. diff --git a/docs/getstarted/azure-core/step09.md b/docs/getstarted/azure-core/step09.md new file mode 100644 index 0000000000..f892fd2dac --- /dev/null +++ b/docs/getstarted/azure-core/step09.md @@ -0,0 +1,251 @@ +# 9. Customizing operations with traits + +For all standard lifecycle operations you can customize the operation parameters and response body by passing a special model type to the `Traits` parameter of the operation template, typically the second parameter of the operation template. You can also customize the whole set of resource operations by passing traits to the `ResourceOperations` interface. + +You can combine multiple traits using the model intersection operator `&`. Here's an example of defining the `ServiceTraits` with `SupportsRepeatableRequests`, `SupportsConditionalRequests` and `SupportsClientRequestId`. These are then passed into the `Azure.Core.ResourceOperations` template: + +```typespec +import "@azure-tools/typespec-azure-core"; + +using Azure.Core; +using Azure.Core.Traits; + +alias ServiceTraits = SupportsRepeatableRequests & + SupportsConditionalRequests & + SupportsClientRequestId; + +alias Operations = Azure.Core.ResourceOperations; +``` + +Traits can be applied simultaneously at both the interface and operation level, they will be composed together when your operation is defined. + +For example, if you wanted to add standard list operation query parameters to the `listWidgets` operation, you could use the `ListQueryParametersTrait`: + +```typespec +@doc("List Widget resources") +op listWidgets is Operations.ResourceList< + Widget, + ListQueryParametersTrait +>; +``` + +## Useful trait types + +The following trait types can be used for typical operation customization patterns: + +### `QueryParametersTrait` + +This trait adds query parameters to operation signatures. It accepts a model type containing the query parameters that will be mixed in to the operation signature: + +```typespec +op getWidget is Operations.ResourceRead< + Widget, + QueryParametersTrait<{ + @query foo: string; + }> +>; +``` + +> **NOTE**: All properties in `TParams` must be marked with `@query` or an error will be raised. + +The `Contexts` parameter is configured to apply the query parameters to all operations by default. + +To constrain the types of operations that these query parameters will apply to, pass one ore more of the following values: + +- **TraitContext.Read**: Applies to read operations +- **TraitContext.Create**: Applies to create operations +- **TraitContext.Update**: Applies to update operations +- **TraitContext.Delete**: Applies to delete operations +- **TraitContext.List**: Applies to list operations +- **TraitContext.Action**: Applies to custom action operations + +Here is an example of applying query parameters to `Read` and `List` operations: + +```typespec +alias MyQueryParams = QueryParametersTrait< + { + @query foo: string; + }, + TraitContext.Read | TraitContext.List +>; + +// This will have a `foo` parameter added +op getWidget is Operations.ResourceRead; + +// This will not get the `foo` parameter because it doesn't match the contexts +op deleteWidget is Operations.ResourceDelete< + Widget, + QueryParametersTrait<{ + @query foo: string; + }> +>; +``` + +### `ListQueryParametersTrait` + +This is a helper trait that specialized `QueryParametersTrait` to the `TraitContext.List` context. For example: + +```typespec +alias MyListQueryParams = ListQueryParametersTrait<{ + @query foo: string; +}>; + +// Will get the `foo` parameter +op listWidgets is Operations.ResourceList; + +// Will not get the `foo` parameter +op deleteWidget is Operations.ResourceDelete; +``` + +### `RequestHeadersTrait` + +This trait adds request headers to operation signatures. It accepts a model type containing the request headers that will be mixed in to the operation signature: + +```typespec +op getWidget is ResourceRead< + Widget, + RequestHeadersTrait<{ + @header foo: string; + }> +>; +``` + +> **NOTE**: All properties in `TParams` must be marked with `@header` or an error will be raised. + +You can specify `Contexts` where this trait applies in the way as described for the `QueryParametersTrait`. + +### `ResponseHeadersTrait` + +This trait adds response headers to operation signatures. It accepts a model type containing the response headers that will be mixed in to the operation signature: + +```typespec +op getWidget is ResourceRead< + Widget, + ResponseHeadersTrait<{ + @header foo: string; + }> +>; +``` + +> **NOTE**: All properties in `TParams` must be marked with `@header` or an error will be raised. + +You can specify `Contexts` where this trait applies in the way as described for the `QueryParametersTrait`. + +## Applying traits to all resource operations + +If you would like to apply the same traits to all resource operations, you can do so by adding them to the traits object for your instance of the `ResourceOperations` interface. Here's an example of adding a request header called `foo` to all resource operations: + +```typespec +import "@azure-tools/typespec-azure-core"; + +using Azure.Core; +using Azure.Core.Traits; + +alias ServiceTraits = SupportsRepeatableRequests & + SupportsConditionalRequests & + SupportsClientRequestId & + RequestHeadersTrait<{ + @header foo: string; + }>; + +alias Operations = ResourceOperations; + +op deleteWidget is Operations.ResourceDelete; +``` + +This defines `deleteWidget` by using the `ResourceDelete` template defined inside of your customized `Operations` interface. + +**IMPORTANT NOTE:** The `ResourceOperations` interface requires that an explicit set of traits be included to describe whether certain Azure service features are supported. + +Here is the list of the required traits with the names of the trait models to enable and disable those features: + +- **RepeatableRequests**: `SupportsRepeatableRequests` and `NoRepeatableRequests` +- **ConditionalRequests**: `SupportsConditionalRequests` and `NoConditionalRequests` +- **ClientRequestId**: `SupportsClientRequestId` and `NoClientRequestId` + +## Customizing the API version parameter + +You can use the `VersionParameterTrait` to customize the API version parameter for resource operations, either at the level of interface or individual operation. To do this, use the `TraitOverride` type to override the existing `api-version` query parameter: + +```typespec +@doc("The ApiVersion path parameter.") +model ApiVersionPathParameter { + @segment("api") + @path("api-version") + @doc("The API version to use for this operation.") + apiVersion: string; +} + +op deleteWidget is ResourceDelete< + Widget, + TraitOverride> +>; +``` + +Using the `TraitOverride` modifier with the `VersionParameterTrait` causes any existing `VersionParameterTrait` instances in the operation signature to be overridden by the one you have supplied. + +This will result in an operation that has the route path `/api/{apiVersion}/widgets/{widgetName}` while also removing the old `api-version` query parameter from the operation signature. + +## Versioning the use of traits + +It is possible that a service will begin to support a particular feature or trait in a later version. There are two ways to express that a trait is being added in a later service version: + +### Using the `TVersionAdded` parameter of some trait types + +> **NOTE:** Versioning of Azure Core service specifications is covered in more detail on [this page](https://azure.github.io/typespec-azure/docs/getstarted/azure-core/step10). + +Some standard trait types accept an optional `TVersionAdded` parameter which enables you to specify the service version enum representing the version where support for this trait is added: + +- `SupportsClientRequestId` +- `SupportsRepeatableRequests` +- `SupportsConditionalRequests` + +Here is an example of adding support for repeatable requests in a later service version: + +```typespec +import "@azure-tools/typespec-azure-core"; + +using Azure.Core; +using Azure.Core.Traits; +using TypeSpec.Versioning; + +@service({ + title: "Contoso Widget Manager", +}) +@versioned(Contoso.WidgetManager.Versions) +namespace Contoso.WidgetManager; + +enum Versions { + @useDependency(Azure.Core.Versions.v1_0_Preview_2) + v2022_08_31: "v20220831", + + @useDependency(Azure.Core.Versions.v1_0_Preview_2) + v2022_11_30: "v20221130", +} + +alias ServiceTraits = SupportsRepeatableRequests & + SupportsConditionalRequests & + SupportsClientRequestId; + +alias Operations = ResourceOperations; +``` + +### Define a custom trait and add the `@traitAdded` decorator + +Building on the previous example, we can add a custom header trait at a later service version using the `@traitAdded` decorator: + +```typespec +@doc("A custom trait added at a later service version.") +@traitAdded(Versions.v2022_11_30) +model CustomRequestHeadersTrait + is RequestHeadersTrait<{ + @TypeSpec.Http.header foo: string; + }>; + +alias ServiceTraits = SupportsRepeatableRequests & + SupportsConditionalRequests & + SupportsClientRequestId & + CustomRequestHeadersTrait; + +alias Operations = ResourceOperations; +``` diff --git a/docs/getstarted/azure-core/step10.md b/docs/getstarted/azure-core/step10.md new file mode 100644 index 0000000000..cd5775c128 --- /dev/null +++ b/docs/getstarted/azure-core/step10.md @@ -0,0 +1,104 @@ +# 10. Versioning + +## Versioning your service + +It is inevitable that service specifications will change over time. It is a best practice to add versioning support to your specification from the first version. To do that, you will need to define an `enum` containing your service versions and then apply the `@versioned` decorator to your service namespace. + +Here is an example for the `WidgetManager` service: + +```typespec +@service({ + title: "Contoso Widget Manager", +}) +@versioned(Contoso.WidgetManager.Versions) +namespace Contoso.WidgetManager; + +enum Versions { + @useDependency(Azure.Core.Versions.v1_0_Preview_1) + v2022_08_31: "2022-08-31", +} +``` + +There are a few things to point out here: + +- We define an `enum` called `Versions` inside of the service namespace. For each service version, we map a version symbol like `v2022_08_31` to a version string like `2022-08-31`. This service currently only has a single version, but we can add more to this enum as things change over time. +- We add the `@versioned` decorator and reference the `Versions` enum we defined using the fully-qualified name `Contoso.WidgetManager.Versions`. This marks the service as being versioned and specifies the set of versions. +- We change the `@useDependency` decorator we used previously to now link each service version to a specific version of `Azure.Core`. See the [Using Azure.Core Versions](#using-azurecore-versions) section for more information. + +Imagine that it's 3 months later and you want to release a new version of your service with some slight changes. Add a new version to the `Versions` enum: + +```typespec +enum Versions { + @useDependency(Azure.Core.Versions.v1_0_Preview_1) + v2022_08_31: "2022-08-31", + + v2022_11_30: "2022-11-30", +} +``` + +You will also need to add the `@useDependency` decorator: + +```typespec +enum Versions { + @useDependency(Azure.Core.Versions.v1_0_Preview_1) + v2022_08_31: "2022-08-31", + + @useDependency(Azure.Core.Versions.v1_0_Preview_2) + v2022_11_30: "2022-11-30", +} +``` + +Finally, you can express changes to your service using the `@added` and `@removed` decorators. Here's an example of adding a new property to `Widget` and removing an old one: + +```typespec +@doc("A widget.") +@resource("widgets") +model Widget { + @key("widgetName") + @doc("The widget name.") + @visibility("read") + name: string; + + @doc("The widget color.") + @added(Contoso.WidgetManager.Versions.v2022_11_30) + color: string; + + @doc("The ID of the widget's manufacturer.") + @removed(Contoso.WidgetManager.Versions.v2022_11_30) + manufacturerId: string; +} +``` + +> You can do a lot more with versioning decorators, so consult the `typespec-versioning` [README.md](https://github.com/microsoft/typespec/tree/main/packages/versioning#enable-versioning-for-service-or-library) for more information on how you can use them to annotate your service and describe changes between different versions. + +## Using Azure.Core versions + +`typespec-azure-core` is a versioned TypeSpec library. This means that even as the TypeSpec portions of the typespec-azure-core library are updated, you can anchor each version of your spec to a specific `Azure.Core` version. This is done by decorating your service namespace with the `@useDependency` decorator from the `typespec-versioning` library. + +Simple TypeSpec specs need only pass the desired `Azure.Core` version into the `@useDependency` decorator: + +```typespec +@service({ + title: "Contoso Widget Manager", +}) +@useDependency(Azure.Core.Versions.v1_0_Preview_2) +namespace Contoso.WidgetManager; +``` + +If your spec has [multiple versions](#versioning-your-service), you will need to specify the version of `typespec-azure-core` that was used for each version in your spec. Assuming that there are two versions of `Azure.Core` and each version of your service uses a different one, it would look like this: + +```typespec +@service({ + title: "Contoso Widget Manager", +}) +@versioned(Contoso.WidgetManager.Versions) +namespace Contoso.WidgetManager; + +enum Versions { + @useDependency(Azure.Core.Versions.v1_0_Preview_1) + v2022_08_31: "v20220831", + + @useDependency(Azure.Core.Versions.v1_0_Preview_2) + v2022_11_30: "v20221130", +} +``` diff --git a/docs/getstarted/azure-core/step11.md b/docs/getstarted/azure-core/step11.md new file mode 100644 index 0000000000..c6f0973361 --- /dev/null +++ b/docs/getstarted/azure-core/step11.md @@ -0,0 +1,5 @@ +# 11. Complete Example + +A complete version of the `Contoso.WidgetManager` specification can be found in the [`widget-manager` sample folder](https://github.com/Azure/typespec-azure/blob/main/packages/samples/specs/data-plane/widget-manager/main.tsp). + +You can experiment with the full sample on the [TypeSpec Azure Playground](https://cadlplayground.z22.web.core.windows.net/cadl-azure/?sample=Azure+Core+Data+Plane+Service)! diff --git a/docs/getstarted/azure-core/step12.md b/docs/getstarted/azure-core/step12.md new file mode 100644 index 0000000000..6f004f4e84 --- /dev/null +++ b/docs/getstarted/azure-core/step12.md @@ -0,0 +1,48 @@ +# Advanced Topics + +Once you have written your first service with `Azure.Core`, you might be interested to try the following features: + +## Defining singleton resources + +You can define a singleton resource (a resource type with only one instance) by using a string literal for the key type. Imagine we want to expose an analytics endpoint for each `Widget` instance. Here's what it would look like: + +```typespec +@resource("analytics") +@parentResource(Widget) +model WidgetAnalytics { + @key("analyticsId") + id: "current"; + + @doc("The number of uses of the widget.") + useCount: int64; + + @doc("The number of times the widget was repaired.") + repairCount: int64; +} +``` + +You can then use the standard operation signatures with this singleton resource type: + +```typespec +import "@azure-tools/typespec-azure-core"; + +using Azure.Core; +using Azure.Core.Traits; + +alias ServiceTraits = SupportsRepeatableRequests & + SupportsConditionalRequests & + SupportsClientRequestId; + +alias Operations = Azure.Core.ResourceOperations; + +op getAnalytics is Operations.ResourceRead; +op updateAnalytics is Operations.ResourceCreateOrUpdate; +``` + +By using a literal value of `"current"` for `"id"`, the route path for these operations will be the following: + +``` +"/widgets/{widgetName}/analytics/current" +``` + +The operations defined against this singleton resource will also exclude the key parameter because it cannot be changed. diff --git a/docs/getstarted/azure-resource-manager/step00.md b/docs/getstarted/azure-resource-manager/step00.md new file mode 100644 index 0000000000..f6bed911a1 --- /dev/null +++ b/docs/getstarted/azure-resource-manager/step00.md @@ -0,0 +1,5 @@ +# 1. Installing Tools + +## Installing IDE Tools + +If you use Visual Studio or Visual Studio code, the TypeSpec extensions are an important tool in providing a first class experience for writing, editing, and reviewing TypeSpec. See [Installing the VS and VS Code Extensions](https://microsoft.github.io/typespec/introduction/installation#install-the-vs-and-vscode-extensions) for details. diff --git a/docs/getstarted/azure-resource-manager/step01.md b/docs/getstarted/azure-resource-manager/step01.md new file mode 100644 index 0000000000..b05e3fe011 --- /dev/null +++ b/docs/getstarted/azure-resource-manager/step01.md @@ -0,0 +1,44 @@ +# 2. Defining the Service + +To define an Azure Resource Manager service, the first thing you will need to do is define the service namespace and decorate it with the `service` and `armProviderNamespace` decorators: + +```typespec +@armProviderNamespace +@service({title: "", version: ""}) +namespace ; +``` + +For example: + +```typespec +@armProviderNamespace +@service({ + title: "Contoso User Service", + version: "2020-10-01-preview", +}) +@useDependency(Azure.ResourceManager.Versions.v1_0_Preview_1) +@armCommonTypesVersion(Azure.ResourceManager.CommonTypes.Versions.v5) +namespace Contoso.Users; +``` + +If you need to use a different version of the ARM `common-types` definitions in your emitted Swagger files, change the `@armCommonTypesVersion` decorator to the version that you require. + +## The `using` keyword + +Just after the `namespace` declaration, you will also need to include a few `using` statements to pull in symbols from the namespaces of libraries you will for your specification. + +For example, these lines pull in symbols from the `@typespec/rest` and `@azure-tools/typespec-azure-resource-manager`: + +``` +using TypeSpec.Http; +using TypeSpec.Rest; +using Azure.ResourceManager; +``` + +## The `operations` interface + +All Resource Providers are required to provide operations that list the available operations for their resources. If you are using ProviderHub (RPaaS: RP as a Service), this functionality can be provided for you, but you will still need to include these operations in your api description. You can include these operations in your API description automatically using the following code: + +```typespec +interface Operations extends Azure.ResourceManager.Operations {} +``` diff --git a/docs/getstarted/azure-resource-manager/step02.md b/docs/getstarted/azure-resource-manager/step02.md new file mode 100644 index 0000000000..1c612890a2 --- /dev/null +++ b/docs/getstarted/azure-resource-manager/step02.md @@ -0,0 +1,109 @@ +# 3. Defining the Resources + +An ARM resource provider is composed of resources. The TypeSpec Azure Resource Manager library makes it much easier to define the structure and endpoints of such resources. + +There are three essential components of a resource defined with TypeSpec: + +- A model type representing the resource, derived from one of the [base resource types](#base-resource-types) +- A model type defining the properties of the resource type +- An interface that defines the operations that can be performed on the resource type, usually a combination of [standard resource operations](#standard-resource-operations) and [custom actions](#custom-actions) + +> Read the [TypeSpec tutorial](https://github.com/Microsoft/typespec/blob/main/docs/tutorial.md) to learn the basics about TypeSpec model types and interfaces. + +## 1. **Define a model representing the `properties` of the ARM resource** + +Each resource type must have a properties type which defines its custom properties. This type will be exposed as the `properties` property of the resource type. + +```typespec +@doc("The properties of UserResource") +model UserResourceProperties { + @doc("The user's full name") + fullName: string; + + @doc("The user's email address.") + emailAddress: string; +} +``` + +## 2. **Define a model representing the resource type** + +Resource types are defined as plain models which pull in a standard resource type using the `is` keyword. + +You define a resource type, you need the following: + +- A `name` property which is marked with the following decorators + - `@key`: Specifies the parameter name for this resource type in the service URI hierarchy + - `@segment`: Specifies the name of the resource "collection", the URI segment that comes just before the parameter name which identifies the resource type +- A second model type which defines the resource type's custom properties as we described in step 1 + +Here we define a tracked resource called `UserResource`: + +```typespec +@doc("A UserResource") +model UserResource is TrackedResource { + @key("userName") + @segment("users") + name: string; +} +``` + +## 3. **Define an interface with operations for the resource type** + +```typespec +@armResourceOperations +interface Users { + get is ArmResourceRead; + create is ArmResourceCreateOrUpdateAsync; + update is ArmResourcePatchSync; + delete is ArmResourceDeleteSync; + listByResourceGroup is ArmResourceListByParent; + listBySubscription is ArmListBySubscription; +} +``` + +This uses operation templates defined in the `Azure.ResourceManager` namespace to define the operations over your resource. For operations like `create (PUT)`, `update (PATCH)` and `delete (DELETE)` there are both asynchronous (long-running) and synchronous (operation completes in the same http request) versions of the operation templates. + +The interface above creates the following operations for your service: + +| Method & Path | Description | +| -------------------------------------------------------------------------------------------------------------------- | --------------------------------------- | +| `GET /subscriptions/{subscriptionId}/providers/Contoso.Users/users` | list all UserResource by subscription | +| `GET /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Contoso.Users/users` | list all UserResource by resource group | +| `GET /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Contoso.Users/users/{userName}` | get item | +| `PUT /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Contoso.Users/users/{userName}` | create item | +| `PATCH /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Contoso.Users/users/{userName}` | patch item | +| `DELETE /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Contoso.Users/users/{userName}` | delete item | + +### Alternate (Legacy) Syntax for Operations + +Alternately, you can use interface templates, which define a set of operations in your resource operations interface. Interface templates are convenient if you want to conform to standard +practices, but are less flexible than operation templates. + +To specify the standard set of TrackedResource operations for your resource, you can use the following code: + +```typespec +@armResourceOperations +interface Users extends TrackedResourceOperations {} +``` + +This will now produce all the endpoints(`get`, `post`, `put`, `patch` and `delete`, listByResourceGroup, listBySubscription) for a resource called `UserResources` and the `operations` endpoint for the service: + +| Method & Path | Description | +| -------------------------------------------------------------------------------------------------------------------- | --------------------------------------- | +| `GET /providers/Contoso.Users/operations` | List all operations for your service | +| `GET /subscriptions/{subscriptionId}/providers/Contoso.Users/users` | list all UserResource by subscription | +| `GET /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Contoso.Users/users` | list all UserResource by resource group | +| `GET /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Contoso.Users/users/{userName}` | get item | +| `PUT /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Contoso.Users/users/{userName}` | insert item | +| `PATCH /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Contoso.Users/users/{userName}` | patch item | +| `DELETE /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Contoso.Users/users/{userName}` | delete item | + +#### Base Resource Types + +Here are the base resource types you can use when defining your own ARM resources: + +| Name | Description | +| -------------------------------- | -------------------------------------------------------------------------------------- | +| `TrackedResource` | Defines a normal ARM resource where `TProperties` is the model of the `properties` | +| `ProxyResource` | Defines a proxy ARM resource where `TProperties` is the model of the `properties` | +| `ExtensionResource` | Defines an extension ARM resource where `TProperties` is the model of the `properties` | diff --git a/docs/getstarted/azure-resource-manager/step03.md b/docs/getstarted/azure-resource-manager/step03.md new file mode 100644 index 0000000000..65a0ba38f8 --- /dev/null +++ b/docs/getstarted/azure-resource-manager/step03.md @@ -0,0 +1,39 @@ +# 4. Defining Child Resource Types + +You can create parent/child relationships between resource types by using the `@parentResource` decorator when defining a resource type. + +For example, here's how you could create a new `AddressResource` resource under the `UserResource` defined above: + +```typespec +@doc("An address resource belonging to a user resource.") +@parentResource(UserResource) +model AddressResource is ProxyResource { + @key("addressName") + @segment("addresses") + name: string; +} + +@doc("The properties of AddressResource") +model AddressResourceProperties { + @doc("The street address.") + streetAddress: string; + + @doc("The city of the address.") + city: string; + + @doc("The state of the address.") + state: string; + + @doc("The zip code of the address.") + zip: int32; +} + +@armResourceOperations +interface Addresses { + get is ArmResourceRead; + create is ArmResourceCreateOrReplaceSync; + update is ArmResourcePatchSync; + delete is ArmResourceDeleteSync; + listByParent is ArmResourceListByParent; +} +``` diff --git a/docs/getstarted/azure-resource-manager/step04.md b/docs/getstarted/azure-resource-manager/step04.md new file mode 100644 index 0000000000..609755d053 --- /dev/null +++ b/docs/getstarted/azure-resource-manager/step04.md @@ -0,0 +1,103 @@ +# 5. Defining Custom Actions + +Some resources will provide more than the standard CRUD operations and will need to define a custom action endpoint. Additional resource operations can be added to the `interface` where you defined standard resource operations, using the `ArmResourceAction` templates. + +For example, to add an additional `POST` action called `/notify` to the standard operations of `UserResource`: + +```typespec +@doc("The details of a user notification.") +model NotificationDetails { + @doc("The notification message.") + message: string; + + @doc("If true, the notification is urgent.") + urgent: boolean; +} + +@armResourceOperations +interface Users extends TrackedResourceOperations { + @doc("Send a notification to the user") + @segment("notify") + NotifyUser is ArmResourceActionNoContentSync; +} +``` + +The following operation templates for different kinds of actions are provider in the `Azure.ResourceManager` namespace: + +| Template | Description | +| -------------------------------------------------------- | -------------------------------------------------------------------------------------------------- | +| `ArmResourceActionNoContentSync` | Synchronous action with no data in the response, providing the resource type and request payload. | +| `ArmResourceActionNoContentAsync` | Asynchronous action with no data in the response, providing the resource type and request payload. | +| `ArmResourceActionSync` | Synchronous action, providing the resource type and request and response payload. | +| `ArmResourceActionAsync` | Asynchronous action, providing the resource type and request and response payload. | + +## Custom Operations + +Alternately, you may define custom operations for extraordinary scenarios. Be sure to have a discussion with the ARM team before defining a custom operation. +There are strict guidelines around ARM operations, and you may need to get special signoff for operation that are not expressible using the templates. + +In a custom operation, you define the operation parameters, responses, http verb, and so on. For example, here is an operation defining a simple custom action. + +```typespec +@post +@doc("Send a notification to the user") +@segment("notify") +op NotifyUser( + ...ResourceInstanceParameters, + @body notification: NotificationDetails, +): ArmResponse | ErrorResponse; +``` + +### ARM Response Types + +Custom operations in ARM still need to respect the correct response schema. This library provides standard ARM response types to help with reusability and compliance. + +| Model | Code | Description | +| -------------------------------- | ---- | --------------------------------------------------------------------------------------------------------------------------- | +| `ArmResponse` | 200 | Base Arm 200 response. | +| `ArmCreatedResponse` | 201 | Resource created response. | +| `ArmNoContentResponse` | 204 | No Content (success). The parameter is the documentation for the response (by default, `Operation completed successfully`). | +| `ArmDeletedResponse` | 200 | Resource deleted response. | +| `ArmDeleteAcceptedResponse` | 202 | Resource deletion in progress response. | +| `ArmDeletedNoContentResponse` | 204 | Resource deleted response. | +| `Page` | 200 | Return a list of resource with ARM pagination. | +| `ErrorResponse` | x | Error response. | + +### Common Operation Parameters + +There are a number of model types which specify common parameters which are used in resource type operations: + +| Model | In | Description | +| ---------------------------- | ------------ | ------------------------------------------------------------------ | +| `ApiVersionParameter` | query | `api-version` parameter | +| `SubscriptionIdParameter` | path | Subscription ID path parameter | +| `ResourceGroupNameParameter` | path | Resource Group Name path parameter | +| `CommonResourceParameters` | path & query | Group of Api version, Subscription ID and Resource group parameter | +| `ResourceUriParameter` | path | Resource uri path parameter | +| `OperationIdParameter` | path | Operation Id path parameter | + +## Name Availability Operations + +Sometimes, resource names must be globally unique or unique within a specified location. The following operation templates are provided in the `Azure.ResourceManager` namespace for checking name availability: + +| Template | Description | +| --------------------------------------------------------------------- | ---------------------------------------------------- | +| `checkLocalNameAvailability` | Checks name availability based on an Azure location. | +| `checkGlobalNameAvailability` | Checks name availability globally. | + +These templates have default values so that they are normally used without specifying any template parameters. + +### Custom Name Check Operation + +The above templates are specializations of the following template in the `Azure.ResourceManager.Foundations` namespace: + +| Template | Description | +| -------------------------------------------------------------------------------- | ---------------------------------------------------------------- | +| `checkNameAvailability` | Checks name availability based on the provided scope parameters. | + +For reference, the standard templates use the following `TScopeParameters`: + +| Operation | Scope Parameters | +| ------------------------------ | ---------------------------------------------------------------------- | +| Global Name Availability Check | `SubscriptionIdParameter, DefaultProviderNamespace` | +| Local Name Availability Check | `SubscriptionIdParameter, DefaultProviderNamespace, LocationParameter` | diff --git a/docs/getstarted/azure-resource-manager/step05.md b/docs/getstarted/azure-resource-manager/step05.md new file mode 100644 index 0000000000..e15746921b --- /dev/null +++ b/docs/getstarted/azure-resource-manager/step05.md @@ -0,0 +1,130 @@ +# 6. Complete Example and Generate OpenApi 2.0 spec + +To generate an OpenAPI v2 (Swagger) specification from the service definition, run the following command inside of the project folder: + +``` +tsp compile . --emit @azure-tools/typespec-autorest +``` + +This will create a file in the `tsp-output` subfolder called `openapi.json`. + +You can learn more about the `typespec-autorest` emitter and its options by reading its [README.md](https://github.com/Azure/typespec-azure/blob/main/packages/typespec-autorest/README.md). + +## A Complete Example + +Here's a complete example `main.tsp` file based on all of the snippets in this README: + +```typespec +import "@typespec/rest"; +import "@typespec/versioning"; +import "@azure-tools/typespec-azure-core"; +import "@azure-tools/typespec-azure-resource-manager"; + +using TypeSpec.Http; +using TypeSpec.Rest; +using TypeSpec.Versioning; +using Azure.Core; +using Azure.ResourceManager; + +@armProviderNamespace +@service({ + title: "ContosoProviderHubClient", + version: "2021-01-01-preview", +}) +@doc("Contoso Resource Provider management API.") +@useDependency(Azure.ResourceManager.Versions.v1_0_Preview_1) +@armCommonTypesVersion(Azure.ResourceManager.CommonTypes.Versions.v5) +namespace Microsoft.ContosoProviderHub; + +interface Operations extends Azure.ResourceManager.Operations {} + +@lroStatus +enum ProvisioningState { + ...ResourceProvisioningState, + Provisioning, + Updating, + Deleting, + Accepted, +} + +@doc("The properties of UserResource") +model UserResourceProperties { + @doc("The user's full name") + fullName: string; + + @doc("The user's email address.") + emailAddress: string; + + @doc("The status of the last operation.") + provisioningState?: ProvisioningState; +} + +@doc("A UserResource") +model UserResource is TrackedResource { + @key("userName") + @segment("users") + @doc("Address name") + @path + name: string; +} + +@doc("The details of a user notification.") +model NotificationDetails { + @doc("The notification message.") + message: string; + + @doc("If true, the notification is urgent.") + urgent: boolean; +} + +@armResourceOperations +interface Users { + get is ArmResourceRead; + create is ArmResourceCreateOrUpdateAsync; + update is ArmResourcePatchSync; + delete is ArmResourceDeleteSync; + listByResourceGroup is ArmResourceListByParent; + listBySubscription is ArmListBySubscription; + @doc("Send a notification to the user") + @segment("notify") + NotifyUser is ArmResourceActionNoContentSync; +} + +@doc("An address resource belonging to a user resource.") +@parentResource(UserResource) +model AddressResource is ProxyResource { + @doc("Address name") + @key("addressName") + @segment("addresses") + @path + name: string; +} + +@doc("The properties of AddressResource") +model AddressResourceProperties { + @doc("The street address.") + streetAddress: string; + + @doc("The city of the address.") + city: string; + + @doc("The state of the address.") + state: string; + + @doc("The zip code of the address.") + zip: int32; + + @doc("The status of the last operation.") + provisioningState?: ProvisioningState; +} + +@armResourceOperations +interface Addresses { + get is ArmResourceRead; + create is ArmResourceCreateOrReplaceSync; + update is ArmResourcePatchSync; + delete is ArmResourceDeleteSync; + listByParent is ArmResourceListByParent; + checkGlobalName is checkGlobalNameAvailability; +} +``` diff --git a/docs/getstarted/createproject.md b/docs/getstarted/createproject.md new file mode 100644 index 0000000000..d4dbd4c7e0 --- /dev/null +++ b/docs/getstarted/createproject.md @@ -0,0 +1,43 @@ +# Creating a new project + +If you installed TypeSpec on your local machine, here is how you can create a new TypeSpec project: + +First, open your command prompt (PowerShell, cmd.exe, bash, etc), create an empty folder for your new project, and cd into it. If creating a new service in the [Azure/azure-rest-api-specs](https://github.com/Azure/azure-rest-api-specs) repository, create the new service folder following our [directory structure guidelines](https://github.com/Azure/azure-rest-api-specs/blob/main/documentation/typespec-structure-guidelines.md). + +Now create a new Azure service specification using the tsp init command: + +```bash +tsp init https://aka.ms/typespec/core-init + +``` + +You will be prompted with a few questions: + +- The service template: choose between "Azure Data Plane Service", "Azure Resource Manager Service" +- The project name: Enter a name to be used as the project folder name or press enter to use the same name as the folder you created +- Update the libraries: Press Enter to continue with the selected packages + +The prompts will look something like this: + +```bash +TypeSpec compiler v0.34.0 + +√ Please select a template » Azure Data Plane Service +√ Project name ... myService +√ Update the libraries? » @typespec/rest, @typespec/versioning, @azure-tools/typespec-autorest, @azure-tools/typespec-azure-core +TypeSpec init completed. +``` + +You can run `tsp install` now to install dependencies. +Once your project files have been created, execute the following command to install the TypeSpec compiler and libraries: + +```bash +tsp install +``` + +You can now open the file `main.tsp` to follow along with the rest of the tutorial! + +| Azure Service Type | Tutorial | Produces | +| ------------------------ | --------------------------------------------- | -------------------------- | +| Azure Data-Plane Service | [Azure-Core tutorial](azure-core/step02) | OpenApi 2.0 (Swagger) spec | +| Azure Management Service | [ARM tutorial](azure-resource-manager/step00) | OpenApi 2.0 (Swagger) spec | diff --git a/docs/getstarted/installation.md b/docs/getstarted/installation.md new file mode 100644 index 0000000000..63f9f5b2f1 --- /dev/null +++ b/docs/getstarted/installation.md @@ -0,0 +1,22 @@ +# Installation + +## Try TypeSpec without installing anything + +You can try TypeSpec on the web without installing anything. + +- [TypeSpec playground](https://aka.ms/trytypespec) +- [TypeSpec playground for Azure services](https://azure.github.io/typespec-azure/playground) + +### Installing TypeSpec core toolset + +See https://microsoft.github.io/typespec/introduction/installation + +## Installing TypeSpec Azure toolsets + +To work on Azure with TypeSpec, you should pre-install `@azure-tools/typespec-azure-core` to define Azure resources, and `@azure-tools/typespec-autorest` to export in Swagger. In other words: + +```bash +npm install @typespec/rest @typespec/openapi3 @azure-tools/typespec-azure-core @azure-tools/typespec-autorest +``` + +> If you plan to use the output openapi with autorest or any of the azure sdk tooling _you should use typespec-autorest_, the openapi3 emitter is not going to have any of the ms extensions (pageable, lro, client name, etc.) and so it will be losing information. diff --git a/docs/howtos/ARM/arm-rules.md b/docs/howtos/ARM/arm-rules.md new file mode 100644 index 0000000000..2330e75a10 --- /dev/null +++ b/docs/howtos/ARM/arm-rules.md @@ -0,0 +1,50 @@ +# ARM Rules, TypeSpec Linting, and Suppression + +ARM includes many rules on the structure of resources and the details of resource operations that ensure a consistent user experience when managing services inside Azure. TypeSpec encodes many fo these rules into linting checks that occur on each compilation. If you use an IDE and install the [TypeSpec IDE Tools](../../getstarted/azure-resource-manager/step00.md#installing-ide-tools), violations of rules will show up as yellow highlights in your tsp code. If you hover over these, you will get a message indicating the issue and how to fix it in your specification. If you use the typespec command-line, violations of rules will be printed as warnings, with a description and steps to correct the issue, and a pointer to the location in the specification where the violation occurred. + +In the sections below, we will discuss these rules, how they work, and, in cases where a violation is a false positive, or has a reason approved by an ARM reviewer, can be suppressed. + +## ARM RPC Rules + +TypeSpec has a set of linting rules that execute whenever the specification is compiled, and in the IDE as you type. Violations are highlighted inline in the spec, or emitted during compilation. + +For more information, see [ARM RPC rules](https://eng.ms/docs/products/arm/api_contracts/guidelines/rpc) + +## Detecting and Suppressing Rule Violations at Design Time + +Violations of ARM RPC rules will show up at design time as a yellow highlight over the violating type in TypeSpec, and at compile time as an emitted warning with a specific reference in the specification code (line number, position, pointer). + +Here is an example of a linter warning: + +```bash +Diagnostics were reported during compilation: + +C:/typespec-samples/resource-manager/zerotrust/main.tsp:38:3 - warning @azure-tools/typespec-azure-resource-manager/arm-resource-operation-missing-decorator: Resource POST operation must be decorated with @armResourceAction. +> 38 | @doc("Gets the Zero Trust URL for this resource") + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +> 39 | @post + | ^^^^^^^ +> 40 | getZeroTrustUrl(...ResourceInstanceParameters): ZeroTrustUrl | ErrorResponse; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Found 1 warning. + +``` + +To suppress the warning, you would use the `#suppress` directive on the type that violates the rule. The directive takes the fully-qualified name of the rule you are suppressing, and a reason for the suppression. + +```typespec + #suppress "@azure-tools/typespec-azure-resource-manager/arm-resource-operation-missing-decorator" "This is a sample suppression." + @doc("Gets the MAA URL for this resource") + @post + getZeroTrustUrl(...ResourceInstanceParameters): ZeroTrustUrl | ErrorResponse; +``` + +Of course, in this case, the best resolution would be to follow the advice in the linting rule, and add the `@armResourceAction` decorator. + +```typespec + @armResourceAction(ZeroTrustResource) + @doc("Gets the MAA URL for this resource") + @post + getZeroTrustUrl(...ResourceInstanceParameters): ZeroTrustUrl | ErrorResponse; +``` diff --git a/docs/howtos/ARM/resource-operations.md b/docs/howtos/ARM/resource-operations.md new file mode 100644 index 0000000000..4f45743215 --- /dev/null +++ b/docs/howtos/ARM/resource-operations.md @@ -0,0 +1,268 @@ +# ARM Resource Operations + +## Recommended and Required Operations + +### TrackedResource + +| Operation | Recommended | Required | TypeSpec Representation | +| --------------------- | ----------- | -------- | ---------------------------------------------------------------- | +| GET | Yes | Yes | `get is ArmResourceRead;` | +| CreateOrUpdate (PUT) | Yes | Yes | `createOrUpdate is ArmResourceCreateOrUpdateAsync;` | +| Tags Update (PATCH) | No | Yes\* | `update is ArmResourceTagsPatchSync;` | +| Full Update (PATCH) | Yes | No\* | `update is ArmResourcePatchSync;` | +| Delete | Yes | Yes | `delete is ArmResourceDeleteSync;` | +| List by ResourceGroup | Yes | Yes | `listByResourceGroup is ArmResourceListByParent;` | +| List by Subscription | Yes | Yes | `listBySubscription is ArmResourceListBySubscription;` | + +\* Arm requires that, at minimum, a TrackedResource can update Tags. A Full PATCH of all updateable resource properties is preferred. + +### Proxy Resource + +| Operation | Recommended | Required | TypeSpec Representation | +| -------------------- | ----------- | -------- | --------------------------------------------------------------- | +| GET | Yes | Yes | `get is ArmResourceRead;` | +| CreateOrUpdate (PUT) | Yes | No\* | `createOrUpdate is ArmResourceCreateOrUpdateAsync;` | +| Update (PATCH) | Yes | No | `update is ArmResourcePatchSync;` | +| Delete | Yes | No\* | `delete is ArmResourceDeleteSync;` | +| List by Parent | Yes | Yes | `listByParent is ArmResourceListByParent;` | + +\* Note that, if a resource implements Create, it is highly recommended that it implement delete as well, and vice-versa. + +## TypeSpec Operation Templates and Interface Templates + +TypeSpec provide operation templates that describe the request and response of standard resource operations. A description of the options available for each resource template, and how to choose which one is described in the sections below. + +### Synchronous and Asynchronous APIs + +CreateOrUpdate (PUT), Update (Patch), Delete, and Action (POST) operations over a resource may + +### Determining Which Resource Properties Appear in Lifecycle Operations + +By default, any property that occurs in your resource model will also appear in the response to GET, PUT, PATCH, and LIST operations, and in the request for PUT and PATCH operations. This does not work for all properties. Some properties are calculated by the service and cannot be directly set by PUT or PATCH (provisioningState, modification date, etc.). Some properties can only be set when creating a resource, but always appear in responses (e.g. 'location'). Some properties can only be set when updating the resource, and appear in responses. Some properties (rarely) may be settable when updating the resource via PUT or PATCH. To allow using a common resource model, but applying these `views` of resources to determine how the resource appear in request and responses, TypeSpec provides the visibility framework. You can see a complete representation of available visibilities in the table [on Property Visibility and Other Constraints](./resource-type.md#property-visibility-and-other-constraints). The sections below outline some common scenarios for designing properties with your operations in mind. + +#### Properties That Are Never Directly Set by the User + +It is common to have properties that are calculated by the service or otherwise not directly set by the user, examples include timestamps, dates, values that are only set by specific actions (on/off, enabled/disabled, provisioningState). You want to make sure that these properties are marked so that they will appear in responses and not requests. this is done using the `@visibility("read")` decorator instance: + +```typespec +@visibility("read") +provisioningState: ProvisioningState; +``` + +### Resource Get Operations + +Get is the operation to retrieve a single resource TypeSpec provides a single operation template for GET: + +```typespec +get is ArmResourceRead; +``` + +- **get**: The name of the operation passed on to clients. +- **Resource**: A reference to your resource type. + +### Resource CreateOrUpdate Operations (PUT) + +The CreateOrUpdate operation may be synchronous (The operation may always complete before a response is returned) or asynchronous (an initial response may be returned before the operation fully completes). + +- Simple resources may have synchronous PUT operations. If a resource may need to perform additional checks, creation of other dependent resources, or the like, it is best to use an Asynchronous API. +- Asynchronous operations for PUT occur when the RP needs to perform additional validaton actions, create other resources, or perform other tasks as part of resource creation or update that can cause the operation to take longer than the length of a single request/response. + +| Operation | TypeSpec | +| ---------------- | ----------------------------------------------------------------- | +| Synchronous PUT | `createOrUpdate is ArmResourceCreateOrReplaceSync` | +| Asynchronous PUT | `createOrUpdate is ArmResourceCreateOrReplaceAsync` | + +In the TypeSpec in the table `createOrUpdate` is the name of the operation, which will be passed on to clients, and `ResourceType` is the type of the resource being created (or updated) + +### Resource Update Operations (PATCH) + +ARM Requires that all `Tracked` resources implement PATCH for ARM tags, which are contained in the envelope of every `TrackedResource`. ARM recommends that you also allow PATCH of other envelope properties and resource-specific properties. Unless marked with a specific visibility, any property in your rp-specific properties will be automatically included in the PATCH schema. + +TypeSpec Provides both Synchronous and Asynchronous PATCH Operations, and allows you to specify a PATCH for Resource tags only, a PATCH for all updateable properties, or a custom patch. Generally, you should choose the patch for all updateable properties, unless you have a very good reason fro choosing another PATCH operation. + +| Operation Description | TypeSpec | +| --------------------------------- | ------------------------------------------------------------------- | +| Sync Updateable Properties PATCH | `update is ArmResourcePatchSync` | +| Async Updateable Properties PATCH | `update is ArmResourcePatchAsync` | +| Sync TagsOnly PATCH | `update is ArmTagsPatchSync` | +| Async TagsOnly PATCH | `update is ArmTagsPatchAsync` | +| Sync Custom PATCH | `update is ArmCustomPatchSync` | +| Async Custom PATCH | `update is ArmCustomPatchAsync` | + +The ArmResourcePatch\* templates take the resource type and the resource properties type as parameters. +The ArmTagsPatch\* templates take the resource type as a parameter. +The ArmCustomPatch\* templates take the resource type and your custom PATCH request type as parameters. + +### Resource Delete Operations (DELETE) + +The Delete operation may be synchronous (The operation may always complete before a response is returned) or asynchronous (an initial response may be returned before the operation fully completes). + +Simple resources may have synchronous DELETE operations. If a resource needs to clean up other resources or do other validations as part of delete, the delete operation may need to be asynchronous. + +| Operation | TypeSpec | +| ------------------- | --------------------------------------------------------- | +| Synchronous Delete | `delete is ArmResourceDeleteSync` | +| Asynchronous Delete | `delete is ArmResourceDeleteWithoutOkAsync` | + +In the TypeSpec in the table `delete` is the name of the operation, which will be passed on to clients, and `ResourceType` is the type of the resource being deleted. + +### Resource List Operations (GET) + +Arm Resource list operations return a list of Tracked or Proxy Resources at a particular scope. + +- All resources _should_ include a list operation at its immediate parent scope + - For **Tenant Resources**, this is at the tenant scope + - For **Extension Resources**, this is at the scope of resources they are extending + - For **Tracked Resources**, this is at the resource group scope. + - For **Child Resources**, this is at the scope of the resource parent. +- Tracked resources _must_ include a list operation at the Subscription level. + +| Operation | TypeSpec | +| ------------------ | ------------------------------------------------------------------- | +| ListByParent | `listByWidget is ArmResourceListByParent` | +| ListBySubscription | `listBySubscription is ArmResourceListBySubscription` | + +### Resource Actions (POST) + +Custom actions define any operations over resources outside the simple CRUDL (Create< Read, Update, Delete, List) or lifecycle operations described above. Any operation that returns data that is not made up of resources, performs a prescriptive state change on the resource (cycling power, upgrading, etc.), or any operation that does not fit into the operations described above should be modelled as a _resource action_. Examples of resource actions include: + +- Operations that manage credentials associated with a resource +- Operations that calculate statistics about resources +- Operations that make specific state changes to resources (power cycle, upgrade, etc.) + +#### Actions that take input and output + +Operations that manage credentials are a good example fo this category. TypeSpec defines synchronous and asynchronous templates for actions that consume and produce information. + +| Operation | TypeSpec | +| ---------------------------- | ------------------------------------------------------------------------------ | +| Synchronous Resource Action | `updateCredentials is ArmResourceActionSync` | +| Asynchronous Resource Action | `updateCredentials is ArmResourceActionAsync` | + +Parameters to the template are the ResourceType, the model for the operation Request body, and the model for the operation Response body. + +#### Actions that take input but produce no output (state changing actions) + +Operations that make state changes will often take some user configuration, and will return a seccess code or an error code depending on success or failure. TypeSpec defines synchronous and asynchronous operation templates for state changing actions. + +| Operation | TypeSpec | +| ----------------------------- | ------------------------------------------------------------------------------------- | +| Synchronous NoContent Action | `updateCredentials is ArmResourceActionNoContentSync` | +| Asynchronous NoContent Action | `updateCredentials is ArmResourceActionNoResponseContentAsync` | + +Parameters to the template are the ResourceType and the model for the operation Request body. + +### Actions that take no input but produce output (data retrieval actions) + +Some operations return data or paged lists of data. TypeSpec does not yet provide templates for these kinds of actions, but here are two templates that you could reuse in your own specification, described in the next section of the document: + +- [Synchronous Resource List Actions](#synchronous-list-action) +- [Asynchronous List Action](#asynchronous-list-action) + +### Check Name Operations + +Some services provide operations to check name availability, either location-specific (locally) or globally, especially if a resource name must be globally unique (such as when an exposed endpoint uses the resource name in the url). + +| Operation | TypeSpec | +| ------------------------------ | ---------------------------------------------------------------------------------------------------- | +| Global Name Availability Check | `checkGlobalName is checkGlobalNameAvailability` | +| Local Name Availability Check | `checkLocalName is checkLocalNameAvailability` | +| Custom Name Availability Check | `customNameCheck is checkNameAvailability` | + +`checkGlobalNameAvailability` and `checkLocalNameAvailability` have default values that allow them to be used without specifying any template parameters. `checkNameAvailability` requires the `TScopeParameters` template parameter, which describes the parameters which define the scope of the name check request. For reference, the following table shows the `TScopeParameters` for the standard templates: + +| Operation | Scope Parameters | +| ------------------------------ | ---------------------------------------------------------------------- | +| Global Name Availability Check | `SubscriptionIdParameter, DefaultProviderNamespace` | +| Local Name Availability Check | `SubscriptionIdParameter, DefaultProviderNamespace, LocationParameter` | + +## Writing Custom Operations + +TypeSpec operation templates provide a simple mechanism for producing the most common operation patterns in ARM, using best practices and conforming to ARM RPC guidelines. However, sometimes a service has special requirements for operations that fall outside these boundaries. The `Azure.ResourceManager.Foundations` namespace provides lower level building blocks that can be used to produce operations and operation templates. + +The building blocks are described in the sections below: + +### ARM Response Types + +Custom operations in ARM still need to respect the correct response schema. This library provides standard ARM response types to help with reusability and compliance. + +| Model | Code | Description | +| ----------------------------------- | ---- | --------------------------------------------- | +| `ArmResponse` | 200 | Base Arm 200 response. | +| `ArmResourceUpdatedResponse` | 200 | Resource updated (PUT) response. | +| `ArmResourceCreatedResponse` | 201 | Resource created response for an lro. | +| `ArmResourceCreatedSyncResponse` | 201 | Resource created synchronously. | +| `ArmAcceptedResponse` | 202 | Base Arm Accepted response. | +| `ArmNoContentResponse` | 204 | Base Arm No Content response. | +| `ArmDeletedResponse` | 200 | Resource deleted response. | +| `ArmDeleteAcceptedResponse` | 202 | Resource deletion in progress response. | +| `ResourceListResult` | 200 | Return a list of resource with ARM pagination | +| `ErrorResponse` | x | Error response | + +### Common Operation Parameters + +There are a number of model types which specify common parameters which are used in resource type operations: + +| Model | In | Description | +| ------------------------------- | ------------ | ----------------------------------------------------------- | +| `ApiVersionParameter` | query | api-version parameter | +| `SubscriptionIdParameter` | path | Subscription ID path parameter | +| `ResourceGroupNameParameter` | path | Resource Group Name path parameter | +| `ResourceInstanceParameters` | path & query | Identity parameters for a resource, with api-version | +| `ResourceParentParameters` | path & query | Identity Parameters for listing by parent, with api-version | +| `ResourceUriParameter` | path | Resource uri path parameter for Extension resources | +| `OperationIdParameter` | path | Operation Id path parameter | + +### Synchronous List Action + +Here is a sample template for resource list actions that return synchronously, using the common building blocks. + +```typespec +// Template definition +@autoRoute +@armResourceAction(TResource) +@post +op ArmResourceListActionSync( + ...ResourceInstanceParameters, +): ArmResponse | ErrorResponse; + +// Usage + +// The model for each data record +model Widget { + name: string; + color: string; +} +@armResourceOperations(MyResource) +interface MyResourceOperations { + // ResourceListResult produces a Pageable list of T + listWidgets is ArmResourceListActionSync>; +} +``` + +### Asynchronous List Action + +Here is a sample template for resource list actions that return asynchronously, using the common building blocks. + +```typespec +// Template definition +@autoRoute +@armResourceAction(TResource) +@post +op ArmResourceListActionAsync( + ...ResourceInstanceParameters, +): ArmResponse | ArmAcceptedResponse | ErrorResponse; + +// Usage + +// The model for each data record +model Widget { + name: string; + color: string; +} +@armResourceOperations(MyResource) +interface MyResourceOperations { + // ResourceListResult produces a Pageable list of T + listWidgets is ArmResourceListActionAsync>; +} +``` diff --git a/docs/howtos/ARM/resource-type.md b/docs/howtos/ARM/resource-type.md new file mode 100644 index 0000000000..4c9a04b7bd --- /dev/null +++ b/docs/howtos/ARM/resource-type.md @@ -0,0 +1,533 @@ +# ARM Resource Types + +## Introductions + +Introduction +Resources are the basic building blocks of Azure. When a customer interacts with Azure through the Control Plane (ARM), they generally will be reading (GET), writing (PUT/PATCH), deleting (DELETE) or performing actions upon (POST) one or more resources. Each resource is managed by a particular Resource Provider, so we uniquely identify a resource by its 'fully-qualified type'. Some well-known examples of types are Microsoft.Compute/virtualMachines, or Microsoft.Network/networkSecurityGroups/securityRules. See Resource Ids for a more in-depth breakdown of the id and associated fields. + +In order to give customers a consistent API when working with many different Resource Providers, and to allow ARM to understand and manage resources programmatically, ARM requires each RP to follow a set of contracts for resource management, defined in the ARM RPC. + +## ARM Resource Terminology + +The most important distinction between resources is between _Tracked_ and _Proxy_ resources. Tracked resources are resources in which all of the metadata is maintained in Azure Resource Manager. Tracked Resources can be targeted to specific regions, and are generally the best choice for most top-level resources. Azure Resource Manager maintains data about Tracked Resources, and generally will handle many implementation details or operations on the resource. See [RPC: Resource API Reference](https://github.com/Azure/azure-resource-manager-rpc/blob/master/v1.0/resource-api-reference.md) for further information on the contract for Tracked Resources. + +Proxy resources are resources in which only a portion of resource metadata is tracked in ARM. Generally, these model resources maintained on other systems, or that resource-providers want to track themselves. Generally, resource providers must implement most of the operations for Proxy resources. Tenant, Extension, and child resources are usually modeled as Proxy resources. + +There is a good discussion on making the choice between Tracked and Proxy Resources in the armwiki discussion [Tracked vs Proxy Resources](https://armwiki.azurewebsites.net/rp_onboarding/tracked_vs_proxy_resources.html) + +## Choosing a Resource Type + +- The large majority of resources have their metadata tracked by ARM, can be assigned to regions, and are contained inside a resource group in a subscription, for ease of management and billing. These are called [Tracked Resources](#tracked-resources). +- Some resources may need to have scope across an entire customer tenant, or may need to have a single instance across all customer subscriptions. These are called [tenant resources](#tenant-resources). +- Some kinds of resources may augment or alter the functionality of resources or resource containers provided by other resource-providers. For example, policy or RBAC rules may be applied to any resource or resource container. These resources are called [extension resources](#extension-resource). +- Some resources are complex and naturally break down into one or more components that are separately configurable, but an integral part of the larger resource (for example, a virtual network resource may contain many separately configurable subnets). These component resources are called [child resources](#child-resource). +- Rarely, some resources may need to apply across a subscription, or have a single instance in a customer subscription, these are called [subscription-based resources](#subscription-based-resource). +- Rarer still, some resources may need to apply across a specific region, or have a single instance in a region, these are called [location-based resources](#location-based-resource). +- In some cases, there can only be one instance of a resource at a specific scope - this is rare, but happens most frequently in tenant, child, and location resources. In typespec, you will need to specify that the resource is a singleton, and the resource manager tools will automatically apply the correct pattern for singleton resources (using the recommended resource name 'default') + +## Modeling Resources in TypeSpec + +Resources are modeled in TypeSpec by choosing a _base resource type_, defining _rp-specific properties_, and optionally mixing in _standard envelope properties_. Later sections document [how to model resource operations](./resource-operations.md). The following sections discuss usage of each of the base resource types. Later sections discuss [designing rp-specific properties](#designing-resource-specific-properties) and [adding standard ARM envelope properties](#adding-optional-standard-envelope-properties). + +### Tracked Resources + +Tracked resources use the `TrackedResource` as their base resource type, where `TProperties` is the properties model for the rp-specific properties of the resource. Here is an example: + +```typespec +model EmployeeResource is TrackedResource { + @doc("The employee name, using 'Firstname Lastname' notation") + @segment("employees") + @key("employeeName") + @visibility("read") + @path + name: string; +} +``` + +`@doc`: provides documentation for the 'name' property of the resource. +`@segment(employees)`: provides the resource type name for this resource. +`@key(employeeName)`: provides the parameter name for the name of the resource in operations that use this resource. +`@visibility(read)`: indicates that this property is returned in the body of responses to operations over this resource, but does not appear in the body of requests. Later sections describe the [usage of property visibility](#property-visibility-and-other-constraints). +`@path`: indicates that this property corresponds to the last segment of the url path to the resource (otherwise known as the resource identity). + +You can find samples of Tracked Resources [in the DynaTrace sample](https://github.com/Azure/typespec-azure/packages/samples/resource-manager/dynatrace/main.tsp). + +### Tenant Resources + +Tenant resources use the `ProxyResource` as their base resource type, where `TProperties` is the properties model for the rp-specific properties of the resource. Here is an example: + +```typespec +@tenantResource +model EmployeeResource is ProxyResource { + @doc("The employee name, using 'Firstname Lastname' notation") + @segment("employees") + @key("employeeName") + @visibility("read") + @path + name: string; +} +``` + +`@tenantResource`: designates this resource as being a cross-tenant resource, with scope across all customer subscriptions in the tenant. +`@doc`: provides documentation for the 'name' property of the resource. +`@segment(employees)`: provides the resource type name for this resource. +`@key(employeeName)`: provides the parameter name for the name of the resource in operations that use this resource. +`@visibility(read)`: indicates that this property is returned in the body of responses to operations over this resource, but does not appear in the body of requests. Later sections describe the [usage of property visibility](#property-visibility-and-other-constraints). +`@path`: indicates that this property corresponds to the last segment of the url path to the resource (otherwise known as the resource identity). + +You can find samples of Tenant Resources [in the TenantResource sample](https://github.com/Azure/typespec-azure/packages/samples/resource-manager/tenantResource/main.tsp). + +### Extension Resource + +Extension resources use the `ExtensionResource` as their base resource type, where `TProperties` is the properties model for the rp-specific properties of the resource. Here is an example: + +```typespec +model EmployeeResource is ExtensionResource { + @doc("The employee name, using 'Firstname Lastname' notation") + @segment("employees") + @key("employeeName") + @visibility("read") + @path + name: string; +} +``` + +`@doc`: provides documentation for the 'name' property of the resource. +`@segment(employees)`: provides the resource type name for this resource. +`@key(employeeName)`: provides the parameter name for the name of the resource in operations that use this resource. +`@visibility(read)`: indicates that this property is returned in the body of responses to operations over this resource, but does not appear in the body of requests. Later sections describe the [usage of property visibility](#property-visibility-and-other-constraints). +`@path`: indicates that this property corresponds to the last segment of the url path to the resource (otherwise known as the resource identity). + +You can find samples of Extension Resources [in the TenantResource sample](https://github.com/Azure/typespec-azure/packages/samples/resource-manager/tenantResource/main.tsp). + +### Child Resource + +Child resources usually use the `ProxyResource` as their base resource type, where `TProperties` is the properties model for the rp-specific properties of the resource. Here is an example: + +```typespec +@parentResource(EmployeeResource) +model JobResource is ProxyResource { + @doc("The job name") + @segment("jobs") + @key("jobName") + @visibility("read") + @path + name: string; +} +``` + +`@parentResource`: designates the model type for the parent of this child resource. The resource identifier for this resource will be prepended with the resource identity of the parent. +`@doc`: provides documentation for the 'name' property of the resource. +`@segment(employees)`: provides the resource type name for this resource. +`@key(employeeName)`: provides the parameter name for the name of the resource in operations that use this resource. +`@visibility(read)`: indicates that this property is returned in the body of responses to operations over this resource, but does not appear in the body of requests. Later sections describe the [usage of property visibility](#property-visibility-and-other-constraints). +`@path`: indicates that this property corresponds to the last segment of the url path to the resource (otherwise known as the resource identity). + +You can find samples of Child Resources [in the DynaTrace sample](https://github.com/Azure/typespec-azure/packages/samples/resource-manager/dynatrace/main.tsp). + +### Subscription-based Resource + +Tenant resources use the `ProxyResource` as their base resource type, where `TProperties` is the properties model for the rp-specific properties of the resource. Here is an example: + +```typespec +@subscriptionResource +model EmployeeResource is ProxyResource { + @doc("The employee name, using 'Firstname Lastname' notation") + @segment("employees") + @key("employeeName") + @visibility("read") + @path + name: string; +} +``` + +`@subscriptionResource`: designates this resource as being a cross-subscription resource, with scope across all resource groups in the subscription. +`@doc`: provides documentation for the 'name' property of the resource. +`@segment(employees)`: provides the resource type name for this resource. +`@key(employeeName)`: provides the parameter name for the name of the resource in operations that use this resource. +`@visibility(read)`: indicates that this property is returned in the body of responses to operations over this resource, but does not appear in the body of requests. Later sections describe the [usage of property visibility](#property-visibility-and-other-constraints). +`@path`: indicates that this property corresponds to the last segment of the url path to the resource (otherwise known as the resource identity). + +You can find samples of Subscription Resources [in the OperationTemplates sample](https://github.com/Azure/typespec-azure/packages/samples/resource-manager/operationsTest/opTemplates.tsp). + +### Location-based Resource + +Location-based resources usually use the `ProxyResource` as their base resource type, where `TProperties` is the properties model for the rp-specific properties of the resource. Here is an example: + +```typespec +@locationResource +model EmployeeResource is ProxyResource { + @doc("The employee name, using 'Firstname Lastname' notation") + @segment("employees") + @key("employeeName") + @visibility("read") + @path + name: string; +} +``` + +`@locationResource`: designates this resource as being a cross-location resource, with scope across a location within a subscription. +`@doc`: provides documentation for the 'name' property of the resource. +`@segment(employees)`: provides the resource type name for this resource. +`@key(employeeName)`: provides the parameter name for the name of the resource in operations that use this resource. +`@visibility(read)`: indicates that this property is returned in the body of responses to operations over this resource, but does not appear in the body of requests. Later sections describe the [usage of property visibility](#property-visibility-and-other-constraints). +`@path`: indicates that this property corresponds to the last segment of the url path to the resource (otherwise known as the resource identity). + +You can find samples of Location Resources [in the OperationTemplates sample](https://github.com/Azure/typespec-azure/packages/samples/resource-manager/operationsTest/opTemplates.tsp). + +### Singleton Resource + +Singleton resources can use any resource base type, but most often use `ProxyResource` as their base resource type, where `TProperties` is the properties model for the rp-specific properties of the resource. Here is an example: + +```typespec +@singleton +@tenantResource +model EmployeeAgreementResource is ProxyResource { + @doc("The default employee agreement, applying to all employees.") + @segment("employeeAgreements") + @key + @visibility("read") + @path + name: string; +} +``` + +`@singleton`: indicates that there can only be one of the resources in the resource container (in this case, only one instance in the customer tenant). +`@tenantResource`: designates this resource as being a cross-tenant resource, with scope across all customer subscriptions in the tenant. +`@doc`: provides documentation for the 'name' property of the resource. For a singleton, the name value will always be the same. +`@segment(employeeAGreements)`: provides the resource type name for this resource. +`@key`: provides the parameter name for the name of the resource in operations that use this resource - this will not be a settable value for singleton resources. +`@visibility(read)`: indicates that this property is returned in the body of responses to operations over this resource, but does not appear in the body of requests. Later sections describe the [usage of property visibility](#property-visibility-and-other-constraints). +`@path`: indicates that this property corresponds to the last segment of the url path to the resource (otherwise known as the resource identity). + +You can find samples of Singleton Resources [in the DynaTrace sample](https://github.com/Azure/typespec-azure/packages/samples/resource-manager/dynatrace/main.tsp#L120-L128). + +## Designing Resource-specific Properties + +Each resource model consists of two distinct parts + +- An outer _envelope_ of information that provides metadata for optional standardized ARM functionality, like entity-tags and managed identities, and is processed by Azure Resource Manager. +- An inner set of properties that are specific to the resource and are defined by the resource provider. + +Modifying the ARM envelope is discussed in later sections on [mixing in standard ARM envelope add-ons](#adding-optional-standard-envelope-properties). + +The inner _rp-specific property bag_ consists of all of the properties that the RP needs to manage about the resource. Properties should be completely specified, should not duplicate properties from the _ARM envelope_, and may consist of simple types, arrays, or other complex properties. + +Here is an example of a property bag for the `EmployeeResource` resource. + +```typespec +model EmployeeResource is TrackedResource { + @doc("The employee name, using 'Firstname Lastname' notation") + @segment("employees") + @key("employeeName") + @visibility("read") + @path + name: string; +} + +enum EmployeeProvisioningState { + Creating, + GeneratingId, + ...ResourceProvisioningState, + Deleting, +} + +@minValue(50) +@maxValue(70) +scalar EmployeeLevel extends int32; + +scalar EmployeeResourceId + extends ResourceIdentifier<[ + { + type: "Microsoft.HR/employees", + } + ]>; + +@secret +scalar Password extends string; + +model Job { + name: string; + companyName: string; + start: plainDate; + end: plainDate; + role: string; + notes?: string; +} + +model EmployeeProperties { + @doc("The current title of the employee") + title: string; + + @visibility("read", "create") + level: EmployeeLevel; + + @visibility("read") + employeeId: int32; + + biography?: string = "No biography provided"; + colleagues: EmployeeResourceId[]; + employmentHistory: Job[]; + + @visibility("create") + password: Password; + + provisioningState?: EmployeeProvisioningState; +} +``` + +`EmployeeProperties` specifies the employee metadata that the RP needs to track and manage. Notice that the model uses built-in scalar types like `string` and `int32`, new types built from scalar types with added constraints, like `Password` and `EmployeeLevel`, enumerations of values, like `EmployeeProvisioningState`, and complex types. The individual components of this model are described below. + +Note that _documentation comments on all models and model properties are required when specs are checked in_. Here they are omitted for clarity. The TypeSpec compiler and TypeSpec IDE tooling will emit warning diagnostics if you emit required documentation, and about most of the ARM rules described in this document. + +### The `provisioningState` Property for Tracked Resources + +All Tracked Resources are required to implement a 'provisioningState' property in their rp-specific property bag. This is used by ARM and some ARM clients to track the provisioning state of a resource as it is created and deleted. At minimum, the provisioning state must contain the standard terminal values that ARM is looking for. There are contained in the `ResourceProvisioningState` enumeration in the Azure.ResourceManager library. If RPs have other provisioning states they would like to track, they can define their own provisioning state enum, and mix in the value, as shown in the sample above, or they may simply use the standard provisioning state as shown in the sample below: + +```typespec +model ResourceProperties { + ...ResourceProvisioningState; +} +``` + +Note that this example uses the spread operator `...`, which allows you to simply include the properties from a source model in the target model you are constructing. This has the effect of copying the properties of the source model and their decorations into the target model, without creating any nominal inheritance relationship. + +Alternately, this is also equivalent: + +```typespec +model ResourceProperties { + @doc("The status of the last provisioning operation performed on the resource.") + @visibility("read") + provisioningState?: ResourceProvisioningState; +} +``` + +### Required and Optional properties and Property Defaults + +In the examples, note that some model properties use the optional operator `?` after the property name, like `biography?` and some do not, like `title`. Property names using the `?` are optional properties, which may or may not be provided in the request body for CreateOrUpdate (PUT) requests. Property names without the `?` are required properties, which must be provided in PUT requests. The exception is that properties that have 'readOnly' visibility do not appear in requests, but may be required or optional in responses. + +Also note that optional properties may specify defaults, as with `biography?: string = "No biography provided"`. The default indicates the value that will be recorded on the server if no value is sent by the client. + +### Defining Custom Types + +In the sample, new constrained scalar types and new complex model types are defined and used inside the _rp-specific property bag_. TypeSpec allows you to define custom types for use in your specification. + +You will often want to define scalar types or properties that have constraints. For example, numeric values may be constrained to have a certain minimum or maximum, strign values may be constrained to follow a particular regex pattern, and so on. Whenever these constrained types are used in your spec, the constraints will be transmitted to the usage. + +The example creates a numeric type with minimum and maximum constraints: + +```typespec +@minValue(50) +@maxValue(70) +scalar EmployeeLevel extends int32; +``` + +This defines 'EmployeeLevel' as an integer value between 50 and 70. The example also defines a complex type used in an array: + +```typespec +model Job { + name: string; + companyName: string; + start: plainDate; + end: plainDate; + role: string; + notes?: string; +} +``` + +Mode details on what to consider when using complex types in an array are discussed in the section on [modeling arrays of complex types](#modeling-arrays-of-complex-types). + +### Using Resource identifiers + +It is often the case that resources need to reference other resources to provide specific pieces of functionality. For example, resources may need to reference a storage account to use for storing user data, or a NIC to attach to a Network. The `Azure.ResourceManager` library defines a `ResourceIdentifier` template that allows you to easily represent references to resources in your API. The template allows you to specify one or more acceptable resource types, automatically designating the value as a resource reference, and providing the appropriate pattern validation - which helps in generating better code, better ARM templates, and better documentation for your API. + +```typespec +scalar EmployeeResourceId + extends ResourceIdentifier<[ + { + type: "Microsoft.HR/employees", + } + ]>; + +scalar NetworkInterfaceId + extends ResourceIdentifier<[ + { + type: "Microsoft.Network/networkInterfaces", + }, + { + type: "Microsoft.ClassicNetwork/networkInterfaces", + } + ]>; +``` + +The `NetworkInterfaceId example shows how to allow multiple resource types in a reference. + +### Property Visibility and Other Constraints + +The sample uses the `@visibility` decorator to indicate how the resource definition is used in requests to PUT and PATCH operations, and in responses to PUT, PATCH, GET, and LIST operations. + +This table shows how visibility is used to determine whether a property is used in requests and responses: + +| Visibility | In Create Request? | In Patch Request/ Updateable in PUT | In Responses | Sample | +| -------------------- | ------------------ | ----------------------------------- | ------------ | ---------------------------------------------- | +| None | Yes | Yes | Yes | Most properties | +| read, create, update | Yes | Yes | Yes | Most properties | +| read, create | Yes | No | Yes | resource location | +| read, update | No | Yes | Yes | Properties only settable after creation (keys) | +| create, update | Yes | Yes | No | Secrets (e.g. password) | +| read | No | No | Yes | Calculated properties, e.g. provisioningState | +| update | No | Yes | No | Secrets (e.g. keys) | +| create | Yes | No | No | Secrets (e.g. user-defined password) | + +### Modeling Arrays of Complex Types + +Finally, when your _rp-specific property bag_ contains an array of complex properties, there are a few important considerations: + +- The complex properties in an array must have a key property - this means a property named 'name' or 'id' that uniquely identifies the property in the array. The TypeSpec tools will emit a diagnostic if you omit this. +- ARM resources must be fully loaded in memory, so there are limits to the size of arrays in the properties of a resource. If your array is not strictly bounded, you should consider modeling the array property as a [child resource](#child-resource) +- Updating the contents of arrays can be difficult, and result in data loss under simultaneous updates, especially as Json-Merge-Patch is not widely supported in ARM update operations. If users will frequently need to update the contents of arrays, you should consider modeling as a [child resource](#child-resource). + +## Adding Optional Standard Envelope Properties + +In addition to the resource-specific property bag, a resource may configure on or more standard ARM features through the use of standard properties in the _ARM Envelope_. Standard features configured in the envelope include: + +- **Managed Identity**: Associating a managed identity with the resource to authorize actions taken by this resource on other resources. +- **SKU**: A standard mechanism for configuring levels of service for a resource. +- **Plan**: A standard mechanism for configuring MarketPlace billing plans for a resource. +- **ETags**: A standard mechanism for managing concurrent operations over the resource. +- **ResourceKind**: A standard mechanism for specifying a type of user experience in the portal. + +### Managed Identity + +Standard configuration for ARM support of both SystemAssigned and UserAssigned Managed Service Identity (MSI) + +- If a resource allows both generated (SystemAssigned) and user-assigned (UserAssigned) Managed Identity, use the spread (...) operator to include the standard ManagedServiceIdentity envelope property. This will allow users to manage any ManagedServiceIdentity associated with this resource. + + ```typespec + model EmployeeResource is TrackedResource { + @doc("The employee name, using 'Firstname Lastname' notation") + @segment("employees") + @key("employeeName") + @visibility("read") + @path + name: string; + + ...ManagedServiceIdentity; + } + ``` + +- If a resource allows only generated (SystemAssigned) Managed Identity, use the spread operator (...) to include the `ManagedSystemAssignedIdentity` standard envelope property in the resource definition. This will allow users to manage the SystemAssigned identity associated with this resource. + + ```typespec + model EmployeeResource is TrackedResource { + @doc("The employee name, using 'Firstname Lastname' notation") + @segment("employees") + @key("employeeName") + @visibility("read") + @path + name: string; + + ...ManagedSystemAssignedIdentity; + } + ``` + +For more information, see [Managed Service Identity Support](https://eng.ms/docs/products/arm/rpaas/msisupport) + +### SKU + +Standard support for setting a SKU-based service level for a resource. To enable SKU support, add the `ResourceSku` enevelope property to the resource definition: + +```typespec +model EmployeeResource is TrackedResource { + @doc("The employee name, using 'Firstname Lastname' notation") + @segment("employees") + @key("employeeName") + @visibility("read") + @path + name: string; + + ...ResourceSku; +} +``` + +For more information, see [SKU Support](https://eng.ms/docs/products/arm/rpaas/skusupport) + +### ETags + +Indicator that entity-tag operation concurrency support is enabled for this resource. To enable ETags, add the `EntityTag` envelope property to the resource definition. + +```typespec +model EmployeeResource is TrackedResource { + @doc("The employee name, using 'Firstname Lastname' notation") + @segment("employees") + @key("employeeName") + @visibility("read") + @path + name: string; + + ...EntityTag; +} +``` + +For more information, and limitations on RPaaS concurrency support, see [RPaaS ETag Support](https://eng.ms/docs/products/arm/rpaas/etags) + +### Plan + +Support for marketplace billing configuration for the resource. To enable `Plan` support, add the `ResourcePlan` standard envelope property to the resource definition. + +```typespec +model EmployeeResource is TrackedResource { + @doc("The employee name, using 'Firstname Lastname' notation") + @segment("employees") + @key("employeeName") + @visibility("read") + @path + name: string; + + ...ResourcePlan; +} +``` + +See [MarketPlace Third Party Billing SUpport](https://eng.ms/docs/products/arm/rpaas/custom_billing) + +### ResourceKind + +Support for certain kinds of portal user experiences based on the kind of resource. To include 'Kind' in the resource defintion, add the `ResourceKind` standard envelope property. + +```typespec +model EmployeeResource is TrackedResource { + @doc("The employee name, using 'Firstname Lastname' notation") + @segment("employees") + @key("employeeName") + @visibility("read") + @path + name: string; + + ...ResourceKind; +} +``` + +For more information on user experiences in the Azure Portal, see [Portal Support](https://eng.ms/docs/products/arm/rpaas/portal/gettingstarted) + +### ManagedBy + +Support for management of this resource by other resources. To add 'ManagedBy' support to the resource, add the `ManagedBy` envelope property to the resource definition: + +```typespec +model EmployeeResource is TrackedResource { + @doc("The employee name, using 'Firstname Lastname' notation") + @segment("employees") + @key("employeeName") + @visibility("read") + @path + name: string; + + ...ManagedBy; +} +``` + +For more information on supporting 'ManagedBy', see [ManagedBy API Contract](https://eng.ms/docs/products/arm/api_contracts/managedby) + +## Reference + +[Fundamentals - ARM Wiki](https://armwiki.azurewebsites.net/fundamentals/overview.html) diff --git a/docs/howtos/Azure Core/content-negotiation.md b/docs/howtos/Azure Core/content-negotiation.md new file mode 100644 index 0000000000..d715dabea2 --- /dev/null +++ b/docs/howtos/Azure Core/content-negotiation.md @@ -0,0 +1,50 @@ +# Content Type Negotiation + +See [Http documentation on content type negotiation](https://microsoft.github.io/typespec/next/standard-library/http/content-types#content-type-negotiation) for the general concept + +## Usage with Azure.Core operations + +Content negotiation in `Azure.Core` is done in the same way as in Http operations. This means each operation must have the `@sharedRoute` decorator added as well as an `Accept` header in the operation parameters (`TParams`). + +For example, consider an api that lets you download the avatar of the `User` resource as a `png` or `jpeg` depending on which Accept header is sent. + +```tsp +using TypeSpec.Http; +using TypeSpec.Rest; +using Azure.Core; + +@resource("users") +model User { + @key id: string; +} + +model PngImage { + @header contentType: "image/png"; + @body image: bytes; +} + +model JpegImage { + @header contentType: "image/jpeg"; + @body image: bytes; +} + +@sharedRoute +@action("avatar") +op getAvatarAsPng is StandardResourceOperations.ResourceAction< + User, + { + @header accept: "image/png"; + }, + PngImage +>; + +@sharedRoute +@action("avatar") +op getAvatarAsJpeg is StandardResourceOperations.ResourceAction< + User, + { + @header accept: "image/jpeg"; + }, + JpegImage +>; +``` diff --git a/docs/howtos/Azure Core/long-running-operations.md b/docs/howtos/Azure Core/long-running-operations.md new file mode 100644 index 0000000000..a8a557b47e --- /dev/null +++ b/docs/howtos/Azure Core/long-running-operations.md @@ -0,0 +1,529 @@ +# Deep Dive: Long-running (Asynchronous) Operations + +Long-running, or asynchronous operations (LROs for short) are Http Operations that are not complete in a single request/response sequence. Such operations require multiple requests and responses, usually to different endpoints before the operation is complete. Some common patterns that services use for LROs include: + +- Polling the resource 'GET' endpoint - Using a 'status' field in the resource to specify the resource state, and polling the resource Get endpoint until the status field reached a terminal status. A 'Location' header is often provided on the initial operation response, with a Url for the resource 'Get' endpoint. +- Using a Status Monitor endpoint - Defining a separate endpoint where operation status can be obtained. An 'Operation-Location' or similar header with a Url for the StatusMonitor endpoint is most often provided in the initial operation response. +- Providing a Push Notification System - Allowing the client to specify an endpoint for the service to call once the operation is complete + +Note that, for many APIs, the Url of the StatusMonitor (or resource GET) endpoint can easily be determined from the values in the initial request and response. This pattern is often followed when linking operations in OpenAPI3 specifications. + +## Modeling Long-running Operations in TypeSpec + +The `@azure-tools/typespec-azure-core` library contains specific operation templates for long-running operation patterns recommended by the api review board. Using these templates will ensure that a service has the widest range of compatibility with Azure SDKs and Azure tooling for long-running operations. Service teams **should** use these templates to define their long-running operations. Existing services that have LROs that do not comply with API guidelines should discuss their operations with the Api review board, or the TypeSpec team. + +## Long-running Operation Helpers for Emitters and Libraries + +The Azure.Core library provides a helper that emitters can use to determine if an operation being processed is an LRO, and to provide details about how the LRO should be processed by clients, or about how operations are linked. + +```typespec +getLroMetadata( program: Program, operation: Operation) : LroMetadata | undefined; +``` + +The `LroMetadata` returned from this function contains information about the linked operations and their behavior, as well as additional that clients used to processing OpenAPI2 will be able to use to process TypeSpec operations similarly: + +| Property | Description | +| ----------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `logicalResponse` | contains the type of the operation response, for the long-running operation (i.e. the result after polling completes). | +| `final-state-via` | contains values corresponding to the same field in the `x-ms-long-running-operation-options` extension in OpenAPI specifications. | +| `statusMonitor` | contains information about the status monitor, including the status monitor type | +| `polling` | contains information about polling the status monitor, including the status field and terminal status values | +| `final` | contains information about how to get the result when polling completes. In the standard case. this will contain a reference to the status monitor property that contains result information. If another operation needs to be called to get the status, that information will be here. | + +As indicated above, operations often contain multiple mechanisms that clients can use to resolve a long-running operation, this means that an operation will frequently contain both operation links and resource links that describe the LRO. The helper prefers the use of resource links to the use of operation links, where possible. + +## Describing Custom LRO Patterns using Azure.Core + +The `@azure-tools/typespec-azure-core` library also contains general structures for defining custom long-running operations using specialized model templates and decorators. The following sections describe . The primary mechanisms for linking operations are `Operation Links` and `Resource Links`. + +### Custom LROs - Operation Links + +Operation links are used when the input parameters to a linked operation can be determined from parameters in the initial operation request and response. For example, if a polling operation uses the identity parameters of the initial request, and an `operationId` parameter which is returned in a header or field in the response, the link between the operations should be modeled as an Operation Link. In order to use an Operation link, each parameter of the linked operation must correspond with a parameter of the initial operation, a property of the initial request (header or body), or property of the initial response (header or body). Operation links encode a reference to the linked operation, and a mapping between the initial request and response and the parameters of the linked operation: + +```typespec +op getWidgetOperationStatus is getResourceOperationStatus; + +@pollingOperation(getWidgetOperationStatus, parameterMap) +op createWidgetAsync is longRunningCreateOrReplace; +``` + +Note that, in the example above, the `@pollingOperation`decorator is used to specify an operation link to a StatusMonitor endpoint. This is just syntactic sugar for `@operationLink(getWidgetOperationStatus, "polling", parameterMap)`. To represent the logical stages of an LRO, `@pollingOperation` represents a link to a statusMonitor, and is the only decoration required for operations that comply with the recommended LRO pattern. Another decorator `@finalOperation` represents a link to an operation where the final result must be obtained my making a final request after polling has terminated. + +#### Decorators for Operation Links in Azure.Core + +Azure.Core defines the following decorators for operation links + +`@pollingOperation` - links a long-running operation to its status monitor endpoint. +`@finalOperation` - links a long-running operation to an additional endpoint, in the case that an additional endpoint must be called to obtain the final result after polling the status monitor is complete. + +Each of these decorators require a reference to the linked operation. They may also provide a mapping between the parameters and response properties of the initial request to the parameters of the linked operation. This mapping can be provided as a `Model` type parameter passed to the decorator, or by decorating the parameters and response properties of the original operation using `@lroParameter` + +### Custom LROs - Resource Links + +Resource links are used when the entire url of the linked operation is provided as part of the response to the initial operation. A resource link encodes the type of the expected response when the link is followed: + +```typespec +model WidgetStatusMonitorResponse { + @pollingLocation + @header("Operation-Location") + operationLocation: ResourceLocation>; + // following the url in this header will provide a response of type ResourceOperationStatus +} +``` + +#### Decorators for Resource Links in Azure.Core + +Azure.Core defines the following decorators for resource links used in long-running operations: + +`@pollingLocation` - indicates that the decorated property contains a url to the StatusMonitor. The type of the decorated property **should** be a `ResourceLocation`. +`@finalLocation` - indicates that the decorated property contains a url to the final result, in cases where an additional request must be made after polling to obtain the final result of the operation. The type of the decorated property must be a `ResourceLocation`. + +```typespec +alias ResultHeaders = { + @pollingLocation + @header("Operation-Location") + operationLocation: ResourceLocation>; + + @finalLocation + @header("location") + location: ResourceLocation; +}; +``` + +Note that the LRO templates provided in Azure.Core automatically provide the appropriate headers and resource location decoration for LROs. +Note that operations often provide multiple mechanisms that clients may use to determine how to logically complete an operation. This is often done to allow clients with different capabilities to determine how to resolve a long-running operation. It is recommended that clients prefer using Operation links in preference to Resource links whenever possible, because OperationLinks provide more information about the next operation. + +### Status Monitor Types in Azure.Core + +For Azure services, there is clear API guidance that requires usage of the Status Monitor pattern. In Azure, the Status Monitor has a specific structure, including: + +- A 'status' property containing the current status of the operation + - The status property is a string property that contains known values for terminal states, by default these are 'Succeeded' for successful operation termination, 'Failed' for operation termination with failure, and 'Canceled' to indicate the operation was canceled. +- A 'result' property, containing the result of the operation once the operation has succeeded (and is null if it has not succeeded) +- An 'error' property, containing any errors that occurred during the operation. + +In Azure.Core, this structure is represented using the `ResourceOperationStatus` model. The initial response to a long-running operation in Azure must contain an `Operation-Location` header that contains a url to the StatusMonitor endpoint. The StatusMonitor endpoint Url can also be calculated using the key properties of the resource and an additional `operationId` key property. To allow repeatability of requests and automatic calculation of the statusMonitor Uri, each LRO should allow an `OperationId` header that sets the operationId for the operation id execution. The `OperationId` must also be included in a header in the initial lro response. These patterns are encoded in the `LongRunning` operation templates provided in Azure.Core. If your service description uses these templates, it will automatically be following the recommended pattern. + +### Decorators and Types for Custom StatusMonitors in Azure.Core + +A StatusMonitor provides information that drives client polling until an operation completes. This includes a `status` field containing the current state of the operation, with known values for terminal states, headers that suggest polling retry intervals, and fields that will contain result and error information when the operation reaches a terminal status. Azure.Core provides a `ResourceOperationStatus` template that defines the standard Azure status monitor for an Azure operation. However, some services may need to implement custom status monitors. Azure.Core provides additional decorators to help clients use custom status monitors. + +| Decorator | Value | +| ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `@lroStatus` | A decorator marking the field of the StatusMonitor that contains status information. This field should use an `enum` type to specify terminal status values. | +| `@lroResult` | A decorator marking the property of the Status monitor that contains the result of the operation, when the operation completes successfully. By default, any field named 'result' in a StatusMonitor is assumed to contain the result of a successful operation. | +| `@lroErrorResult` | A decorator marking the property of the Status monitor that contains errors when the operation is unsuccessful. By default, any field named 'error' in a StatusMonitor is assumed to contain the result of a successful operation. | +| `@lroSucceeded` | If a status monitor uses a value other than `Succeeded` to indicate operation termination with success, then the enum value corresponding to successful completion should be decorated with this decorator. | +| `@lroCanceled` | If a status monitor uses a value other than `Canceled` to indicate that the operation was cancelled, then the enum value corresponding to cancellation should be decorated with this decorator. | +| `@lroFailed` | If a status monitor uses a value other than `Failed` to indicate operation termination with failure, then the enum value corresponding to operation failure should be decorated with this decorator. | +| `@pollingOperationParameter` | Indicates which request parameters or response properties of an operation can be used to call the operation that retrieves lro status (Status Monitor). Each application of the decorator may reference or name the corresponding parameter in the `getStatus` operation. | + +### Examples of common (non-standard) Lro Patterns + +- Status Monitor with custom terminal status fields +- Status Monitor with custom result field +- Link to StatusMonitor in the `location` header +- Link to StatusMonitor in the `Azure-AsyncOperation` header +- Link to operation with final status +- Calling GetStatusMonitor operation with non-standard parameters + +#### Example 1 - Status Monitor with custom terminal status fields + +In this example, the Status Monitor terminal properties for "Succeeded", "Failed", and "Canceled" use non-standard names. + +```tsp +@lroStatus +enum OperationStatus { + Running, + + @lroSucceeded + Completed, + + @lroCanceled + Aborted, + + @lroFailed + Faulted, +} + +model StatusMonitor { + status: OperationStatus; + result?: Widget; + error?: Error; +} + +@route("/status/{id}") +op getStatus(@path id: string): StatusMonitor | ErrorResult; + +@pollingOperation(getStatus) +op repairWidget is StandardResourceOperations.LongRUnningResourceAction; +``` + +We would expect `getLroMetadata` to return the foillowing data for this operation: + +```typescript +{ + envelopeResult: StatusMonitor, // the return value of getStatus + logicalResult: Widget; // The `result` field in the StatusMonitor + logicalPath: "result", + finalStateVia: "operation-location", + statusMonitorStep: { + target: { + kind: "link" + location: "ResponseHeader", + property: operationLocation + } + }, + pollingInfo: { + resultProperty: StatusMonitor.result, + errorProperty: StatusMonitor.error, + terminationStatus: { + property: StatusMonitor.result, + succeededState: ["Completed"], + canceledState ["Aborted"], + failedState: ["Faulted"], + } + } +} +``` + +#### Example 2 - Status Monitor with custom result fields + +In this example, the status monitor returns the result of a successful operation in a field with a name other than 'result' + +```tsp +@lroStatus +num OperationStatus { + Running, + Succeeded, + Canceled, + Failed +} + +model StatusMonitor { + status: OperationStatus; + @lroResult + success?: Widget; + @lroErrorResult + failure?: Error; +} + +@route("/status/{id}") +op getStatus(@path id: string): StatusMonitor | ErrorResult; + +@pollingOperation(getStatus) // sets the status monitor for the operation +op repairWidget is StandardResourceOperations.LongRUnningResourceAction; +``` + +We would expect `getLroMetadata` to return the foillowing data for this operation: + +```typescript +{ + envelopeResult: StatusMonitor, // the return value of getStatus + logicalResult: Widget; // The `result` field in the StatusMonitor + logicalPath: "success", + finalStateVia: "operation-location", + statusMonitorStep: { + target: { + kind: "link" + location: "ResponseHeader", + property: operationLocation + } + }, + pollingInfo: { + resultProperty: StatusMonitor.success, + errorProperty: StatusMonitor.failure, + terminationStatus: { + property: StatusMonitor.result, + succeededState: ["Succeeded"], + canceledState ["Canceled"], + failedState: ["Failed"], + } + } +} +``` + +#### Example 3 - Link to StatusMonitor in the `location` header + +In this example, the operation returns a `location` header with a link to the Status Monitor instead of the recommended `Operation-Location` header + +```tsp +@lroStatus +enum OperationStatus { + Running, + Succeeded, + Canceled, + Failed, +} + +model StatusMonitor { + status: OperationStatus; + result?: Widget; + error?: Error; +} + +@route("/status/{id}") +op getStatus(@path id: string): StatusMonitor | ErrorResult; + +alias RepairAccepted = { + @statusCode _: 202; + + @pollingLocation // this marks the response property or header that will contain a link to the Status Monitor + @header + location?: ResourceLocation; +}; + +@pollingOperation(getStatus) +@action("repairWidget") +@post +op repairWidget is Azure.Core.Foundations.Operation< + InstanceKeysOf & WidgetRepairRequest, + RepairAccepted +>; +``` + +We would expect `getLroMetadata` to return the foillowing data for this operation: + +```typescript +{ + envelopeResult: StatusMonitor, // the return value of getStatus + logicalResult: Widget; // The `result` field in the StatusMonitor + logicalPath: "result", + finalStateVia: "location", + statusMonitorStep: { + target: { + kind: "link" + location: "ResponseHeader", + property: location + } + }, + pollingInfo: { + resultProperty: StatusMonitor.result, + errorProperty: StatusMonitor.error, + terminationStatus: { + property: StatusMonitor.result, + succeededState: ["Succeeded"], + canceledState ["Canceled"], + failedState: ["Failed"], + } + } +} +``` + +#### Example 4 - Link to StatusMonitor in the `Azure-AsyncOperation` header + +In this example, the operation returns a `Azure-AsyncOperation` header with a link to the Status Monitor instead of the recommended `Operation-Location` header + +```tsp +@lroStatus +enum OperationStatus { + Running, + Succeeded, + Canceled, + Failed, +} + +model StatusMonitor { + status: OperationStatus; + result?: Widget; + error?: Error; +} + +@route("/status/{id}") +op getStatus(@path id: string): StatusMonitor | ErrorResult; + +alias RepairAccepted = { + @statusCode _: 202; + + @pollingLocation // this marks the response property or header that will contain a link to the Status Monitor + @header("Azure-AsyncOperation") + azureAsyncOperation?: string; +}; + +@pollingOperation(getStatus) +@action("repairWidget") +@result +@post +op repairWidget is Azure.Core.Foundations.Operation< + InstanceKeysOf & WidgetRepairRequest, + RepairAccepted +>; +``` + +We would expect `getLroMetadata` to return the foillowing data for this operation: + +```typescript +{ + envelopeResult: StatusMonitor, // the return value of getStatus + logicalResult: Widget; // The `result` field in the StatusMonitor + logicalPath: "result", + finalStateVia: "azure-async-operation", + statusMonitorStep: { + target: { + kind: "link" + location: "ResponseHeader", + property: azureAsyncOperation + } + }, + pollingInfo: { + resultProperty: StatusMonitor.result, + errorProperty: StatusMonitor.error, + terminationStatus: { + property: StatusMonitor.result, + succeededState: ["Succeeded"], + canceledState ["Canceled"], + failedState: ["Failed"], + } + } +} +``` + +#### Example 5 - Link to StatusMonitor in the `Azure-AsyncOperation` header and final link + +In this example, the operation returns a link to the Status Monitor (in `Azure-AsyncOperation`) **and** a link to the final result (in `location`). + +```tsp +@lroStatus +enum OperationStatus { + Running, + Succeeded, + Canceled, + Failed, +} + +model StatusMonitor { + status: OperationStatus; +} + +@route("/status/{id}") +op getStatus(@path id: string): StatusMonitor | ErrorResult; + +alias RepairAccepted = { + @statusCode _: 202; + + @pollingLocation // this marks the response property or header that will contain a link to the Status Monitor + @header("Azure-AsyncOperation") + azureAsyncOperation?: string; + + @finalLocation // this marks the response property or header that will contain a link to the final result + @header + location?: string; +}; + +@pollingOperation(getStatus) +@finalOperation(getWidget) +@action("repairWidget") +@result +@post +op repairWidget is Azure.Core.Foundations.Operation< + InstanceKeysOf & WidgetRepairRequest, + RepairAccepted +>; + +op getWidget is StandardResourceOperations.ResourceRead; +``` + +We would expect `getLroMetadata` to return the foillowing data for this operation: + +```typescript +{ + envelopeResult: StatusMonitor, // the return value of getStatus + logicalResult: Widget; // The `result` field in the StatusMonitor + logicalPath: "", + finalStateVia: "location", + statusMonitorStep: { + target: { + kind: "link" + location: "ResponseHeader", + property: azureAsyncOperation + } + }, + finalStep: { + target: { + kind: "link" + location: "ResponseHeader", + property: location + } + }, + pollingInfo: { + resultProperty: StatusMonitor.result, + errorProperty: StatusMonitor.error, + terminationStatus: { + property: StatusMonitor.result, + succeededState: ["Succeeded"], + canceledState ["Canceled"], + failedState: ["Failed"], + } + } +} +``` + +#### Example 6 - Calling GetStatusMonitor operation with non-standard parameters + +In this example, the operation does not return a link, instead, the request parameters and response properties can be used to call the `getStatus` operation that returns the Status Monitor. + +```tsp +@lroStatus +enum OperationStatus { + Running, + Succeeded, + Canceled, + Failed, +} + +model StatusMonitor { + status: OperationStatus; + result?: Widget; + error?: Error; +} + +@route("/status/{id}") +op getStatus(@path widgetId: string): StatusMonitor | ErrorResult; + +alias RepairAccepted = { + @statusCode _: 202; +}; + +@pollingOperation(getStatus) +@action("repairWidget") +@result +@post +op repairWidget( + @pollingOperationParameter(getStatus::parameters.widgetId) @path id: string, + body: WidgetRepairRequest, +): RepairAccepted | ErrorResult; +``` + +We would expect `getLroMetadata` to return the foillowing data for this operation: + +```typescript +{ + envelopeResult: StatusMonitor, // the return value of getStatus + logicalResult: Widget; // The `result` field in the StatusMonitor + logicalPath: "result", + finalStateVia: "custom-operation-reference", + statusMonitorStep: { + target: { + kind: "reference", + operation: getStatus, + parameters: { + widgetId: { + sourceKind: "RequestParameter", + source: repairWidget::parameters.id, + target: getStatus::parameters.widgetId + } + } + } + }, + pollingInfo: { + resultProperty: StatusMonitor.result, + errorProperty: StatusMonitor.error, + terminationStatus: { + property: StatusMonitor.result, + succeededState: ["Succeeded"], + canceledState ["Canceled"], + failedState: ["Failed"], + } + } +} +``` diff --git a/docs/howtos/DataPlane Generation - DPG/00howtogen.mdx b/docs/howtos/DataPlane Generation - DPG/00howtogen.mdx new file mode 100644 index 0000000000..b5763c64b3 --- /dev/null +++ b/docs/howtos/DataPlane Generation - DPG/00howtogen.mdx @@ -0,0 +1,55 @@ +import Tabs from "@theme/Tabs"; +import TabItem from "@theme/TabItem"; + +# How to generate DPG + +This page documents how to build a Data-Plane SDK from your TYPESPEC specification. For an overview of the whole process from initial API design to shipping SDKs, please visit https://aka.ms/azsdk/dpcodegen. + +The best documentation on how to generate can found using those links: + +- https://aka.ms/azsdk/dpcodegen/net +- https://aka.ms/azsdk/dpcodegen/python +- https://aka.ms/azsdk/dpcodegen/java +- https://aka.ms/azsdk/rlc/js +- https://aka.ms/azsdk/dpcodegen/js (do not use unless told to do so by the archboard) + +At a glance, add your emitter name to your `package.json`, along with the right options in the `tspconfig.yaml`. + +> **NOTE:** It may be complicated to generate all languages from the same folder at the moment as DPG and `typespec-azure-core` are still in preview. +> It's recommended that you keep each `package.json` with a unique language emitter, as they are likely to conflict, until all emitters and `typespec-azure-core` +> reach their first stable release. + +Update your `package.json` to contain dependencies on DPG language emitter(s). Don't forget to do `npm install` after an update of the file: + +```json +{ + "name": "clients", + "dependencies": { + "@typespec/compiler": "latest", + "@typespec/rest": "latest", + "@typespec/http": "latest", + "@azure-tools/typespec-azure-core": "latest", + "@azure-tools/typespec-python": "latest" + }, + "private": true +} +``` + +To get your code emitting without having to pass several options on the command line, the easiest way is to update your `tspconfig.yaml` file: + +```yaml +emit: + # Emitter for Swagger files with Autorest Extensions + - "@azure-tools/typespec-autorest" + # add "@azure-tools/typespec-python" to your package.json to generate Python code + - "@azure-tools/typespec-python" + # add "@azure-tools/typespec-java" to your package.json to generate Java code + - "@azure-tools/typespec-java" + # add "@azure-tools/typespec-csharp" to your package.json to generate C# code + - "@azure-tools/typespec-csharp" + # add "@azure-tools/typespec-ts" to your package.json to generate Typescript code + - "@azure-tools/typespec-ts" +options: + "@azure-tools/typespec-python": + package-name: azure-service-template +``` diff --git a/docs/howtos/DataPlane Generation - DPG/01setup.mdx b/docs/howtos/DataPlane Generation - DPG/01setup.mdx new file mode 100644 index 0000000000..7ecb427959 --- /dev/null +++ b/docs/howtos/DataPlane Generation - DPG/01setup.mdx @@ -0,0 +1,40 @@ +import Tabs from "@theme/Tabs"; +import TabItem from "@theme/TabItem"; + +# Setup for SDK customization + +This page explains how to setup customization of DPG generator if necessary. + +Your `package.json` needs to contains a link to the customization library for dpg, called `typespec-client-generator-core`: + +```json +{ + "name": "clients", + "dependencies": { + "@typespec/compiler": "latest", + "@typespec/http": "latest", + "@typespec/rest": "latest", + "@azure-tools/typespec-azure-core": "latest", + "@azure-tools/typespec-client-generator-core": "latest" + }, + "private": true +} +``` + +Customization should always be done in a file called `client.tsp` along with the `main.tsp`. + +```typespec +// client.tsp +import "./main.tsp"; +import "@azure-tools/typespec-client-generator-core"; + +using Azure.ClientGenerator.Core; + +// Your customizations here +``` + +Once you have a customization file, you should compile with your client.tsp to get output that includes the customizations: + +```shell +tsp compile client.tsp +``` diff --git a/docs/howtos/DataPlane Generation - DPG/02client.mdx b/docs/howtos/DataPlane Generation - DPG/02client.mdx new file mode 100644 index 0000000000..07c6eed7fb --- /dev/null +++ b/docs/howtos/DataPlane Generation - DPG/02client.mdx @@ -0,0 +1,590 @@ +import Tabs from "@theme/Tabs"; +import TabItem from "@theme/TabItem"; + +# Client hierarchy + +This page documents the default client hierarchy behavior as well as how to customize clients in DPG. For an overview of the setup, please visit the previous page. + +JS RLC is not in the business of customization. it will ignore client.tsp and the follow scenarios will not have impact on the JS RLC user experiences. In this context, TypeScript part means JS DPG. + +## Default behavior + +By default, each namespace with `@service` decorator will be generated as a root client. The name for that client will be the namespace name concatenating `Client` as suffix. + +Other nested namespacess and interfaces of each root client will be generated as operation groups with hierarchy. + +Different language's code generator will have different way to organize clients and operation groups. Please refer the following examples. + +### Single client + + + + +```typespec +@service({ + title: "Pet Store", + version: "v1", +}) +namespace PetStore; + +@route("/feed") +op feed(): void; + +@route("/op2") +op pet(): void; +``` + + + + + +```python +from pet_store import PetStoreClient + +client = PetStoreClient() +client.feed() +client.pet() +``` + + + + +```csharp +using PetStore; + +PetStoreClient client = new PetStoreClient(); +client.Feed(); +client.Pet(); +``` + + + + +```typescript +import { PetStoreClient } from "@azure/package-name"; + +const client = new PetStoreClient(); +client.feed(); +client.pet(); +``` + + + + +```java +PetStoreClient client = new PetStoreClientBuilder().buildClient(); +client.feed(); +client.pet(); +``` + + + + +### Client with one-layer child operation groups + + + + +```typespec +@service({ + title: "Pet Store", + version: "v1", +}) +namespace PetStore; + +@route("/dogs") +interface Dogs { + feed(): void; + pet(): void; +} + +@route("/cats") +namespace Cats { + op feed(): void; + op pet(): void; +} +``` + + + + + +```python +from pet_store import PetStoreClient + +client = PetStoreClient() +client.dogs.feed() +client.dogs.pet() +client.cats.feed() +client.cats.pet() +``` + + + + +```csharp +using PetStore; + +PetStoreClient client = new PetStoreClient(); +client.GetDogs().Feed(); +client.GetDogs().Pet(); +client.GetCats().Feed(); +client.GetCats().Pet(); +``` + + + + +```typescript +import { PetStoreClient } from "@azure/package-name"; + +const client = new PetStoreClient(); +client.dogs.feed(); +client.dogs.pet(); +client.cats.feed(); +client.cats.pet(); +``` + + + + +```java +PetStoreClientBuilder builder = new PetStoreClientBuilder(); + +DogsClient dogsClient = builder.buildDogsClient(); +dogsClient.feed(); +dogsClient.pet(); + +CatsClient catsClient = builder.buildCatsClient(); +catsClient.feed(); +catsClient.pet(); +``` + + + + +### Client with multi-layer child operation group + + + + +```typespec +@service({ + title: "Pet Store", + version: "v1", +}) +namespace PetStore; + +@route("/info") +op info(): void; + +@route("/billings") +interface Billings { + @route("history") + history(): void; +} + +@route("/pets") +namespace Pets { + @route("info") + op info(): void; + + @route("/actions") + interface Actions { + feed(): void; + pet(): void; + } +} + +@route("/actions") +interface Actions { + open(): void; + close(): void; +} +``` + + + + + +```python +from pet_store import PetStoreClient + +client = PetStoreClient() +client.info() +client.billings.history() +client.pets.info() +client.pets.actions.feed() +client.pets.actions.pet() +client.actions.open() +client.actions.close() +``` + + + + +```csharp +using PetStore; + +PetStoreClient client = new PetStoreClient(); +client.Info(); +client.GetBillings().History(); +client.GetPets().Info(); +client.GetPets().GetPetsActions().Feed(); +client.GetPets().GetPetsActions().Pet(); +client.GetActions().Open(); +client.GetActions().Close(); +``` + + + + +```typescript +import { PetStoreClient } from "@azure/package-name"; + +const client = new PetStoreClient(); +client.info(); +client.billings.history(); +client.pets.info(); +client.pets.actions.feed(); +client.pets.actions.pet(); +client.actions.open(); +client.actions.close(); +``` + + + + +```java +PetStoreClientBuilder builder = new PetStoreClientBuilder(); + +PetStoreClient petStoreClient = builder.buildClient(); +petStoreClient.info(); + +BillingsClient billingsClient = builder.buildBillingsClient(); +billingsClient.history(); + +PetsClient petsClient = builder.buildPetsClient(); +petsClient.info(); + +PetsActionsClient petsActionsClient = builder.buildPetsActionsClient(); +petsActionsClient.feed(); +petsActionsClient.pet(); + +ActionsClient actionsClient = builder.buildActionsClient(); +actionsClient.open(); +actionsClient.close(); +``` + + + + +## Customizations + +Customization SHOULD always be done in a file called `client.tsp` along with the `main.tsp`. +If there is any customizations including `@client` and `@operationGroup`, client hierarchy will only be inferred from them. The logic defined in the default behaviors will not take affect anymore. + +For this section, we will assume that you have service called `PetStore` in the namespace `PetStore`, defining the two operations `feed` and `pet`. + +### Renaming the single client + +This can be achieved with the augment operator and the DPG package + + + + +```typespec +import "./main.tsp"; +import "@azure-tools/typespec-client-generator-core"; + +using Azure.ClientGenerator.Core; + +@@projectedName(PetStore, "client", "PetStoreGreatClient"); +``` + + + + +```python +from pet_store import PetStoreGreatClient + +client = PetStoreGreatClient() +client.feed() +client.pet() +``` + + + + +```c# +using PetStore; + +PetStoreGreatClient client = new PetStoreGreatClient(); +client.Feed(); +client.Pet(); +``` + + + + +```typescript +import { PetStoreGreatClient } from "@azure/package-name"; + +const client = new PetStoreGreatClient(); +client.feed(); +client.pet(); +``` + + + + +```java +PetStoreGreatClient client = new PetStoreGreatClientBuilder().buildClient(); +client.feed(); +client.pet(); +``` + + + + +### Splitting the operations into two clients + +Two clients that separate the operations can be declared using the `@client` decorator from `typespec-client-generator-core`: + + + + +```typespec +import "./main.tsp" +import "@azure-tools/typespec-client-generator-core" + +using Azure.ClientGenerator.Core; + +namespace Customizations; # The actual name here doesn't matter and is here for organization purposes only + +@client({ + name: "FoodClient", + service: PetStoreNamespace +}) +interface Client1 { + feed is PetStoreNamespace.feed; +} + +@client({ + name: "PetActionClient", + service: PetStoreNamespace +}) +interface Client2 { + pet is PetStoreNamespace.pet; +} +``` + + + + +```python +from pet_store import FoodClient, PetActionClient + +client1 = FoodClient() +client2 = PetActionClient() + +client1.feed() +client2.pet() +``` + + + + +```csharp +using PetStore; + +PetActionClient petActionClient = new PetActionClient(); +FoodClient foodClient = new FoodClient(); + +petActionClient.Pet(); +foodClient.Feed(); +``` + + + + +```typescript +import { FoodClient, PetActionClient } from "@azure/package-name"; + +const client1 = new PetActionClient(); +const client2 = new FoodClient(); +client1.pet(); +client2.feed(); +``` + + + + +```java +FoodClient foodClient = new FoodClientBuilder().buildClient(); +PetActionClient petActionClient = new PetActionClientBuilder().buildClient(); + +foodClient.feed() +petActionClient.pet() +``` + + + + +### One client and two operation groups + +Two clients that separate the operations can be declared using the `@client` decorator and the `@operationGroup` decorator from `typespec-client-generator-core`: + + + + +```typespec +import "./main.tsp" +import "@azure-tools/typespec-client-generator-core" + +using Azure.ClientGenerator.Core; + +@client({ + name: "PetStoreClient", + service: PetStoreNamespace +}) +namespace Customizations; # The actual name here doesn't matter and is here for organization purposes only + +@operationGroup +interface OpGrp1{ + feed is PetStoreNamespace.feed +} + +@operationGroup +interface OpGrp2 { + pet is PetStoreNamespace.pet +} +``` + + + + +```python +from pet_store import PetStoreClient + +client = PetStoreClient() + +client.op_grp_1.feed() +client.op_grp_2.pet() +``` + + + + +```csharp +using PetStore; + +PetStoreClient client = new PetStoreClient(); + +client.GetOpGrp1Client().Feed(); +client.GetOpGrp2Client().Pet(); +``` + + + + +```typescript +import { PetStoreClient } from "@azure/package-name"; + +const client = new PetStoreClient(); +client.opGrp1.feed(); +client.opGrp2.pet(); +``` + + + + +```java +PetStoreClientBuilder builder = new PetStoreClientBuilder(); + +OpGrp1Client opGrp1Client = builder.buildOpGrp1Client(); +opGrp1Client.feed(); + +OpGrp2Client opGrp2Client = builder.buildOpGrp2Client(); +opGrp2Client.pet(); +``` + + + + +### Splitting the operations in two clients and have clients in different namespace + +Two clients that separates the operations can be declared using the `client` decorator of `typespec-client-generator-core`: + + + + +```typespec +import "./main.tsp" +import "@azure-tools/typespec-client-generator-core" + +using Azure.ClientGenerator.Core; + +namespace Customizations; # The actual name here doesn't matter and is here for organization purposes only + +@client({ + name: "FoodClient", + service: PetStoreNamespace +}) +interface Client1 { + feed is PetStoreNamespace.feed +} + +@client({ + name: "SubNamespace.PetActionClient", + service: PetStoreNamespace +}) +interface Client2 { + pet is PetStoreNamespace.pet +} +``` + + + + +```python +from pet_store import FoodClient +from pet_store.sub_namespace import PetActionClient + +client1 = FoodClient() +client2 = PetActionClient() + +client1.feed() +client2.pet() +``` + + + + +```csharp +using PetStore; +using PetStore.SubNamespace; + +PetActionClient petActionClient = new PetActionClient(); +FoodClient foodClient = new FoodClient(); + +petActionClient.Pet(); +foodClient.Feed(); +``` + + + + +```typescript +NOT_SUPPORTED; +``` + + + + +```java +NOT_SUPPORTED +``` + + + diff --git a/docs/howtos/DataPlane Generation - DPG/03convenient.mdx b/docs/howtos/DataPlane Generation - DPG/03convenient.mdx new file mode 100644 index 0000000000..fdff5a390d --- /dev/null +++ b/docs/howtos/DataPlane Generation - DPG/03convenient.mdx @@ -0,0 +1,244 @@ +import Tabs from "@theme/Tabs"; +import TabItem from "@theme/TabItem"; + +# Convenient method generation + +This page documents how to customize method generations in DPG. For an overview of the setup, please visit the setup page. + +## Default behaviors + +By default, any language code generator will generate both protocol methods and convenient methods. + +> **NOTE:** Python and Typescript don't have a separation of convenient/protocol methods. + + + + +```typespec +namespace PetStoreNamespace; + +@doc("This is the input I need") +@resource("output") +model OutputModel { + @key + @doc("Id of this object") + @visibility("read") + name: string; +} + +@doc("Read my resource") +op GetModel is ResourceRead; +``` + + + + + +```python +class OutputModel: + name: str = rest_field(readonly=True) +response: OutputModel = client.get(name="name") +FIXME +``` + + + + +```csharp +FIXME +``` + + + + +```typescript +interface OutputModel { + name: string; +} + +const model: OutputModel = await client.path("/petStore/model/{name}").get(); +``` + + + + +```java +FIXME +``` + + + + +## Customizations + +The detailed generation configuration of protocol and/or convenient methods that can be done: + +As emitters global parameters: + +- `generate-protocol-methods`: boolean flag to shift the entire generation for the process (`true` by default) +- `generate-convenience-methods`: boolean flag to shift the entire generation for the process (`true` by default) + +To set global emitters parameters, read the documentation of [emitters configuration](https://microsoft.github.io/typespec/introduction/configuration#configuration-file). + +For fine tuning, the set of decorators `@protocolAPI` and `@convenientAPI` can be used. They take a required boolean as parameter. + +### Shifting the generation of protocol and convenience on and off + +This can be achieved with the augment operator and the DPG package + + + + +```typespec +import "./main.tsp"; +import "@azure-tools/typespec-client-generator-core"; + +using Azure.ClientGenerator.Core; + +@@convenientAPI(PetStoreNamespace.GetModel, false); +``` + + + + +```python +# Python do not change behavior based on protocolAPI or convenientAPI +``` + + + + +```c# +FIXME +``` + + + + +```typescript +// Typescript do not change behavior based on protocolAPI or convenientAPI +``` + + + + +```java +FIXME +``` + + + + +### Make methods private/internal + +Sometimes it may be useful to still generate the method, but to make it private, so it can be re-used by a manual code wrapper. + + + + +```typespec +import "./main.tsp"; +import "@azure-tools/typespec-client-generator-core"; + +using Azure.ClientGenerator.Core; + +@@access(PetStoreNamespace.GetModel, Access.internal); +``` + +The two possible value for the `Access` enum are `internal` and `public`. + + + + +```python +class _GetModel: + ... +# FIXME +``` + + + + +```csharp +FIXME +``` + + + + +```typescript +// Typescript do not change behavior based on protocolAPI or convenientAPI +``` + + + + +```java +FIXME +``` + + + + + +### Decide the usage of a model + +Models can be used for input, output, or both at the same time. In some languages, this +changes the way the API is exposed for those models. + +By default, the code generator will infer the usage based on the TypeSpec. If this inference doesn't +correspond to expectation, this can be customized with the `usage` decorator. Possible values are +`input` and `ouput`, and can be combined with `Usage.input | Usage.output`. + +> **NOTE:** If a model is never used, it will not be generated. Assigning a usage will force generation. + + + + +```typespec +import "./main.tsp"; +import "@azure-tools/typespec-client-generator-core"; + +using Azure.ClientGenerator.Core; + +// This model is input only +@@usage(Azure.OpenAI.AzureCognitiveSearchIndexFieldMappingOptions, Usage.input); +// This models is input/output +@@usage(Azure.OpenAI.ImageGenerations, Usage.input | Usage.output); + +``` + + + + +```python +# Python doesn't generate different code based on usage +# However, the model may not be generated if it's never used +# In that case, set a usage for the model +``` + + + + +```csharp +FIXME +``` + + + + +```typescript +// JS doesn't generate different code based on usage +// However, the model may not be generated if it's never used +// In that case, set a usage for the model +``` + + + + +```java +FIXME +``` + + + diff --git a/docs/howtos/DataPlane Generation - DPG/04renaming.mdx b/docs/howtos/DataPlane Generation - DPG/04renaming.mdx new file mode 100644 index 0000000000..234886ec45 --- /dev/null +++ b/docs/howtos/DataPlane Generation - DPG/04renaming.mdx @@ -0,0 +1,209 @@ +import Tabs from "@theme/Tabs"; +import TabItem from "@theme/TabItem"; + +# Client renaming + +This page documents how to customize names for client generations in DPG. For an overview of the setup, please visit the setup page. + +## Default behaviors + +By default, any language code generator will assume the TYPESPEC name is the client. For clarity, generators do not attempt to do any auto-magic rename. + +> **NOTE:** While names are not transformed, they will be adapted to what is idiomatic of the language (Python snake_case, etc.). + + + + +```typespec +namespace PetStoreNamespace; + +@doc("This is the input I need") +@resource("input") +model InputModel { + @key + @doc("Id of this object") + @visibility("read") + name: string; +} + +@doc("Read my resource") +op GetModel is ResourceRead; +``` + + + + + +```python +class OutputModel: + name: str = rest_field(readonly=True) + +response: OutputModel = client.get(name="name") +FIXME +``` + + + + +```csharp +FIXME +``` + + + + +```typescript +interface InputModel { + name: string; +} + +const model: InputModel = await client.path("/petStore/model/{name}").get(); +``` + + + + +```java +FIXME +``` + + + + +## Customizations + +### Model names + +Renames in the context of models can be done on the model name and the attribute name. [Renames have a target](https://microsoft.github.io/typespec/standard-library/projected-names#known-targets): + +- `client` means that all client will use that name +- `csharp`, `javascript`, `python`, `java` means you target this specific language + +Language target takes priority over `client` target. + +> **NOTE:** As model name do not get serialized as JSON, sometimes the best choice is to rename the main TYPESPEC for clarity. Talk to your DPG contact is you're unsure +> if you should rename the model in the main TYPESPEC or customize it. + + + + +```typespec +import "./main.tsp"; +import "@azure-tools/typespec-client-generator-core"; + +using Azure.ClientGenerator.Core; + +@@projectedName(InputModel, "client", "InputOptions"); // Use InputOptions as a base name in clients +@@projectedName(InputModel, "csharp", "ParameterOptions"); // Prefer a different name for C# only + +@@projectedName(InputModel.name, "python", "input_name"); // Python may need a different to be idiomatic +``` + + + + +```python +class OutputOptions: + output_name: str = rest_field(rest_name="name", readonly=True) +FIXME +``` + + + + +```c# +FIXME +``` + + + + +```typescript +// Typescript do not change behavior based on protocolAPI or convenientAPI +``` + + + + +```java +FIXME +``` + + + + +### Rename operations and parameters + + + + +```typespec +import "./main.tsp"; +import "@azure-tools/typespec-client-generator-core"; + +using Azure.ClientGenerator.Core; + +@@projectedName(GetModel, "client", "ReadModel"); // Use InputOptions as a base name in clients +@@projectedName(GetModel, "python", "GetComputedModel"); // Note that Python will still snake_case it +``` + + + + +```python +client.get_computed_model() +# FIXME +``` + + + + +```csharp +FIXME +``` + + + + +```typescript +// Typescript do not change behavior based on protocolAPI or convenientAPI +``` + + + + +```java +FIXME +``` + + + + +## Implementation + +### Order of Operations + +For consistency when generating code, the order in which projections are applied is important. Code emitters should apply projections in the following order. + +#### Over-the-Wire JSON Names + +For determining the final name of a TypeSpec entity when sent over-the-wire in JSON: + +1. Run the `#target("json")` projection +2. Run the `#customTarget("json")` projection, if it exists +3. Apply the `@projectedName` decorator using the `getProjectedName` helper method. + +#### Client SDK Names + +For determining the final name of a TypeSpec entity when used in a client SDK (e.g. Python): + +1. Determine the name based on the client target: + 1. Run the `#target("client")` projection + 1. Run the `#customTarget("client")` projection, if it exists + 1. Apply the `@projectedName` decorator using the `getProjectedName` helper method. +1. Determine the name based on the language target: + 1. Run the `#target("python")` projection + 1. Run the `#customTarget("python")` projection, if it exists + 1. Apply the `@projectedName` decorator using the `getProjectedName` helper method. +1. If the language target name is different from the client target name, use the language target name. Otherwise, use the client name. +1. For names based on language target projections, do not alter the casing. For names based on the client target projections, apply casing heuristics appropriate for the language (for example, snake case, Pascal case, etc.). diff --git a/docs/howtos/DataPlane Generation - DPG/05union.mdx b/docs/howtos/DataPlane Generation - DPG/05union.mdx new file mode 100644 index 0000000000..ed9bfd1af1 --- /dev/null +++ b/docs/howtos/DataPlane Generation - DPG/05union.mdx @@ -0,0 +1,199 @@ +import Tabs from "@theme/Tabs"; +import TabItem from "@theme/TabItem"; + +# One path for multiple input/output + +This page documents DPG behavior and customization when you use union operator `|` or `@sharedRoute` to express multiple input/output for a given path. + +## Default behaviors + +The simplest way to express a combination of input in TypeSpec is to use the union operator `|`. +At a glance, JS and Python supports natively union, while Java and C# will use overloads. + + + + +```typespec +@route("/analyze") +@post +op analyze(@query mode: "strict" | "lenient", @body image: bytes): AnalyzeResult; + +model CompletionInput { + input: string | string[]; +} + +@route("/completions") +@post +op completions(@body input: CompletionInput): CompletionResult; +``` + + + + + +```python +def analyze(*, mode: Literal["strict", "lenient"], image: bytes) -> AnalyzeResult: + ... + +class CompletionInput: + input: str | List[str] = rest_field(readonly=True) + +def completions(input: CompletionInput) -> CompletionResult: + ... +``` + + + + +```csharp +FIXME +``` + + + + +```typescript +FIXME +``` + + + + +```java +FIXME +``` + + + + +Using union implies that the entire combination of possible input is valid. If you have a specific set of combination, or connection between input and output, +you must use `@sharedRoute`. By default, codegen will generate one method per operation name. + + + + + +```typespec +@sharedRoute("/foo") +op a(x: int) : float + +@sharedRoute("/foo") +op b(x: string) : int64 +``` + + + + + +```python +def a(x: int) -> float: + # code + +def b(x: string) -> int: + # code +``` + + + + +```csharp +//protocol +public Response A(RequestContent content, RequestContext context); +public Response B(RequestContent content, RequestContext context); + +//convenience +public Response A(int x, CancellationToken token); +public Response B(string x, Cancellation token); +``` + + + + +```typescript +FIXME +``` + + + + +```java +FIXME +``` + + + + + +## Customizations + +### Merge `@sharedRoute` operations into one. + +If your shared routes are actually one unique semantic operation, you may want to configure codegen to use a unique name. This is simply done by projecting +the same name on both operations. + + + + +```typescript +// main.tsp +@sharedRoute("/foo") +op a(x: int) : float + +@sharedRoute("/foo") +op b(x: string) : int64 + +// client.tsp +import "./main.tsp"; +import "@azure-tools/typespec-client-generator-core"; + +using Azure.ClientGenerator.Core; + +@@projectedName(a, "client", "Foo"); +@@projectedName(b, "client", "Foo"); +``` + + + + +```python +@overload +def foo(x: int) -> float: + ... + +@overload +def foo(x: string) -> int: + ... + +def foo(x: string | int) -> float | int: + # Code here +``` + + + + +```csharp +//protocol +public Response Foo(RequestContent content, RequestContext context); + +//convenience +public Response Foo(int x, CancellationToken token); +public Response Foo(string x, Cancellation token); +``` + + + + +```typescript +FIXME +``` + + + + +```java +FIXME +``` + + + + diff --git a/docs/howtos/TypeSpec/emitter-configurations.md b/docs/howtos/TypeSpec/emitter-configurations.md new file mode 100644 index 0000000000..dc6bf7a749 --- /dev/null +++ b/docs/howtos/TypeSpec/emitter-configurations.md @@ -0,0 +1,3 @@ +# Emitter configurations + +TBA diff --git a/docs/howtos/migrate-swagger/_category_.json b/docs/howtos/migrate-swagger/_category_.json new file mode 100644 index 0000000000..ece7d1e09f --- /dev/null +++ b/docs/howtos/migrate-swagger/_category_.json @@ -0,0 +1,6 @@ +{ + "label": "Convert swagger to TypeSpec", + "link": { + "type": "generated-index" + } +} diff --git a/docs/howtos/migrate-swagger/get-started.md b/docs/howtos/migrate-swagger/get-started.md new file mode 100644 index 0000000000..581973ea72 --- /dev/null +++ b/docs/howtos/migrate-swagger/get-started.md @@ -0,0 +1,22 @@ +# Migrate Azure API spec from swagger to TypeSpec + +We have created a swagger to TypeSpec conversion tool to help take on the bulk of the manual conversion labor. It can handle both data-plane and management-plane swaggers. The produced TypeSpec relies on the Azure.Core and Azure.Resource.Manager libraries. + +**_Important!_** Because TypeSpec is more expressive than Swagger and with the help of evolving Azure libraries, this tool should only be used as an aid in the conversion/migration process, not as the sole tool to produce final version of TypeSpec specs without human inspection, correction and optimization. + +## Steps of running the tool + +- Ensure `powershell` is installed. +- Ensure `autorest` tool is installed. [Installation guide](https://github.com/Azure/autorest/blob/main/docs/install/readme.md) +- Download conversion script [here](https://aka.ms/azsdk/openapi-to-typespec-script). +- Running the conversion tool. + +```powershell +./convert.ps1 --swaggerConfigFile [path to readme.md] +``` + +- Review generated TypeSpec +- Layout [the TypeSpec project folders appropriately](https://github.com/Azure/azure-rest-api-specs/blob/main/documentation/typespec-structure-guidelines.md). +- Leverage standard `tspconfig.yaml` ([Template projects](https://github.com/microsoft/typespec/tree/main/eng/feeds)) and make appropriate output file name changes. +- Ensure it compiles successfully locally and then submit a PR +- Review CI checks such as breaking changes and other failures. diff --git a/docs/howtos/rest-api-publish/_category_.json b/docs/howtos/rest-api-publish/_category_.json new file mode 100644 index 0000000000..7686d03a5d --- /dev/null +++ b/docs/howtos/rest-api-publish/_category_.json @@ -0,0 +1,6 @@ +{ + "label": "Publish REST API Spec", + "link": { + "type": "generated-index" + } +} diff --git a/docs/howtos/rest-api-publish/buildpipelines.md b/docs/howtos/rest-api-publish/buildpipelines.md new file mode 100644 index 0000000000..f4c43a487f --- /dev/null +++ b/docs/howtos/rest-api-publish/buildpipelines.md @@ -0,0 +1,65 @@ +# Using Build Pipelines with TypeSpec + +This doc will help you get started with using TypeSpec in your build pipelines in your own repository. [See here for more how to use in the azure-rest-api-specs repo](./checking-in-api-specs-guide.md) + +## Table of Contents + +1. [Introduction](#introduction) +1. [Azure DevOps Pipelines](#azure-devops-pipelines) + +## Introduction + +### Dependencies + +In order to build TypeSpec in your build pipeline, you will need to ensure that the following are available or are automatically installed by your project: + +1. NodeJS 18.x LTS (Recommended) +2. TypeSpec compilation tools (via npm package) + +## Azure DevOps Pipelines + +Depending on your project, you may need to add NodeJS and install NPM packages for TypeSpec. +The following Azure Devops Pipeline tasks can be modified and added to your pipeline yaml file if you do not already utilize NodeJS in your project. + +```yaml +# Install NodeJS +- task: NodeTool@0 + inputs: + versionSpec: "18.x" # Node 18 LTS is recommended. + checkLatest: false + +# Install dependencies +- script: npm install + workingDir: path/to/typespec/project # This is where package.json lives for your TypeSpec project + +# Build +- script: npx tsp compile . + workingDir: path/to/typespec/project # This is where package.json lives for your TypeSpec project +``` + +This is sufficient if you are building via a csproj file which triggers the tsp compile and finds the tsp compiler itself. + +You may also need to add additional steps to compile your typespec files separately. An example of a basic pipeline is provided below. + +### Example Pipeline Configuration + +Note: This example assumes that your TypeSpec folder is at the root of your repository. + +```yaml +trigger: + - main +pool: + vmImage: ubuntu-latest +steps: + - task: NodeTool@0 + inputs: + versionSpec: "18.17.0" + - script: npm install + - script: npx tsp compile . + - task: PublishPipelineArtifact@1 + displayName: Publish TypeSpec Output Folder + inputs: + targetPath: "tsp-output" + artifact: "tsp-output" + publishLocation: "pipeline" +``` diff --git a/docs/howtos/rest-api-publish/checking-in-api-specs-guide.md b/docs/howtos/rest-api-publish/checking-in-api-specs-guide.md new file mode 100644 index 0000000000..8d3d7c529a --- /dev/null +++ b/docs/howtos/rest-api-publish/checking-in-api-specs-guide.md @@ -0,0 +1,3 @@ +# Checking in typespec and generated OpenAPI to azure-rest-api-specs repo + +See documentation on the azure-rest-api-specs repo https://github.com/Azure/azure-rest-api-specs/blob/main/documentation/Getting-started-with-TypeSpec-specifications.md diff --git a/docs/intro.md b/docs/intro.md new file mode 100644 index 0000000000..b88fe87da3 --- /dev/null +++ b/docs/intro.md @@ -0,0 +1,59 @@ +# TypeSpec Introduction + +TypeSpec is a language for describing cloud service APIs and generating other API description languages, client and service code, documentation, and other assets. TypeSpec provides highly extensible core language primitives that can describe API shapes common among REST, GraphQL, gRPC, and other protocols. + +You can find more information at https://microsoft.github.io/typespec. + +This site is focused on using TypeSpec in the context of Azure. We have published a set of libraries with standard patterns and templates to make defining Azure management and data-plane services easy and compliant with Azure API guidelines. Using these building blocks +and guard rails, your service API will be easier to build, will have an easier time passing API reviews, will be consistent with other Azure +services, and will produce good API documentation, good SDKs, and good CLIs. +TypeSpec can emit the following artifacts for your service: + +- OpenAPI3 specs +- OpenAPI2 specs, suitable for check-in in to the azure-rest-api-specs repo +- Azure ProviderHub User RP controller projects. This project also contains related registration manifests and scripts for easy local testing and debugging. + +# TypeSpec Azure Libraries + +## Packages + +| Name | Type | Changelog | Latest | Next | +| ----------------------------------------------------------------------------- | ------- | ------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------- | +| [@azure-tools/typespec-azure-core][typespec-azure-core_src] | Library | [Changelog][typespec-azure-core_chg] | [![](https://img.shields.io/npm/v/@azure-tools/typespec-azure-core)](https://www.npmjs.com/package/@azure-tools/typespec-azure-core) | ![](https://img.shields.io/npm/@azure-tools/typespec-azure-core/next) | +| [@azure-tools/typespec-resource-manager][typespec-azure-resource-manager_src] | Library | [Changelog][typespec-azure-resource-manager_chg] | [![](https://img.shields.io/npm/v/@azure-tools/typespec-azure-resource-manager)](https://www.npmjs.com/package/@azure-tools/typespec-azure-resource-manager) | ![](https://img.shields.io/npm/@azure-tools/typespec-azure-resource-manager/next) | +| [@azure-tools/typespec-autorest][typespec-autorest_src] | Emitter | [Changelog][typespec-autorest_chg] | [![](https://img.shields.io/npm/v/@azure-tools/typespec-autorest)](https://www.npmjs.com/package/@azure-tools/typespec-autorest) | ![](https://img.shields.io/npm/v/@azure-tools/typespec-autorest/next) | + +[typespec-autorest_src]: https://github.com/Azure/typespec-azure/tree/main/packages/typespec-autorest +[typespec-autorest_chg]: https://github.com/Azure/typespec-azure/tree/main/packages/typespec-autorest/CHANGELOG.md +[typespec-azure-core_src]: https://github.com/Azure/typespec-azure/tree/main/packages/typespec-azure-core +[typespec-azure-core_chg]: https://github.com/Azure/typespec-azure/tree/main/packages/typespec-azure-core/CHANGELOG.md +[typespec-azure-resource-manager_src]: https://github.com/Azure/typespec-azure/tree/main/packages/typespec-azure-resource-manager +[typespec-azure-resource-manager_chg]: https://github.com/Azure/typespec-azure/tree/main/packages/typespec-azure-resource-manager/CHANGELOG.md + +`@next` version of the package are the latest versions available on the `main` branch. + +### Package Layering + +The main packages in this repository can be considered a series of layers which progressively add functionality +for specific scenarios: + +- [**@azure-tools/typespec-azure-core:**](https://github.com/Azure/typespec-azure/tree/main/packages/typespec-azure-core) Provides core models and interfaces for Azure service modelling +- [**@azure-tools/typespec-azure-resource-manager:**](https://github.com/Azure/typespec-azure/tree/main/packages/typespec-azure-resource-manager) Provides additional models and interfaces for modelling Azure Resource Manager services + +## How to Get Help + +- Ask questions in the [TypeSpec Discussions Channel](https://teams.microsoft.com/l/channel/19%3a906c1efbbec54dc8949ac736633e6bdf%40thread.skype/TypeSpec%2520Discussion%2520%25F0%259F%2590%25AE?groupId=3e17dcb0-4257-4a30-b843-77f47f1d4121&tenantId=72f988bf-86f1-41af-91ab-2d7cd011db47) +- File issues in the [typespec-azure github repo](https://github.com/azure/typespec-azure/issues) + - For bugs, please include: + - A high-level description of the bug + - Expected and Actual Results + - Repro steps, including any TypeSpec code that you used + - Any error messages you saw, including stack traces. For issues with VS or VS Code tooling see [Troubleshooting VSCode Tooling and Filing Issues](#troubleshooting-vscode-tooling-and-filing-issues) + +## More Information About TypeSpec + +Some additional sources: + +- Recordings + - [TypeSpec lunch-and-learn for ARM in Stream Channel](https://msit.microsoftstream.com/channel/97c90840-98dc-b478-19e5-f1ecdab7312b) + - [TypeSpec lunch-and-learn for Azure SDK](https://microsoft-my.sharepoint.com/:v:/r/personal/scotk_microsoft_com/Documents/Recordings/Lunch%20Learning%20Series%20_%20Mark%20Cowlishaw%20-%20TypeSpec%20Walkthrough-20211117_120334-Meeting%20Recording.mp4?csf=1&web=1&e=27IgaX) diff --git a/docs/libraries/azure-core/reference/data-types.md b/docs/libraries/azure-core/reference/data-types.md new file mode 100644 index 0000000000..d3c1710e83 --- /dev/null +++ b/docs/libraries/azure-core/reference/data-types.md @@ -0,0 +1,762 @@ +--- +title: "Data types" +toc_min_heading_level: 2 +toc_max_heading_level: 3 +--- + +# Data types + +## Azure.Core + +### `AadOauth2Auth` {#Azure.Core.AadOauth2Auth} + +Azure Active Directory OAuth2 Flow + +```typespec +model Azure.Core.AadOauth2Auth +``` + +#### Template Parameters + +| Name | Description | +| -------- | -------------------------------------- | +| Scopes | A list of scopes the token applies to. | +| AuthUrl | The authorization URL. | +| TokenUrl | The token URL. | + +### `AadTokenAuthFlow` {#Azure.Core.AadTokenAuthFlow} + +Azure Active Directory (AAD) Token Authentication Flow + +```typespec +model Azure.Core.AadTokenAuthFlow +``` + +#### Template Parameters + +| Name | Description | +| -------- | -------------------------------------- | +| Scopes | A list of scopes the token applies to. | +| AuthUrl | The authorization URL. | +| TokenUrl | The token URL. | + +### `AzureApiKeyAuthentication` {#Azure.Core.AzureApiKeyAuthentication} + +Azure API Key Authentication using the "Ocp-Apim-Subscription-Key" hea + +```typespec +model Azure.Core.AzureApiKeyAuthentication +``` + +### `ClientRequestIdHeader` {#Azure.Core.ClientRequestIdHeader} + +Provides the 'x-ms-client-request-id' header to enable request correlation in requests and responses. + +```typespec +model Azure.Core.ClientRequestIdHeader +``` + +### `ConditionalRequestHeaders` {#Azure.Core.ConditionalRequestHeaders} + +Provides the 'If-\*' headers to enable conditional (cached) responses + +```typespec +model Azure.Core.ConditionalRequestHeaders +``` + +### `EmbeddingVector` {#Azure.Core.EmbeddingVector} + +A vector embedding frequently used in similarity search. + +```typespec +model Azure.Core.EmbeddingVector +``` + +#### Template Parameters + +| Name | Description | +| ----- | -------------------------------------- | +| TType | The data type of the embedding vector. | + +### `EtagProperty` {#Azure.Core.EtagProperty} + +Provides the 'ETag' field to enable conditional (cached) requests. This model can be spread +into responses and item models to convey the ETag when it cannot simply conveyed in a header. + +```typespec +model Azure.Core.EtagProperty +``` + +### `EtagResponseEnvelope` {#Azure.Core.EtagResponseEnvelope} + +Provides the 'ETag' header to enable conditional (cached) requests + +```typespec +model Azure.Core.EtagResponseEnvelope +``` + +### `ExpandQueryParameter` {#Azure.Core.ExpandQueryParameter} + +Provides the standard 'expand' query parameter for list operations. + +```typespec +model Azure.Core.ExpandQueryParameter +``` + +### `FilterQueryParameter` {#Azure.Core.FilterQueryParameter} + +Provides the standard 'filter' query parameter for list operations. + +```typespec +model Azure.Core.FilterQueryParameter +``` + +### `MaxPageSizeQueryParameter` {#Azure.Core.MaxPageSizeQueryParameter} + +Provides the standard 'maxpagesize' query parameter for list operations. + +```typespec +model Azure.Core.MaxPageSizeQueryParameter +``` + +### `OrderByQueryParameter` {#Azure.Core.OrderByQueryParameter} + +Provides the standard 'orderby' query parameter for list operations. + +```typespec +model Azure.Core.OrderByQueryParameter +``` + +### `Page` {#Azure.Core.Page} + +Describes a page of resource object. + +```typespec +model Azure.Core.Page +``` + +#### Template Parameters + +| Name | Description | +| --------- | ------------------ | +| TResource | The resource type. | + +### `RepeatabilityRequestHeaders` {#Azure.Core.RepeatabilityRequestHeaders} + +Provides the 'Repeatability-\*' headers to enable repeatable requests. + +```typespec +model Azure.Core.RepeatabilityRequestHeaders +``` + +### `RepeatabilityResponseHeaders` {#Azure.Core.RepeatabilityResponseHeaders} + +Provides the 'Repeatability-\*' headers to enable repeatable requests. + +```typespec +model Azure.Core.RepeatabilityResponseHeaders +``` + +### `RequestIdResponseHeader` {#Azure.Core.RequestIdResponseHeader} + +Provides the 'x-ms-request-id' header to enable request correlation in responses. + +```typespec +model Azure.Core.RequestIdResponseHeader +``` + +### `RequestParameter` {#Azure.Core.RequestParameter} + +Defines a property as a request parameter. + +```typespec +model Azure.Core.RequestParameter +``` + +#### Template Parameters + +| Name | Description | +| ---- | ------------------- | +| T | The parameter name. | + +### `ResourceOperationStatus` {#Azure.Core.ResourceOperationStatus} + +```typespec +model Azure.Core.ResourceOperationStatus +``` + +#### Template Parameters + +| Name | Description | +| ------------- | ------------------------------------------------------------------------------------------------- | +| TResource | The resource type. | +| TStatusResult | Model describing the status result object. If not specified, the default is the resource type. | +| TStatusError | Model describing the status error object. If not specified, the default is the Foundations.Error. | + +### `ResponseProperty` {#Azure.Core.ResponseProperty} + +Defines a property as a response header. + +```typespec +model Azure.Core.ResponseProperty +``` + +#### Template Parameters + +| Name | Description | +| ---- | ---------------- | +| T | The header name. | + +### `SelectQueryParameter` {#Azure.Core.SelectQueryParameter} + +Provides the standard 'select' query parameter for list operations. + +```typespec +model Azure.Core.SelectQueryParameter +``` + +### `SkipQueryParameter` {#Azure.Core.SkipQueryParameter} + +Provides the standard 'skip' query parameter for list operations. + +```typespec +model Azure.Core.SkipQueryParameter +``` + +### `StandardListQueryParameters` {#Azure.Core.StandardListQueryParameters} + +Provides the most common query parameters for list operations. + +```typespec +model Azure.Core.StandardListQueryParameters +``` + +### `TopQueryParameter` {#Azure.Core.TopQueryParameter} + +Provides the standard 'top' query parameter for list operations. + +```typespec +model Azure.Core.TopQueryParameter +``` + +### `Versions` {#Azure.Core.Versions} + +Supported versions of Azure.Core TypeSpec building blocks. + +```typespec +enum Azure.Core.Versions +``` + +### `RepeatabilityResult` {#Azure.Core.RepeatabilityResult} + +Repeatability Result header options + +```typespec +union Azure.Core.RepeatabilityResult +``` + +### `eTag` {#Azure.Core.eTag} + +The ETag (or entity tag) HTTP response header is an identifier for a specific version of a resource. +It lets caches be more efficient and save bandwidth, as a web server does not need to resend a full response if the content was not changed. + +It is a string of ASCII characters placed between double quotes, like "675af34563dc-tr34". + +```typespec +scalar Azure.Core.eTag +``` + +#### Examples + +##### In `ETag` header + +``` +ETag: "675af34563dc-tr34" +``` + +### `ipV4Address` {#Azure.Core.ipV4Address} + +Represent an IP V4 address serialized as a string. + +It is formatted as four 8-bit fields separated by periods. + +```typespec +scalar Azure.Core.ipV4Address +``` + +#### Examples + +``` +129.144.50.56 +``` + +### `ipV6Address` {#Azure.Core.ipV6Address} + +Represent an IP V6 address serialized as a string. + +It is formatted as eight hex decimal values(16-bit) between 0 and FFFF separated by colon. (i.e. `y:y:y:y:y:y:y:y`) + +```typespec +scalar Azure.Core.ipV6Address +``` + +#### Examples + +``` +2001:db8:3333:4444:CCCC:DDDD:EEEE:FFFF +``` + +### `uuid` {#Azure.Core.uuid} + +Universally Unique Identifier + +```typespec +scalar Azure.Core.uuid +``` + +#### Examples + +``` +123e4567-e89b-12d3-a456-426614174000 +``` + +## Azure.Core.Foundations + +### `ApiVersionParameter` {#Azure.Core.Foundations.ApiVersionParameter} + +The ApiVersion query parameter. + +```typespec +model Azure.Core.Foundations.ApiVersionParameter +``` + +### `CollectionKeysOf` {#Azure.Core.Foundations.CollectionKeysOf} + +A model containing the collection keys of the provided resource's parent resource. + +```typespec +model Azure.Core.Foundations.CollectionKeysOf +``` + +#### Template Parameters + +| Name | Description | +| --------- | ------------------------- | +| TResource | The type of the resource. | + +### `CreateableAndUpdateableProperties` {#Azure.Core.Foundations.CreateableAndUpdateableProperties} + +Collection of properties from a resource that are visible to create or update scopes. + +```typespec +model Azure.Core.Foundations.CreateableAndUpdateableProperties +``` + +#### Template Parameters + +| Name | Description | +| --------- | ------------------------- | +| TResource | The type of the resource. | + +### `CustomizationFields` {#Azure.Core.Foundations.CustomizationFields} + +The expected shape of model types passed to the TCustom parameter of operation signatures. + +```typespec +model Azure.Core.Foundations.CustomizationFields +``` + +### `CustomPage` {#Azure.Core.Foundations.CustomPage} + +A model describing a customized page of resources. + +```typespec +model Azure.Core.Foundations.CustomPage +``` + +#### Template Parameters + +| Name | Description | +| --------- | ------------------------------- | +| TResource | The type of the resource. | +| Traits | Traits which apply to the page. | + +### `CustomParameters` {#Azure.Core.Foundations.CustomParameters} + +A model describing a set of custom request parameters. + +```typespec +model Azure.Core.Foundations.CustomParameters +``` + +#### Template Parameters + +| Name | Description | +| ------- | ----------------------------------------------- | +| TCustom | An object describing custom request parameters. | + +### `CustomResponseFields` {#Azure.Core.Foundations.CustomResponseFields} + +A model describing a set of custom response properties. + +```typespec +model Azure.Core.Foundations.CustomResponseFields +``` + +#### Template Parameters + +| Name | Description | +| ------- | ------------------------------------------------ | +| TCustom | An object describing custom response properties. | + +### `Error` {#Azure.Core.Foundations.Error} + +The error object. + +```typespec +model Azure.Core.Foundations.Error +``` + +### `ErrorResponse` {#Azure.Core.Foundations.ErrorResponse} + +A response containing error details. + +```typespec +model Azure.Core.Foundations.ErrorResponse +``` + +### `ErrorResponseBase` {#Azure.Core.Foundations.ErrorResponseBase} + +A response containing error details. + +```typespec +model Azure.Core.Foundations.ErrorResponseBase +``` + +#### Template Parameters + +| Name | Description | +| ------ | ----------------------------- | +| TError | The type of the error object. | + +### `InnerError` {#Azure.Core.Foundations.InnerError} + +An object containing more specific information about the error. As per Microsoft One API guidelines - https://github.com/Microsoft/api-guidelines/blob/vNext/Guidelines.md#7102-error-condition-responses. + +```typespec +model Azure.Core.Foundations.InnerError +``` + +### `ItemKeysOf` {#Azure.Core.Foundations.ItemKeysOf} + +A model containing the keys of the provided resource. + +```typespec +model Azure.Core.Foundations.ItemKeysOf +``` + +#### Template Parameters + +| Name | Description | +| --------- | ------------------------- | +| TResource | The type of the resource. | + +### `LocationOfCreatedResourceResponse` {#Azure.Core.Foundations.LocationOfCreatedResourceResponse} + +Response describing the location of a created resource. + +```typespec +model Azure.Core.Foundations.LocationOfCreatedResourceResponse +``` + +#### Template Parameters + +| Name | Description | +| ---- | --------------------------------- | +| T | The type of the created resource. | + +### `LocationOfCreatedResourceWithServiceProvidedNameResponse` {#Azure.Core.Foundations.LocationOfCreatedResourceWithServiceProvidedNameResponse} + +Response describing the location of a resource created with a service-provided name. + +```typespec +model Azure.Core.Foundations.LocationOfCreatedResourceWithServiceProvidedNameResponse +``` + +#### Template Parameters + +| Name | Description | +| ---- | --------------------------------- | +| T | The type of the created resource. | + +### `LongRunningStatusLocation` {#Azure.Core.Foundations.LongRunningStatusLocation} + +Metadata for long running operation status monitor locations. + +```typespec +model Azure.Core.Foundations.LongRunningStatusLocation +``` + +#### Template Parameters + +| Name | Description | +| ------------- | ---------------------------------------- | +| TStatusResult | The type of the operation status result. | + +### `OperationStatus` {#Azure.Core.Foundations.OperationStatus} + +Provides status details for long running operations. + +```typespec +model Azure.Core.Foundations.OperationStatus +``` + +#### Template Parameters + +| Name | Description | +| ------------- | ----------------------------------------------------------------------------------- | +| TStatusResult | The type of the operation status result. | +| TStatusError | The type of the operation status error. If not provided, the default error is used. | + +### `ResourceBody` {#Azure.Core.Foundations.ResourceBody} + +Conveys the resource instance to an operation as a request body. + +```typespec +model Azure.Core.Foundations.ResourceBody +``` + +#### Template Parameters + +| Name | Description | +| ---- | ---------------------------------- | +| T | The type of the resource instance. | + +### `ResourceCreateOrReplaceModel` {#Azure.Core.Foundations.ResourceCreateOrReplaceModel} + +Version of a model for a create or replace operation which only includes updateable properties. + +```typespec +model Azure.Core.Foundations.ResourceCreateOrReplaceModel +``` + +#### Template Parameters + +| Name | Description | +| --------- | ------------------------- | +| TResource | The type of the resource. | + +### `ResourceCreateOrUpdateModel` {#Azure.Core.Foundations.ResourceCreateOrUpdateModel} + +Version of a model for a create or update operation which only includes updateable properties. + +```typespec +model Azure.Core.Foundations.ResourceCreateOrUpdateModel +``` + +#### Template Parameters + +| Name | Description | +| --------- | ------------------------- | +| TResource | The type of the resource. | + +### `ResourceUpdateModel` {#Azure.Core.Foundations.ResourceUpdateModel} + +Version of a model for an update operation which only includes updateable properties. + +```typespec +model Azure.Core.Foundations.ResourceUpdateModel +``` + +#### Template Parameters + +| Name | Description | +| --------- | ------------------------- | +| TResource | The type of the resource. | + +### `RetryAfterHeader` {#Azure.Core.Foundations.RetryAfterHeader} + +The retry-after envelope. + +```typespec +model Azure.Core.Foundations.RetryAfterHeader +``` + +### `OperationState` {#Azure.Core.Foundations.OperationState} + +Enum describing allowed operation states. + +```typespec +enum Azure.Core.Foundations.OperationState +``` + +## Azure.Core.Traits + +### `ListQueryParametersTrait` {#Azure.Core.Traits.ListQueryParametersTrait} + +Declares a trait that is applied as a query parameter for list operations. + +```typespec +model Azure.Core.Traits.ListQueryParametersTrait +``` + +#### Template Parameters + +| Name | Description | +| ------- | --------------------------------------- | +| TParams | Object describing the query parameters. | + +### `NoClientRequestId` {#Azure.Core.Traits.NoClientRequestId} + +Indicates that the service or operation does not support clientRequestId headers. + +```typespec +model Azure.Core.Traits.NoClientRequestId +``` + +### `NoConditionalRequests` {#Azure.Core.Traits.NoConditionalRequests} + +Indicates that the service or operation does not support conditional requests. + +```typespec +model Azure.Core.Traits.NoConditionalRequests +``` + +### `NoRepeatableRequests` {#Azure.Core.Traits.NoRepeatableRequests} + +Indicates that the service or operation does not support repeatable requests. + +```typespec +model Azure.Core.Traits.NoRepeatableRequests +``` + +### `QueryParametersTrait` {#Azure.Core.Traits.QueryParametersTrait} + +Declares a trait that is applied as a query parameter. + +```typespec +model Azure.Core.Traits.QueryParametersTrait +``` + +#### Template Parameters + +| Name | Description | +| -------- | ---------------------------------------------- | +| TParams | The name of the query parameter. | +| Contexts | The contexts in which the trait is applicable. | + +### `RequestHeadersTrait` {#Azure.Core.Traits.RequestHeadersTrait} + +Declares a trait that is applied as a request header parameter. + +```typespec +model Azure.Core.Traits.RequestHeadersTrait +``` + +#### Template Parameters + +| Name | Description | +| -------- | ------------------------------------------------ | +| THeaders | Object describing the request header parameters. | +| Contexts | The contexts in which the trait is applicable. | + +### `ResponseHeadersTrait` {#Azure.Core.Traits.ResponseHeadersTrait} + +Declares a trait that is applied as a response header parameter. + +```typespec +model Azure.Core.Traits.ResponseHeadersTrait +``` + +#### Template Parameters + +| Name | Description | +| -------- | ------------------------------------------------- | +| THeaders | Object describing the response header parameters. | +| Contexts | The contexts in which the trait is applicable. | + +### `SupportsClientRequestId` {#Azure.Core.Traits.SupportsClientRequestId} + +Provides clientRequestId headers for requests and responses. + +```typespec +model Azure.Core.Traits.SupportsClientRequestId +``` + +#### Template Parameters + +| Name | Description | +| ------------- | ------------------------------------------------------------------------------------------------------------------ | +| TVersionAdded | The version when the trait was added to the specification.
Leave this empty if the trait is always supported. | + +### `SupportsConditionalRequests` {#Azure.Core.Traits.SupportsConditionalRequests} + +Provides conditional request headers for requests and ETag headers for responses. + +```typespec +model Azure.Core.Traits.SupportsConditionalRequests +``` + +#### Template Parameters + +| Name | Description | +| ------------- | ------------------------------------------------------------------------------------------------------------------ | +| TVersionAdded | The version when the trait was added to the specification.
Leave this empty if the trait is always supported. | + +### `SupportsRepeatableRequests` {#Azure.Core.Traits.SupportsRepeatableRequests} + +Provides repeatable request headers for requests and responses. + +```typespec +model Azure.Core.Traits.SupportsRepeatableRequests +``` + +#### Template Parameters + +| Name | Description | +| ------------- | ------------------------------------------------------------------------------------------------------------------ | +| TVersionAdded | The version when the trait was added to the specification.
Leave this empty if the trait is always supported. | + +### `TraitOverride` {#Azure.Core.Traits.TraitOverride} + +Used to override a trait. + +```typespec +model Azure.Core.Traits.TraitOverride +``` + +#### Template Parameters + +| Name | Description | +| ----- | ---------------------- | +| Trait | The trait to override. | + +### `VersionParameterTrait` {#Azure.Core.Traits.VersionParameterTrait} + +Declares a version parameter trait. + +```typespec +model Azure.Core.Traits.VersionParameterTrait +``` + +#### Template Parameters + +| Name | Description | +| ----------------- | ---------------------------------- | +| TVersionParameter | The type of the version parameter. | + +### `TraitContext` {#Azure.Core.Traits.TraitContext} + +Enumerates the standard trait contexts for Azure.Core operations. + +```typespec +enum Azure.Core.Traits.TraitContext +``` + +### `TraitLocation` {#Azure.Core.Traits.TraitLocation} + +Enumerates the standard trait locations for Azure.Core operations. + +```typespec +enum Azure.Core.Traits.TraitLocation +``` diff --git a/docs/libraries/azure-core/reference/decorators.md b/docs/libraries/azure-core/reference/decorators.md new file mode 100644 index 0000000000..3dc862576b --- /dev/null +++ b/docs/libraries/azure-core/reference/decorators.md @@ -0,0 +1,439 @@ +--- +title: "Decorators" +toc_min_heading_level: 2 +toc_max_heading_level: 3 +--- + +# Decorators + +## Azure.Core + +### `@finalLocation` {#@Azure.Core.finalLocation} + +Identifies a ModelProperty as containing the final location for the operation result. + +```typespec +@Azure.Core.finalLocation +``` + +#### Target + +`ModelProperty` + +#### Parameters + +None + +### `@finalOperation` {#@Azure.Core.finalOperation} + +Identifies that an operation is the final operation for an LRO. + +```typespec +@Azure.Core.finalOperation(linkedOperation: Operation, parameters?: {}) +``` + +#### Target + +`Operation` + +#### Parameters + +| Name | Type | Description | +| --------------- | ----------- | ------------------------------------------------------------------------------------------------------------------- | +| linkedOperation | `Operation` | The linked Operation | +| parameters | `model {}` | Map of `RequestParameter` and/or `ResponseProperty` that will
be passed to the linked operation request. | + +### `@fixed` {#@Azure.Core.fixed} + +Marks an Enum as being fixed since enums in Azure are +assumed to be extensible. + +```typespec +@Azure.Core.fixed +``` + +#### Target + +`Enum` + +#### Parameters + +None + +### `@items` {#@Azure.Core.items} + +Identifies the ModelProperty that contains the paged items. Can only be used on a Model marked with `@pagedResult`. + +```typespec +@Azure.Core.items +``` + +#### Target + +`ModelProperty` + +#### Parameters + +None + +### `@lroCanceled` {#@Azure.Core.lroCanceled} + +Used for custom StatusMonitor implementation. +Identifies an EnumMember as a long-running "Canceled" terminal state. + +```typespec +@Azure.Core.lroCanceled +``` + +#### Target + +`EnumMember` + +#### Parameters + +None + +### `@lroErrorResult` {#@Azure.Core.lroErrorResult} + +Used for custom StatusMonitor implementation. +Identifies a model property of a StatusMonitor as containing the result +of a long-running operation that terminates unsuccessfully (Failed). + +```typespec +@Azure.Core.lroErrorResult +``` + +#### Target + +`ModelProperty` + +#### Parameters + +None + +### `@lroFailed` {#@Azure.Core.lroFailed} + +Used for custom StatusMonitor implementation. +Identifies an enum member as a long-running "Failed" terminal state. + +```typespec +@Azure.Core.lroFailed +``` + +#### Target + +`EnumMember` + +#### Parameters + +None + +### `@lroResult` {#@Azure.Core.lroResult} + +Used for custom StatusMonitor implementation. +Identifies a model property of a StatusMonitor as containing the result +of a long-running operation that terminates successfully (Succeeded). + +```typespec +@Azure.Core.lroResult +``` + +#### Target + +`ModelProperty` + +#### Parameters + +None + +### `@lroStatus` {#@Azure.Core.lroStatus} + +Used for custom StatusMonitor implementation. +Identifies an Enum or ModelProperty as containing long-running operation +status. + +```typespec +@Azure.Core.lroStatus +``` + +#### Target + +`union Enum | ModelProperty` + +#### Parameters + +None + +### `@lroSucceeded` {#@Azure.Core.lroSucceeded} + +Used for custom StatusMonitor implementation. +Identifies an EnumMember as a long-running "Succeeded" terminal state. + +```typespec +@Azure.Core.lroSucceeded +``` + +#### Target + +`EnumMember` + +#### Parameters + +None + +### `@nextLink` {#@Azure.Core.nextLink} + +Identifies a ModelProperty that contains the next link value. Can only be used on a Model marked with `@pagedResult`. + +```typespec +@Azure.Core.nextLink +``` + +#### Target + +`ModelProperty` + +#### Parameters + +None + +### `@nextPageOperation` {#@Azure.Core.nextPageOperation} + +Identifies that an operation is used to retrieve the next page for paged operations. + +```typespec +@Azure.Core.nextPageOperation(linkedOperation: Operation, parameters?: {}) +``` + +#### Target + +`Operation` + +#### Parameters + +| Name | Type | Description | +| --------------- | ----------- | ------------------------------------------------------------------------------------------------------------------- | +| linkedOperation | `Operation` | The linked Operation | +| parameters | `model {}` | Map of `RequestParameter` and/or `ResponseProperty` that will
be passed to the linked operation request. | + +### `@operationLink` {#@Azure.Core.operationLink} + +Identifies an operation that is linked to the target operation. + +```typespec +@Azure.Core.operationLink(linkedOperation: Operation, linkType: valueof string, parameters?: {}) +``` + +#### Target + +`Operation` + +#### Parameters + +| Name | Type | Description | +| --------------- | ----------------------- | ------------------------------------------------------------------------------------------------------------------- | +| linkedOperation | `Operation` | The linked Operation | +| linkType | `valueof scalar string` | A string indicating the role of the linked operation | +| parameters | `model {}` | Map of `RequestParameter` and/or `ResponseProperty` that will
be passed to the linked operation request. | + +### `@pagedResult` {#@Azure.Core.pagedResult} + +Marks a Model as a paged collection. + +```typespec +@Azure.Core.pagedResult +``` + +#### Target + +`Model` + +#### Parameters + +None + +### `@pollingLocation` {#@Azure.Core.pollingLocation} + +Identifies a model property as containing the location to poll for operation state. + +```typespec +@Azure.Core.pollingLocation +``` + +#### Target + +`ModelProperty` + +#### Parameters + +None + +### `@pollingOperation` {#@Azure.Core.pollingOperation} + +Identifies that an operation is a polling operation for an LRO. + +```typespec +@Azure.Core.pollingOperation(linkedOperation: Operation, parameters?: {}) +``` + +#### Target + +`Operation` + +#### Parameters + +| Name | Type | Description | +| --------------- | ----------- | ------------------------------------------------------------------------------------------------------------------- | +| linkedOperation | `Operation` | The linked Operation | +| parameters | `model {}` | Map of `RequestParameter` and/or `ResponseProperty` that will
be passed to the linked operation request. | + +### `@pollingOperationParameter` {#@Azure.Core.pollingOperationParameter} + +Used to define how to call custom polling operations for long-running operations. + +```typespec +@Azure.Core.pollingOperationParameter(targetParameter?: ModelProperty | string) +``` + +#### Target + +`ModelProperty` + +#### Parameters + +| Name | Type | Description | +| --------------- | ------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| targetParameter | `union ModelProperty \| string` | A reference to the polling operation parameter this parameter
provides a value for, or the name of that parameter. The default value is the name of
the decorated parameter or property. | + +## Azure.Core.Foundations + +### `@omitKeyProperties` {#@Azure.Core.Foundations.omitKeyProperties} + +Deletes any key properties from the model. + +```typespec +@Azure.Core.Foundations.omitKeyProperties +``` + +#### Target + +`Model` + +#### Parameters + +None + +### `@requestParameter` {#@Azure.Core.Foundations.requestParameter} + +Identifies a property on a request model that serves as a linked operation parameter. + +```typespec +@Azure.Core.Foundations.requestParameter(name: valueof string) +``` + +#### Target + +`Model` + +#### Parameters + +| Name | Type | Description | +| ---- | ----------------------- | --------------------------- | +| name | `valueof scalar string` | Property name on the target | + +### `@responseProperty` {#@Azure.Core.Foundations.responseProperty} + +Identifies a property on _all_ non-error response models that serve as a linked operation parameter. + +```typespec +@Azure.Core.Foundations.responseProperty(name: valueof string) +``` + +#### Target + +`Model` + +#### Parameters + +| Name | Type | Description | +| ---- | ----------------------- | --------------------------- | +| name | `valueof scalar string` | Property name on the target | + +## Azure.Core.Traits + +### `@trait` {#@Azure.Core.Traits.trait} + +`@trait` marks a model type as representing a 'trait' and performs basic validation +checks. + +```typespec +@Azure.Core.Traits.trait(traitName?: valueof string) +``` + +#### Target + +The model type to mark as a trait. +`(intrinsic) unknown` + +#### Parameters + +| Name | Type | Description | +| --------- | ----------------------- | -------------------------------------------------------------------------------------------------- | +| traitName | `valueof scalar string` | An optional name to uniquely identify the trait. If unspecified,
the model type name is used. | + +### `@traitAdded` {#@Azure.Core.Traits.traitAdded} + +Sets the version for when the trait was added to the specification. Can be applied +to either a trait model type or its envelope property. + +```typespec +@Azure.Core.Traits.traitAdded(addedVersion: EnumMember | null) +``` + +#### Target + +`union Model | ModelProperty` + +#### Parameters + +| Name | Type | Description | +| ------------ | -------------------------- | ------------------------------------------------- | +| addedVersion | `union EnumMember \| null` | The enum member representing the service version. | + +### `@traitContext` {#@Azure.Core.Traits.traitContext} + +`@traitContext` sets the applicable context for a trait on its envelope property. + +```typespec +@Azure.Core.Traits.traitContext(contexts: EnumMember | Union | unknown) +``` + +#### Target + +The trait envelope property where the context will be applied. +`ModelProperty` + +#### Parameters + +| Name | Type | Description | +| -------- | -------------------------------------- | ------------------------------------------------------------------------------------------ | +| contexts | `union EnumMember \| Union \| unknown` | An enum member or union of enum members representing the trait's
applicable contexts. | + +### `@traitLocation` {#@Azure.Core.Traits.traitLocation} + +`@traitLocation` sets the applicable location for a trait on its envelope property. + +```typespec +@Azure.Core.Traits.traitLocation(contexts: EnumMember) +``` + +#### Target + +The trait envelope property where the context will be applied. +`ModelProperty` + +#### Parameters + +| Name | Type | Description | +| -------- | ------------ | ------------------------------------------------------------------------------------------ | +| contexts | `EnumMember` | An enum member or union of enum members representing the trait's
applicable contexts. | diff --git a/docs/libraries/azure-core/reference/index.mdx b/docs/libraries/azure-core/reference/index.mdx new file mode 100644 index 0000000000..ad9d93cd80 --- /dev/null +++ b/docs/libraries/azure-core/reference/index.mdx @@ -0,0 +1,174 @@ +--- +title: Overview +sidebar_position: 0 +toc_min_heading_level: 2 +toc_max_heading_level: 3 +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Overview + +TypeSpec Azure Core library + +## Install + + + + +```bash +npm install @azure-tools/typespec-azure-core +``` + + + + +```bash +npm install --save-peer @azure-tools/typespec-azure-core +``` + + + + +## Azure + +## Azure.Core + +### Decorators + +- [`@finalLocation`](./decorators.md#@Azure.Core.finalLocation) +- [`@finalOperation`](./decorators.md#@Azure.Core.finalOperation) +- [`@fixed`](./decorators.md#@Azure.Core.fixed) +- [`@items`](./decorators.md#@Azure.Core.items) +- [`@lroCanceled`](./decorators.md#@Azure.Core.lroCanceled) +- [`@lroErrorResult`](./decorators.md#@Azure.Core.lroErrorResult) +- [`@lroFailed`](./decorators.md#@Azure.Core.lroFailed) +- [`@lroResult`](./decorators.md#@Azure.Core.lroResult) +- [`@lroStatus`](./decorators.md#@Azure.Core.lroStatus) +- [`@lroSucceeded`](./decorators.md#@Azure.Core.lroSucceeded) +- [`@nextLink`](./decorators.md#@Azure.Core.nextLink) +- [`@nextPageOperation`](./decorators.md#@Azure.Core.nextPageOperation) +- [`@operationLink`](./decorators.md#@Azure.Core.operationLink) +- [`@pagedResult`](./decorators.md#@Azure.Core.pagedResult) +- [`@pollingLocation`](./decorators.md#@Azure.Core.pollingLocation) +- [`@pollingOperation`](./decorators.md#@Azure.Core.pollingOperation) +- [`@pollingOperationParameter`](./decorators.md#@Azure.Core.pollingOperationParameter) + +### Interfaces + +- [`ResourceOperations`](./interfaces.md#Azure.Core.ResourceOperations) + +### Operations + +- [`GetResourceOperationStatus`](./interfaces.md#Azure.Core.GetResourceOperationStatus) +- [`LongRunningResourceAction`](./interfaces.md#Azure.Core.LongRunningResourceAction) +- [`LongRunningResourceCollectionAction`](./interfaces.md#Azure.Core.LongRunningResourceCollectionAction) +- [`LongRunningResourceCreateOrReplace`](./interfaces.md#Azure.Core.LongRunningResourceCreateOrReplace) +- [`LongRunningResourceCreateOrUpdate`](./interfaces.md#Azure.Core.LongRunningResourceCreateOrUpdate) +- [`LongRunningResourceCreateWithServiceProvidedName`](./interfaces.md#Azure.Core.LongRunningResourceCreateWithServiceProvidedName) +- [`LongRunningResourceDelete`](./interfaces.md#Azure.Core.LongRunningResourceDelete) +- [`LongRunningRpcOperation`](./interfaces.md#Azure.Core.LongRunningRpcOperation) +- [`ResourceAction`](./interfaces.md#Azure.Core.ResourceAction) +- [`ResourceCollectionAction`](./interfaces.md#Azure.Core.ResourceCollectionAction) +- [`ResourceCreateOrReplace`](./interfaces.md#Azure.Core.ResourceCreateOrReplace) +- [`ResourceCreateOrUpdate`](./interfaces.md#Azure.Core.ResourceCreateOrUpdate) +- [`ResourceCreateWithServiceProvidedName`](./interfaces.md#Azure.Core.ResourceCreateWithServiceProvidedName) +- [`ResourceDelete`](./interfaces.md#Azure.Core.ResourceDelete) +- [`ResourceList`](./interfaces.md#Azure.Core.ResourceList) +- [`ResourceRead`](./interfaces.md#Azure.Core.ResourceRead) +- [`ResourceUpdate`](./interfaces.md#Azure.Core.ResourceUpdate) +- [`RpcOperation`](./interfaces.md#Azure.Core.RpcOperation) + +### Models + +- [`AadOauth2Auth`](./data-types.md#Azure.Core.AadOauth2Auth) +- [`AadTokenAuthFlow`](./data-types.md#Azure.Core.AadTokenAuthFlow) +- [`AzureApiKeyAuthentication`](./data-types.md#Azure.Core.AzureApiKeyAuthentication) +- [`ClientRequestIdHeader`](./data-types.md#Azure.Core.ClientRequestIdHeader) +- [`ConditionalRequestHeaders`](./data-types.md#Azure.Core.ConditionalRequestHeaders) +- [`EmbeddingVector`](./data-types.md#Azure.Core.EmbeddingVector) +- [`EtagProperty`](./data-types.md#Azure.Core.EtagProperty) +- [`EtagResponseEnvelope`](./data-types.md#Azure.Core.EtagResponseEnvelope) +- [`ExpandQueryParameter`](./data-types.md#Azure.Core.ExpandQueryParameter) +- [`FilterQueryParameter`](./data-types.md#Azure.Core.FilterQueryParameter) +- [`MaxPageSizeQueryParameter`](./data-types.md#Azure.Core.MaxPageSizeQueryParameter) +- [`OrderByQueryParameter`](./data-types.md#Azure.Core.OrderByQueryParameter) +- [`Page`](./data-types.md#Azure.Core.Page) +- [`RepeatabilityRequestHeaders`](./data-types.md#Azure.Core.RepeatabilityRequestHeaders) +- [`RepeatabilityResponseHeaders`](./data-types.md#Azure.Core.RepeatabilityResponseHeaders) +- [`RequestIdResponseHeader`](./data-types.md#Azure.Core.RequestIdResponseHeader) +- [`RequestParameter`](./data-types.md#Azure.Core.RequestParameter) +- [`ResourceOperationStatus`](./data-types.md#Azure.Core.ResourceOperationStatus) +- [`ResponseProperty`](./data-types.md#Azure.Core.ResponseProperty) +- [`SelectQueryParameter`](./data-types.md#Azure.Core.SelectQueryParameter) +- [`SkipQueryParameter`](./data-types.md#Azure.Core.SkipQueryParameter) +- [`StandardListQueryParameters`](./data-types.md#Azure.Core.StandardListQueryParameters) +- [`TopQueryParameter`](./data-types.md#Azure.Core.TopQueryParameter) + +## Azure.Core.Foundations + +### Decorators + +- [`@omitKeyProperties`](./decorators.md#@Azure.Core.Foundations.omitKeyProperties) +- [`@requestParameter`](./decorators.md#@Azure.Core.Foundations.requestParameter) +- [`@responseProperty`](./decorators.md#@Azure.Core.Foundations.responseProperty) + +### Operations + +- [`GetOperationStatus`](./interfaces.md#Azure.Core.Foundations.GetOperationStatus) +- [`LongRunningOperation`](./interfaces.md#Azure.Core.Foundations.LongRunningOperation) +- [`LongRunningResourceUpdate`](./interfaces.md#Azure.Core.Foundations.LongRunningResourceUpdate) +- [`NonPagedResourceList`](./interfaces.md#Azure.Core.Foundations.NonPagedResourceList) +- [`Operation`](./interfaces.md#Azure.Core.Foundations.Operation) +- [`ResourceCollectionOperation`](./interfaces.md#Azure.Core.Foundations.ResourceCollectionOperation) +- [`ResourceList`](./interfaces.md#Azure.Core.Foundations.ResourceList) +- [`ResourceOperation`](./interfaces.md#Azure.Core.Foundations.ResourceOperation) + +### Models + +- [`ApiVersionParameter`](./data-types.md#Azure.Core.Foundations.ApiVersionParameter) +- [`CollectionKeysOf`](./data-types.md#Azure.Core.Foundations.CollectionKeysOf) +- [`CreateableAndUpdateableProperties`](./data-types.md#Azure.Core.Foundations.CreateableAndUpdateableProperties) +- [`CustomizationFields`](./data-types.md#Azure.Core.Foundations.CustomizationFields) +- [`CustomPage`](./data-types.md#Azure.Core.Foundations.CustomPage) +- [`CustomParameters`](./data-types.md#Azure.Core.Foundations.CustomParameters) +- [`CustomResponseFields`](./data-types.md#Azure.Core.Foundations.CustomResponseFields) +- [`Error`](./data-types.md#Azure.Core.Foundations.Error) +- [`ErrorResponse`](./data-types.md#Azure.Core.Foundations.ErrorResponse) +- [`ErrorResponseBase`](./data-types.md#Azure.Core.Foundations.ErrorResponseBase) +- [`InnerError`](./data-types.md#Azure.Core.Foundations.InnerError) +- [`ItemKeysOf`](./data-types.md#Azure.Core.Foundations.ItemKeysOf) +- [`LocationOfCreatedResourceResponse`](./data-types.md#Azure.Core.Foundations.LocationOfCreatedResourceResponse) +- [`LocationOfCreatedResourceWithServiceProvidedNameResponse`](./data-types.md#Azure.Core.Foundations.LocationOfCreatedResourceWithServiceProvidedNameResponse) +- [`LongRunningStatusLocation`](./data-types.md#Azure.Core.Foundations.LongRunningStatusLocation) +- [`OperationStatus`](./data-types.md#Azure.Core.Foundations.OperationStatus) +- [`ResourceBody`](./data-types.md#Azure.Core.Foundations.ResourceBody) +- [`ResourceCreateOrReplaceModel`](./data-types.md#Azure.Core.Foundations.ResourceCreateOrReplaceModel) +- [`ResourceCreateOrUpdateModel`](./data-types.md#Azure.Core.Foundations.ResourceCreateOrUpdateModel) +- [`ResourceUpdateModel`](./data-types.md#Azure.Core.Foundations.ResourceUpdateModel) +- [`RetryAfterHeader`](./data-types.md#Azure.Core.Foundations.RetryAfterHeader) + +## Azure.Core.Traits + +### Decorators + +- [`@trait`](./decorators.md#@Azure.Core.Traits.trait) +- [`@traitAdded`](./decorators.md#@Azure.Core.Traits.traitAdded) +- [`@traitContext`](./decorators.md#@Azure.Core.Traits.traitContext) +- [`@traitLocation`](./decorators.md#@Azure.Core.Traits.traitLocation) + +### Models + +- [`ListQueryParametersTrait`](./data-types.md#Azure.Core.Traits.ListQueryParametersTrait) +- [`NoClientRequestId`](./data-types.md#Azure.Core.Traits.NoClientRequestId) +- [`NoConditionalRequests`](./data-types.md#Azure.Core.Traits.NoConditionalRequests) +- [`NoRepeatableRequests`](./data-types.md#Azure.Core.Traits.NoRepeatableRequests) +- [`QueryParametersTrait`](./data-types.md#Azure.Core.Traits.QueryParametersTrait) +- [`RequestHeadersTrait`](./data-types.md#Azure.Core.Traits.RequestHeadersTrait) +- [`ResponseHeadersTrait`](./data-types.md#Azure.Core.Traits.ResponseHeadersTrait) +- [`SupportsClientRequestId`](./data-types.md#Azure.Core.Traits.SupportsClientRequestId) +- [`SupportsConditionalRequests`](./data-types.md#Azure.Core.Traits.SupportsConditionalRequests) +- [`SupportsRepeatableRequests`](./data-types.md#Azure.Core.Traits.SupportsRepeatableRequests) +- [`TraitOverride`](./data-types.md#Azure.Core.Traits.TraitOverride) +- [`VersionParameterTrait`](./data-types.md#Azure.Core.Traits.VersionParameterTrait) diff --git a/docs/libraries/azure-core/reference/interfaces.md b/docs/libraries/azure-core/reference/interfaces.md new file mode 100644 index 0000000000..32382e76e8 --- /dev/null +++ b/docs/libraries/azure-core/reference/interfaces.md @@ -0,0 +1,765 @@ +--- +title: "Interfaces and Operations" +toc_min_heading_level: 2 +toc_max_heading_level: 3 +--- + +# Interfaces and Operations + +## Azure.Core + +### `ResourceOperations` {#Azure.Core.ResourceOperations} + +Interface containing common resource operations. + +```typespec +interface Azure.Core.ResourceOperations +``` + +#### Template Parameters + +| Name | Description | +| --------------- | --------------------------------------------------------------------------------------- | +| InterfaceTraits | Traits applicable to the operations. | +| TErrorResponse | Error response of the operations. If not specified, the default error response is used. | + +#### `ResourceOperations.ResourceCreateOrReplace` {#Azure.Core.ResourceOperations.ResourceCreateOrReplace} + +Create or replace operation template. + +```typespec +op Azure.Core.ResourceOperations.ResourceCreateOrReplace(apiVersion: string, resource: TResource): (anonymous model) | (anonymous model) | TErrorResponse +``` + +##### Template Parameters + +| Name | Description | +| --------- | ---------------------------------------------- | +| TResource | Resource type. | +| Traits | Object describing the traits of the operation. | + +#### `ResourceOperations.LongRunningResourceCreateOrReplace` {#Azure.Core.ResourceOperations.LongRunningResourceCreateOrReplace} + +Long-running resource create or replace operation template. + +```typespec +op Azure.Core.ResourceOperations.LongRunningResourceCreateOrReplace(apiVersion: string, resource: TResource): (anonymous model) | (anonymous model) | TErrorResponse +``` + +##### Template Parameters + +| Name | Description | +| --------- | ---------------------------------------------- | +| TResource | Resource type. | +| Traits | Object describing the traits of the operation. | + +#### `ResourceOperations.ResourceCreateOrUpdate` {#Azure.Core.ResourceOperations.ResourceCreateOrUpdate} + +Create or update operation template. + +```typespec +op Azure.Core.ResourceOperations.ResourceCreateOrUpdate(apiVersion: string, contentType: application/merge-patch+json, resource: TResource): (anonymous model) | (anonymous model) | TErrorResponse +``` + +##### Template Parameters + +| Name | Description | +| --------- | ---------------------------------------------- | +| TResource | Resource type. | +| Traits | Object describing the traits of the operation. | + +#### `ResourceOperations.LongRunningResourceCreateOrUpdate` {#Azure.Core.ResourceOperations.LongRunningResourceCreateOrUpdate} + +Long-running resource create or update operation template. + +```typespec +op Azure.Core.ResourceOperations.LongRunningResourceCreateOrUpdate(apiVersion: string, contentType: application/merge-patch+json, resource: TResource): (anonymous model) | (anonymous model) | TErrorResponse +``` + +##### Template Parameters + +| Name | Description | +| --------- | ---------------------------------------------- | +| TResource | Resource type. | +| Traits | Object describing the traits of the operation. | + +#### `ResourceOperations.ResourceUpdate` {#Azure.Core.ResourceOperations.ResourceUpdate} + +Resource update operation template. + +```typespec +op Azure.Core.ResourceOperations.ResourceUpdate(apiVersion: string, contentType: application/merge-patch+json, resource: TResource): (anonymous model) | TErrorResponse +``` + +##### Template Parameters + +| Name | Description | +| --------- | ---------------------------------------------- | +| TResource | Resource type. | +| Traits | Object describing the traits of the operation. | + +#### `ResourceOperations.ResourceCreateWithServiceProvidedName` {#Azure.Core.ResourceOperations.ResourceCreateWithServiceProvidedName} + +Resource create with service-provided name operation template. + +```typespec +op Azure.Core.ResourceOperations.ResourceCreateWithServiceProvidedName(apiVersion: string, resource: TResource): Azure.Core.(anonymous model) | TErrorResponse +``` + +##### Template Parameters + +| Name | Description | +| --------- | ---------------------------------------------- | +| TResource | Resource type. | +| Traits | Object describing the traits of the operation. | + +#### `ResourceOperations.LongRunningResourceCreateWithServiceProvidedName` {#Azure.Core.ResourceOperations.LongRunningResourceCreateWithServiceProvidedName} + +Long-running resource create with service-provided name operation template. + +```typespec +op Azure.Core.ResourceOperations.LongRunningResourceCreateWithServiceProvidedName(apiVersion: string, resource: TResource): Azure.Core.(anonymous model) | TErrorResponse +``` + +##### Template Parameters + +| Name | Description | +| --------- | ---------------------------------------------- | +| TResource | Resource type. | +| Traits | Object describing the traits of the operation. | + +#### `ResourceOperations.ResourceRead` {#Azure.Core.ResourceOperations.ResourceRead} + +Resource read operation template. + +```typespec +op Azure.Core.ResourceOperations.ResourceRead(apiVersion: string): {} | TErrorResponse +``` + +##### Template Parameters + +| Name | Description | +| --------- | ---------------------------------------------- | +| TResource | Resource type. | +| Traits | Object describing the traits of the operation. | + +#### `ResourceOperations.ResourceDelete` {#Azure.Core.ResourceOperations.ResourceDelete} + +Resource delete operation template. + +```typespec +op Azure.Core.ResourceOperations.ResourceDelete(apiVersion: string): Azure.Core.(anonymous model) | TErrorResponse +``` + +##### Template Parameters + +| Name | Description | +| --------- | ---------------------------------------------- | +| TResource | Resource type. | +| Traits | Object describing the traits of the operation. | + +#### `ResourceOperations.LongRunningResourceDelete` {#Azure.Core.ResourceOperations.LongRunningResourceDelete} + +Long-running resource delete operation template. + +```typespec +op Azure.Core.ResourceOperations.LongRunningResourceDelete(apiVersion: string): (anonymous model) | TErrorResponse +``` + +##### Template Parameters + +| Name | Description | +| --------- | ---------------------------------------------- | +| TResource | Resource type. | +| Traits | Object describing the traits of the operation. | + +#### `ResourceOperations.ResourceList` {#Azure.Core.ResourceOperations.ResourceList} + +Resource list operation template. + +```typespec +op Azure.Core.ResourceOperations.ResourceList(apiVersion: string): Azure.Core.Foundations.CustomPage | TErrorResponse +``` + +##### Template Parameters + +| Name | Description | +| --------- | ---------------------------------------------- | +| TResource | Resource type. | +| Traits | Object describing the traits of the operation. | + +#### `ResourceOperations.ResourceAction` {#Azure.Core.ResourceOperations.ResourceAction} + +Resource action operation template. + +```typespec +op Azure.Core.ResourceOperations.ResourceAction(apiVersion: string): {} | TErrorResponse +``` + +##### Template Parameters + +| Name | Description | +| --------- | -------------------------------------------------- | +| TResource | Resource type. | +| TParams | Object describing the parameters of the operation. | +| TResponse | Object describing the response of the operation. | +| Traits | Object describing the traits of the operation. | + +#### `ResourceOperations.ResourceCollectionAction` {#Azure.Core.ResourceOperations.ResourceCollectionAction} + +Resource collection action operation template. + +```typespec +op Azure.Core.ResourceOperations.ResourceCollectionAction(apiVersion: string): {} | TErrorResponse +``` + +##### Template Parameters + +| Name | Description | +| --------- | -------------------------------------------------- | +| TResource | Resource type. | +| TParams | Object describing the parameters of the operation. | +| TResponse | Object describing the response of the operation. | +| Traits | Object describing the traits of the operation. | + +#### `ResourceOperations.LongRunningResourceAction` {#Azure.Core.ResourceOperations.LongRunningResourceAction} + +Long-running resource action operation template. + +```typespec +op Azure.Core.ResourceOperations.LongRunningResourceAction(apiVersion: string): Azure.Core.(anonymous model) | TErrorResponse +``` + +##### Template Parameters + +| Name | Description | +| ------------- | ----------------------------------------------------- | +| TResource | Resource type. | +| TParams | Object describing the parameters of the operation. | +| TStatusResult | Object describing the status result of the operation. | +| TStatusError | Object describing the status error of the operation. | +| Traits | Object describing the traits of the operation. | + +#### `ResourceOperations.LongRunningResourceCollectionAction` {#Azure.Core.ResourceOperations.LongRunningResourceCollectionAction} + +Long-running resource collection action operation template. + +```typespec +op Azure.Core.ResourceOperations.LongRunningResourceCollectionAction(apiVersion: string): Azure.Core.(anonymous model) | TErrorResponse +``` + +##### Template Parameters + +| Name | Description | +| ------------- | ----------------------------------------------------- | +| TResource | Resource type. | +| TParams | Object describing the parameters of the operation. | +| TStatusResult | Object describing the status result of the operation. | +| TStatusError | Object describing the status error of the operation. | +| Traits | Object describing the traits of the operation. | + +#### `ResourceOperations.GetResourceOperationStatus` {#Azure.Core.ResourceOperations.GetResourceOperationStatus} + +Resource operation status operation template. + +```typespec +op Azure.Core.ResourceOperations.GetResourceOperationStatus(apiVersion: string, operationId: string): Azure.Core.ResourceOperationStatus | TErrorResponse +``` + +##### Template Parameters + +| Name | Description | +| ------------- | ----------------------------------------------------- | +| TResource | Resource type. | +| TStatusResult | Object describing the status result of the operation. | +| TStatusError | Object describing the status error of the operation. | +| Traits | Object describing the traits of the operation. | + +### `GetResourceOperationStatus` {#Azure.Core.GetResourceOperationStatus} + +Operation signature to retrieve a resource operation status. + +```typespec +op Azure.Core.GetResourceOperationStatus(apiVersion: string, operationId: string): Azure.Core.ResourceOperationStatus | Azure.Core.Foundations.ErrorResponse +``` + +#### Template Parameters + +| Name | Description | +| ------------- | ----------------------------------------------------------------------------------------------------- | +| TResource | The type of the resource. | +| TStatusResult | Object describing the result of the status operation. | +| TStatusError | Object describing the error of the status operation. If not provided, the default error type is used. | +| Traits | Traits to apply to the operation. | + +### `LongRunningResourceAction` {#Azure.Core.LongRunningResourceAction} + +DEPRECATED: Use `LongRunningResourceAction` from a `ResourceOperations` interface instance. +This can be done by instantiating your own version with the traits you want `alias Operations = Azure.Core.ResourceOperations;`. +See https://azure.github.io/typespec-azure/docs/getstarted/azure-core/step05#defining-the-operation-interface for details on how to use. + +Long-running operation signature for a resource action. + +```typespec +op Azure.Core.LongRunningResourceAction(apiVersion: string): Azure.Core.(anonymous model) | Azure.Core.Foundations.ErrorResponse +``` + +#### Template Parameters + +| Name | Description | +| ------------- | ----------------------------------------------------------------------------------------------------- | +| TResource | The type of the resource. | +| TParams | Object describing the request parameters. | +| TStatusResult | Object describing the result of the status operation. | +| TStatusError | Object describing the error of the status operation. If not provided, the default error type is used. | +| Traits | Traits to apply to the operation. | + +### `LongRunningResourceCollectionAction` {#Azure.Core.LongRunningResourceCollectionAction} + +DEPRECATED: Use `LongRunningResourceCollectionAction` from a `ResourceOperations` interface instance. +This can be done by instantiating your own version with the traits you want `alias Operations = Azure.Core.ResourceOperations;`. +See https://azure.github.io/typespec-azure/docs/getstarted/azure-core/step05#defining-the-operation-interface for details on how to use. + +Long-running operation signature for an action that applies to a collection of resources. + +```typespec +op Azure.Core.LongRunningResourceCollectionAction(apiVersion: string): Azure.Core.(anonymous model) | Azure.Core.Foundations.ErrorResponse +``` + +#### Template Parameters + +| Name | Description | +| ------------- | ----------------------------------------------------------------------------------------------------- | +| TResource | The type of the resource. | +| TParams | Object describing the request parameters. | +| TStatusResult | Object describing the result of the status operation. | +| TStatusError | Object describing the error of the status operation. If not provided, the default error type is used. | +| Traits | Traits to apply to the operation. | + +### `LongRunningResourceCreateOrReplace` {#Azure.Core.LongRunningResourceCreateOrReplace} + +DEPRECATED: Use `LongRunningResourceCreateOrReplace` from a `ResourceOperations` interface instance. +This can be done by instantiating your own version with the traits you want `alias Operations = Azure.Core.ResourceOperations;`. +See https://azure.github.io/typespec-azure/docs/getstarted/azure-core/step05#defining-the-operation-interface for details on how to use. + +Long-running operation signature to create or replace a resource. + +```typespec +op Azure.Core.LongRunningResourceCreateOrReplace(apiVersion: string, resource: TResource): (anonymous model) | (anonymous model) | Azure.Core.Foundations.ErrorResponse +``` + +#### Template Parameters + +| Name | Description | +| --------- | --------------------------------- | +| TResource | The type of the resource. | +| Traits | Traits to apply to the operation. | + +### `LongRunningResourceCreateOrUpdate` {#Azure.Core.LongRunningResourceCreateOrUpdate} + +DEPRECATED: Use `LongRunningResourceCreateOrUpdate` from a `ResourceOperations` interface instance. +This can be done by instantiating your own version with the traits you want `alias Operations = Azure.Core.ResourceOperations;`. +See https://azure.github.io/typespec-azure/docs/getstarted/azure-core/step05#defining-the-operation-interface for details on how to use. + +Long-running operation signature to create or update a resource. + +```typespec +op Azure.Core.LongRunningResourceCreateOrUpdate(apiVersion: string, contentType: application/merge-patch+json, resource: TResource): (anonymous model) | (anonymous model) | Azure.Core.Foundations.ErrorResponse +``` + +#### Template Parameters + +| Name | Description | +| --------- | --------------------------------- | +| TResource | The type of the resource. | +| Traits | Traits to apply to the operation. | + +### `LongRunningResourceCreateWithServiceProvidedName` {#Azure.Core.LongRunningResourceCreateWithServiceProvidedName} + +DEPRECATED: Use `LongRunningResourceCreateWithServiceProvidedName` from a `ResourceOperations` interface instance. +This can be done by instantiating your own version with the traits you want `alias Operations = Azure.Core.ResourceOperations;`. +See https://azure.github.io/typespec-azure/docs/getstarted/azure-core/step05#defining-the-operation-interface for details on how to use. + +Long-running operation signature to create a resource with a service-provided name. + +```typespec +op Azure.Core.LongRunningResourceCreateWithServiceProvidedName(apiVersion: string, resource: TResource): Azure.Core.(anonymous model) | Azure.Core.Foundations.ErrorResponse +``` + +#### Template Parameters + +| Name | Description | +| --------- | --------------------------------- | +| TResource | The type of the resource. | +| Traits | Traits to apply to the operation. | + +### `LongRunningResourceDelete` {#Azure.Core.LongRunningResourceDelete} + +DEPRECATED: Use `LongRunningResourceDelete` from a `ResourceOperations` interface instance. +This can be done by instantiating your own version with the traits you want `alias Operations = Azure.Core.ResourceOperations;`. +See https://azure.github.io/typespec-azure/docs/getstarted/azure-core/step05#defining-the-operation-interface for details on how to use. + +Long-running operation signature to delete a resource. + +```typespec +op Azure.Core.LongRunningResourceDelete(apiVersion: string): (anonymous model) | Azure.Core.Foundations.ErrorResponse +``` + +#### Template Parameters + +| Name | Description | +| --------- | --------------------------------- | +| TResource | The type of the resource. | +| Traits | Traits to apply to the operation. | + +### `LongRunningRpcOperation` {#Azure.Core.LongRunningRpcOperation} + +A long-running remote procedure call (RPC) operation. + +```typespec +op Azure.Core.LongRunningRpcOperation(apiVersion: string): Azure.Core.(anonymous model) | TErrorResponse +``` + +#### Template Parameters + +| Name | Description | +| -------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| TParams | Object describing the parameters of the operation. | +| TResponse | Object describing the response of the operation. | +| TStatusResult | Object describing the status result of the operation. | +| TStatusError | Error response of the status operation. If not specified, the default error response is used. | +| Traits | Object describing the traits of the operation. | +| TErrorResponse | Error response of the operation. If not specified, the default error response is used. | +| TraitContexts | Trait contexts applicable to the operation. Defaults to `TraitContext.Undefined` which means that only traits that always apply will appear. Can specify multiple using the \| operator. | + +### `ResourceAction` {#Azure.Core.ResourceAction} + +DEPRECATED: Use `ResourceAction` from a `ResourceOperations` interface instance. +This can be done by instantiating your own version with the traits you want `alias Operations = Azure.Core.ResourceOperations;`. +See https://azure.github.io/typespec-azure/docs/getstarted/azure-core/step05#defining-the-operation-interface for details on how to use. + +Operation signature for a resource action. + +```typespec +op Azure.Core.ResourceAction(apiVersion: string): {} | Azure.Core.Foundations.ErrorResponse +``` + +#### Template Parameters + +| Name | Description | +| --------- | ------------------------------------------ | +| TResource | The type of the resource. | +| TParams | Object describing the request parameters. | +| TResponse | Object describing the response parameters. | +| Traits | Traits to apply to the operation. | + +### `ResourceCollectionAction` {#Azure.Core.ResourceCollectionAction} + +DEPRECATED: Use `ResourceCollectionAction` from a `ResourceOperations` interface instance. +This can be done by instantiating your own version with the traits you want `alias Operations = Azure.Core.ResourceOperations;`. +See https://azure.github.io/typespec-azure/docs/getstarted/azure-core/step05#defining-the-operation-interface for details on how to use. + +Operation signature for an action that applies to a collection of resources. + +```typespec +op Azure.Core.ResourceCollectionAction(apiVersion: string): {} | Azure.Core.Foundations.ErrorResponse +``` + +#### Template Parameters + +| Name | Description | +| --------- | ------------------------------------------ | +| TResource | The type of the resource. | +| TParams | Object describing the request parameters. | +| TResponse | Object describing the response parameters. | +| Traits | Traits to apply to the operation. | + +### `ResourceCreateOrReplace` {#Azure.Core.ResourceCreateOrReplace} + +DEPRECATED: Use `ResourceCreateOrReplace` from a `ResourceOperations` interface instance. +This can be done by instantiating your own version with the traits you want `alias Operations = Azure.Core.ResourceOperations;`. +See https://azure.github.io/typespec-azure/docs/getstarted/azure-core/step05#defining-the-operation-interface for details on how to use. + +Operation signature to create or replace a resource. + +```typespec +op Azure.Core.ResourceCreateOrReplace(apiVersion: string, resource: TResource): (anonymous model) | (anonymous model) | Azure.Core.Foundations.ErrorResponse +``` + +#### Template Parameters + +| Name | Description | +| --------- | --------------------------------- | +| TResource | The type of the resource. | +| Traits | Traits to apply to the operation. | + +### `ResourceCreateOrUpdate` {#Azure.Core.ResourceCreateOrUpdate} + +DEPRECATED: Use `ResourceCreateOrUpdate` from a `ResourceOperations` interface instance. +This can be done by instantiating your own version with the traits you want `alias Operations = Azure.Core.ResourceOperations;`. +See https://azure.github.io/typespec-azure/docs/getstarted/azure-core/step05#defining-the-operation-interface for details on how to use. + +Operation signature to create or update a resource. + +```typespec +op Azure.Core.ResourceCreateOrUpdate(apiVersion: string, contentType: application/merge-patch+json, resource: TResource): (anonymous model) | (anonymous model) | Azure.Core.Foundations.ErrorResponse +``` + +#### Template Parameters + +| Name | Description | +| --------- | --------------------------------- | +| TResource | The type of the resource. | +| Traits | Traits to apply to the operation. | + +### `ResourceCreateWithServiceProvidedName` {#Azure.Core.ResourceCreateWithServiceProvidedName} + +DEPRECATED: Use `ResourceCreateWithServiceProvidedName` from a `ResourceOperations` interface instance. +This can be done by instantiating your own version with the traits you want `alias Operations = Azure.Core.ResourceOperations;`. +See https://azure.github.io/typespec-azure/docs/getstarted/azure-core/step05#defining-the-operation-interface for details on how to use. + +Operation signature to synchronously create a resource with a service-provided name. + +```typespec +op Azure.Core.ResourceCreateWithServiceProvidedName(apiVersion: string, resource: TResource): Azure.Core.(anonymous model) | Azure.Core.Foundations.ErrorResponse +``` + +#### Template Parameters + +| Name | Description | +| --------- | --------------------------------- | +| TResource | The type of the resource. | +| Traits | Traits to apply to the operation. | + +### `ResourceDelete` {#Azure.Core.ResourceDelete} + +DEPRECATED: Use `ResourceDelete` from a `ResourceOperations` interface instance. +This can be done by instantiating your own version with the traits you want `alias Operations = Azure.Core.ResourceOperations;`. +See https://azure.github.io/typespec-azure/docs/getstarted/azure-core/step05#defining-the-operation-interface for details on how to use. + +Operation signature to delete a resource. + +```typespec +op Azure.Core.ResourceDelete(apiVersion: string): Azure.Core.(anonymous model) | Azure.Core.Foundations.ErrorResponse +``` + +#### Template Parameters + +| Name | Description | +| --------- | --------------------------------- | +| TResource | The type of the resource. | +| Traits | Traits to apply to the operation. | + +### `ResourceList` {#Azure.Core.ResourceList} + +DEPRECATED: Use `ResourceList` from a `ResourceOperations` interface instance. +This can be done by instantiating your own version with the traits you want `alias Operations = Azure.Core.ResourceOperations;`. +See https://azure.github.io/typespec-azure/docs/getstarted/azure-core/step05#defining-the-operation-interface for details on how to use. + +Operation signature to list resources in a paginated way. + +```typespec +op Azure.Core.ResourceList(apiVersion: string): Azure.Core.Foundations.CustomPage | Azure.Core.Foundations.ErrorResponse +``` + +#### Template Parameters + +| Name | Description | +| --------- | --------------------------------- | +| TResource | The type of the resource. | +| Traits | Traits to apply to the operation. | + +### `ResourceRead` {#Azure.Core.ResourceRead} + +DEPRECATED: Use `ResourceRead` from a `ResourceOperations` interface instance. +This can be done by instantiating your own version with the traits you want `alias Operations = Azure.Core.ResourceOperations;`. +See https://azure.github.io/typespec-azure/docs/getstarted/azure-core/step05#defining-the-operation-interface for details on how to use. + +Operation signature to retrieve a resource. + +```typespec +op Azure.Core.ResourceRead(apiVersion: string): {} | Azure.Core.Foundations.ErrorResponse +``` + +#### Template Parameters + +| Name | Description | +| --------- | --------------------------------- | +| TResource | The type of the resource. | +| Traits | Traits to apply to the operation. | + +### `ResourceUpdate` {#Azure.Core.ResourceUpdate} + +DEPRECATED: Use `ResourceUpdate` from a `ResourceOperations` interface instance. +This can be done by instantiating your own version with the traits you want `alias Operations = Azure.Core.ResourceOperations;`. +See https://azure.github.io/typespec-azure/docs/getstarted/azure-core/step05#defining-the-operation-interface for details on how to use. +Operation signature to update a resource. + +```typespec +op Azure.Core.ResourceUpdate(apiVersion: string, contentType: application/merge-patch+json, resource: TResource): (anonymous model) | Azure.Core.Foundations.ErrorResponse +``` + +#### Template Parameters + +| Name | Description | +| --------- | --------------------------------- | +| TResource | The type of the resource. | +| Traits | Traits to apply to the operation. | + +### `RpcOperation` {#Azure.Core.RpcOperation} + +A remote procedure call (RPC) operation. + +```typespec +op Azure.Core.RpcOperation(apiVersion: string): {} | TErrorResponse +``` + +#### Template Parameters + +| Name | Description | +| -------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| TParams | Object describing the parameters of the operation. | +| TResponse | Object describing the response of the operation. | +| Traits | Object describing the traits of the operation. | +| TErrorResponse | Error response of the operation. If not specified, the default error response is used. | +| TraitContexts | Trait contexts applicable to the operation. Defaults to `TraitContext.Undefined` which means that only traits that always apply will appear. Can specify multiple using the \| operator. | + +## Azure.Core.Foundations + +### `GetOperationStatus` {#Azure.Core.Foundations.GetOperationStatus} + +Operation that returns the status of another operation. + +```typespec +op Azure.Core.Foundations.GetOperationStatus(apiVersion: string, operationId: string): Azure.Core.Foundations.OperationStatus | TErrorResponse +``` + +#### Template Parameters + +| Name | Description | +| -------------- | ---------------------------------------------------------------------------------------------- | +| TParams | Object describing the request parameters of the operation. | +| TStatusResult | The type of the operation status result. | +| TStatusError | The type of the operation status error. | +| Traits | Traits which apply to the operation. | +| TErrorResponse | The type of the error response. If not provided, the default error response type will be used. | + +### `LongRunningOperation` {#Azure.Core.Foundations.LongRunningOperation} + +Long-running operation. + +```typespec +op Azure.Core.Foundations.LongRunningOperation(apiVersion: string): Azure.Core.Foundations.(anonymous model) | TErrorResponse +``` + +#### Template Parameters + +| Name | Description | +| -------------- | -------------------------------------------------------------------------------------------------------------------- | +| TParams | Object describing the request parameters of the operation. | +| TResponse | Object describing the response properties of the operation. If not provided, the AcceptedResponse type will be used. | +| Traits | Traits which apply to the operation. | +| TErrorResponse | The type of the error response. If not provided, the default error response type will be used. | + +### `LongRunningResourceUpdate` {#Azure.Core.Foundations.LongRunningResourceUpdate} + +Long-running operation that updates a resource. + +```typespec +op Azure.Core.Foundations.LongRunningResourceUpdate(apiVersion: string, contentType: application/merge-patch+json, resource: TResource): (anonymous model) | TErrorResponse +``` + +#### Template Parameters + +| Name | Description | +| -------------- | ---------------------------------------------------------------------------------------------- | +| TResource | The type of the resource. | +| Traits | Traits which apply to the operation. | +| TErrorResponse | The type of the error response. If not provided, the default error response type will be used. | + +### `NonPagedResourceList` {#Azure.Core.Foundations.NonPagedResourceList} + +Operation that lists resources in a non-paginated way. + +```typespec +op Azure.Core.Foundations.NonPagedResourceList(apiVersion: string): Azure.Core.Foundations.(anonymous model) | TErrorResponse +``` + +#### Template Parameters + +| Name | Description | +| -------------- | ---------------------------------------------------------------------------------------------- | +| TResource | The type of the resource. | +| Traits | Traits which apply to the operation. | +| TErrorResponse | The type of the error response. If not provided, the default error response type will be used. | + +### `Operation` {#Azure.Core.Foundations.Operation} + +The most basic operation. + +```typespec +op Azure.Core.Foundations.Operation(apiVersion: string): TResponse | TErrorResponse +``` + +#### Template Parameters + +| Name | Description | +| -------------- | ---------------------------------------------------------------------------------------------- | +| TParams | Object describing the request parameters of the operation. | +| TResponse | Object describing the response properties of the operation. | +| Traits | Traits which apply to the operation. | +| TErrorResponse | The type of the error response. If not provided, the default error response type will be used. | + +### `ResourceCollectionOperation` {#Azure.Core.Foundations.ResourceCollectionOperation} + +Operation that applies to a collection of resources. + +```typespec +op Azure.Core.Foundations.ResourceCollectionOperation(apiVersion: string): TResponse | TErrorResponse +``` + +#### Template Parameters + +| Name | Description | +| -------------- | ---------------------------------------------------------------------------------------------- | +| TResource | The type of the resource. | +| TParams | Object describing the request parameters of the operation. | +| TResponse | Object describing the response properties of the operation. | +| Traits | Traits which apply to the operation. | +| TErrorResponse | The type of the error response. If not provided, the default error response type will be used. | + +### `ResourceList` {#Azure.Core.Foundations.ResourceList} + +Operation that lists resources in a paginated way. + +```typespec +op Azure.Core.Foundations.ResourceList(apiVersion: string): TResponse | TErrorResponse +``` + +#### Template Parameters + +| Name | Description | +| -------------- | ---------------------------------------------------------------------------------------------- | +| TResource | The type of the resource. | +| TParams | Object describing the request parameters of the operation. | +| TResponse | Object describing the response properties of the operation. | +| Traits | Traits which apply to the operation. | +| TErrorResponse | The type of the error response. If not provided, the default error response type will be used. | + +### `ResourceOperation` {#Azure.Core.Foundations.ResourceOperation} + +The most basic operation that applies to a resource. + +```typespec +op Azure.Core.Foundations.ResourceOperation(apiVersion: string): TResponse | TErrorResponse +``` + +#### Template Parameters + +| Name | Description | +| -------------- | ---------------------------------------------------------------------------------------------- | +| TResource | The type of the resource. | +| TParams | Object describing the request parameters of the operation. | +| TResponse | Object describing the response properties of the operation. | +| Traits | Traits which apply to the operation. | +| TErrorResponse | The type of the error response. If not provided, the default error response type will be used. | diff --git a/docs/libraries/azure-core/reference/linter.md b/docs/libraries/azure-core/reference/linter.md new file mode 100644 index 0000000000..f735a82fb2 --- /dev/null +++ b/docs/libraries/azure-core/reference/linter.md @@ -0,0 +1,61 @@ +--- +title: "Linter usage" +toc_min_heading_level: 2 +toc_max_heading_level: 3 +--- + +# Linter + +## Usage + +Add the following in `tspconfig.yaml`: + +```yaml +linter: + extends: + - "@azure-tools/typespec-azure-core/all" +``` + +## RuleSets + +Available ruleSets: + +- [`@azure-tools/typespec-azure-core/all`](#@azure-tools/typespec-azure-core/all) + +## Rules + +| Name | Description | +| -------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- | +| `@azure-tools/typespec-azure-core/operation-missing-api-version` | Operations need an api version parameter. | +| `@azure-tools/typespec-azure-core/auth-required` | Enforce service authentication. | +| `@azure-tools/typespec-azure-core/no-operation-id` | Operation ID is automatically generated by the OpenAPI emitters and should not normally be specified. | +| `@azure-tools/typespec-azure-core/request-body-problem` | Request body should not be of raw array type. | +| `@azure-tools/typespec-azure-core/byos` | Use the BYOS pattern recommended for Azure Services. | +| `@azure-tools/typespec-azure-core/casing-style` | Ensure proper casing style. | +| `@azure-tools/typespec-azure-core/spread-discriminated-model` | Check a model with a discriminator has not been used in composition. | +| `@azure-tools/typespec-azure-core/composition-over-inheritance` | Check that if a model is used in an operation and has derived models that it has a discriminator or recommend to use composition via spread or `is`. | +| `@azure-tools/typespec-azure-core/prefer-csv-collection-format` | It is recommended to use "csv" for collection format of parameters. | +| `@azure-tools/typespec-azure-core/use-extensible-enum` | Enums should be extensible. | +| `@azure-tools/typespec-azure-core/known-encoding` | Check for supported encodings. | +| `@azure-tools/typespec-azure-core/use-standard-operations` | Operations should be defined using a signature from the Azure.Core namespace. | +| [`@azure-tools/typespec-azure-core/no-closed-literal-union`](/libraries/azure-core/rules/no-closed-literal-union.md) | Unions of literals should include the base scalar type to mark them as open enum. | +| [`@azure-tools/typespec-azure-core/no-enum`](/libraries/azure-core/rules/no-enum.md) | Azure services should not use enums. | +| `@azure-tools/typespec-azure-core/no-error-status-codes` | Recommend using the error response defined by Azure REST API guidelines. | +| `@azure-tools/typespec-azure-core/no-fixed-enum-discriminator` | Discriminator shouldn't be a fixed enum. | +| `@azure-tools/typespec-azure-core/no-nullable` | Use `?` for optional properties. | +| `@azure-tools/typespec-azure-core/no-offsetdatetime` | Prefer using `utcDateTime` when representing a datetime unless an offset is necessary. | +| `@azure-tools/typespec-azure-core/no-rpc-path-params` | Operations defined using RpcOperation should not have path parameters. | +| `@azure-tools/typespec-azure-core/no-explicit-routes-resource-ops` | The @route decorator should not be used on standard resource operation signatures. | +| `@azure-tools/typespec-azure-core/no-response-body` | Ensure that the body is set correctly for the response type. | +| `@azure-tools/typespec-azure-core/no-format` | Azure services should not use the `@format` decorator. | +| `@azure-tools/typespec-azure-core/no-multiple-discriminator` | Classes should have at most one discriminator. | +| `@azure-tools/typespec-azure-core/no-rest-library-interfaces` | Resource interfaces from the TypeSpec.Rest.Resource library are incompatible with Azure.Core. | +| `@azure-tools/typespec-azure-core/no-unknown` | Azure services must not have properties of type `unknown`. | +| `@azure-tools/typespec-azure-core/bad-record-type` | Identify bad record definitions. | +| `@azure-tools/typespec-azure-core/response-schema-problem` | Warn about operations having multiple non-error response schemas. | +| `@azure-tools/typespec-azure-core/property-name-conflict` | Avoid naming conflicts. | +| `@azure-tools/typespec-azure-core/rpc-operation-request-body` | Warning for RPC body problems. | +| `@azure-tools/typespec-azure-core/documentation-required` | Require documentation over enums, models, and operations. | +| `@azure-tools/typespec-azure-core/key-visibility-required` | Key properties need to have an explicit visibility setting. | +| `@azure-tools/typespec-azure-core/long-running-polling-operation-required` | Long-running operations should have a linked polling operation. | +| `@azure-tools/typespec-azure-core/use-standard-names` | Use recommended names for operations. | diff --git a/docs/libraries/azure-core/rules/no-closed-literal-union.md b/docs/libraries/azure-core/rules/no-closed-literal-union.md new file mode 100644 index 0000000000..fff091a82e --- /dev/null +++ b/docs/libraries/azure-core/rules/no-closed-literal-union.md @@ -0,0 +1,41 @@ +--- +title: "no-closed-literal-union" +--- + +```text title="Full name" +@azure-tools/typespec-azure-core/no-closed-literal-union +``` + +Azure services favor extensible enums to avoid breaking changes as new enum values are added. When using a union of only string or numeric literals it is the equivalent to a closed enum. +Adding the base scalar(`string`, `int32`, `int64`, etc.) as a variant to the union makes it extensible. + +#### ❌ Incorrect + +```tsp +union PetKind { + Cat: "cat", + Dog: "dog", +} +``` + +```tsp +model Pet { + kind: "cat" | "dog"; +} +``` + +#### ✅ Correct + +```tsp +union PetKind { + Cat: "Cat", + Dog: "Dog", + string, +} +``` + +```tsp +model Pet { + kind: "cat" | "dog" | string; +} +``` diff --git a/docs/libraries/azure-core/rules/no-enum.md b/docs/libraries/azure-core/rules/no-enum.md new file mode 100644 index 0000000000..85937edeaa --- /dev/null +++ b/docs/libraries/azure-core/rules/no-enum.md @@ -0,0 +1,29 @@ +--- +title: "no-enum" +--- + +```text title="Full name" +@azure-tools/typespec-azure-core/no-enum +``` + +Azure services favor extensible enums to avoid breaking changes as new enum values are added. TypeSpec enums are closed. +Using a union with the base scalar(`string`, `int32`, `int64`, etc.) as a variant instead of an enum makes it extensible. + +#### ❌ Incorrect + +```tsp +enum PetKind { + Cat, + Dog, +} +``` + +#### ✅ Correct + +```tsp +union PetKind { + Cat: "Cat", + Dog: "Dog", + string, +} +``` diff --git a/docs/libraries/azure-resource-manager/reference/data-types.md b/docs/libraries/azure-resource-manager/reference/data-types.md new file mode 100644 index 0000000000..6348831357 --- /dev/null +++ b/docs/libraries/azure-resource-manager/reference/data-types.md @@ -0,0 +1,1105 @@ +--- +title: "Data types" +toc_min_heading_level: 2 +toc_max_heading_level: 3 +--- + +# Data types + +## Azure.ResourceManager + +### `ApiVersionParameter` {#Azure.ResourceManager.ApiVersionParameter} + +The default api-version parameter type. + +```typespec +model Azure.ResourceManager.ApiVersionParameter +``` + +### `ArmAcceptedLroResponse` {#Azure.ResourceManager.ArmAcceptedLroResponse} + +The standard ARM response for asynchronous PATCH, POST, and DELETE operations + +```typespec +model Azure.ResourceManager.ArmAcceptedLroResponse +``` + +#### Template Parameters + +| Name | Description | +| -------- | ---------------------------------------------------------------------------------- | +| TMessage | The description of the response status (defaults to `Resource operation accepted`) | + +### `ArmAcceptedResponse` {#Azure.ResourceManager.ArmAcceptedResponse} + +The standard ACCEPTED response + +```typespec +model Azure.ResourceManager.ArmAcceptedResponse +``` + +#### Template Parameters + +| Name | Description | +| -------- | ---------------------------------------------------------------------------------- | +| TMessage | The description of the response status (defaults to `Resource operation accepted`) | + +### `ArmCreatedResponse` {#Azure.ResourceManager.ArmCreatedResponse} + +The ARM 201 response for a resource + +```typespec +model Azure.ResourceManager.ArmCreatedResponse +``` + +#### Template Parameters + +| Name | Description | +| ---- | --------------------------------- | +| T | The contents of the response body | + +### `ArmDeleteAcceptedLroResponse` {#Azure.ResourceManager.ArmDeleteAcceptedLroResponse} + +```typespec +model Azure.ResourceManager.ArmDeleteAcceptedLroResponse +``` + +### `ArmDeleteAcceptedResponse` {#Azure.ResourceManager.ArmDeleteAcceptedResponse} + +```typespec +model Azure.ResourceManager.ArmDeleteAcceptedResponse +``` + +### `ArmDeletedNoContentResponse` {#Azure.ResourceManager.ArmDeletedNoContentResponse} + +```typespec +model Azure.ResourceManager.ArmDeletedNoContentResponse +``` + +### `ArmDeletedResponse` {#Azure.ResourceManager.ArmDeletedResponse} + +The response for synchronous delete of a resource + +```typespec +model Azure.ResourceManager.ArmDeletedResponse +``` + +### `ArmNoContentResponse` {#Azure.ResourceManager.ArmNoContentResponse} + +Standard ARM NoContent (204) response + +```typespec +model Azure.ResourceManager.ArmNoContentResponse +``` + +#### Template Parameters + +| Name | Description | +| -------- | --------------------------------------------------------------------------------------- | +| TMessage | The description of the response status (defaults to `Operation completed successfully`) | + +### `ArmResourceCreatedResponse` {#Azure.ResourceManager.ArmResourceCreatedResponse} + +Resource create operation succeeded + +```typespec +model Azure.ResourceManager.ArmResourceCreatedResponse +``` + +#### Template Parameters + +| Name | Description | +| --------- | -------------------------- | +| TResource | The resource being updated | + +### `ArmResourceCreatedSyncResponse` {#Azure.ResourceManager.ArmResourceCreatedSyncResponse} + +Resource synchronous create operation succeeded + +```typespec +model Azure.ResourceManager.ArmResourceCreatedSyncResponse +``` + +#### Template Parameters + +| Name | Description | +| --------- | -------------------------- | +| TResource | The resource being updated | + +### `ArmResourceUpdatedResponse` {#Azure.ResourceManager.ArmResourceUpdatedResponse} + +Resource update operation succeeded + +```typespec +model Azure.ResourceManager.ArmResourceUpdatedResponse +``` + +#### Template Parameters + +| Name | Description | +| --------- | -------------------------- | +| TResource | The resource being updated | + +### `ArmResponse` {#Azure.ResourceManager.ArmResponse} + +The ARM synchronous OK response + +```typespec +model Azure.ResourceManager.ArmResponse +``` + +#### Template Parameters + +| Name | Description | +| ---- | --------------------------------- | +| T | The contents of the response body | + +### `CustomerManagedKeyEncryption` {#Azure.ResourceManager.CustomerManagedKeyEncryption} + +Customer-managed key encryption properties for the resource. + +```typespec +model Azure.ResourceManager.CustomerManagedKeyEncryption +``` + +### `DefaultProvisioningStateProperty` {#Azure.ResourceManager.DefaultProvisioningStateProperty} + +Standard resource provisioning state model. If you do not have any custom provisioning state, +you can spread this model directly into your resource property model. + +```typespec +model Azure.ResourceManager.DefaultProvisioningStateProperty +``` + +#### Examples + +```typespec +model FooProperties { + // Only have standard Succeeded, Failed, Cancelled states + ...DefaultProvisioningStateProperty; +} +``` + +### `Encryption` {#Azure.ResourceManager.Encryption} + +Model used only to spread in the `encryption` envelope property for a resource. + +```typespec +model Azure.ResourceManager.Encryption +``` + +#### Examples + +```typespec +model Foo is TrackedResource { + ...Encryption; +} +``` + +### `EncryptionConfiguration` {#Azure.ResourceManager.EncryptionConfiguration} + +All encryption configuration for a resource. + +```typespec +model Azure.ResourceManager.EncryptionConfiguration +``` + +### `EntityTag` {#Azure.ResourceManager.EntityTag} + +Model used only to spread in the standard `eTag` envelope property for a resource + +```typespec +model Azure.ResourceManager.EntityTag +``` + +#### Examples + +```typespec +model Foo is TrackedResource { + // Only have standard Succeeded, Failed, Cancelled states + ...EntityTag; +} +``` + +### `ErrorResponse` {#Azure.ResourceManager.ErrorResponse} + +The standard ARM error response + +```typespec +model Azure.ResourceManager.ErrorResponse +``` + +### `ExtensionResource` {#Azure.ResourceManager.ExtensionResource} + +Concrete extension resource types can be created by aliasing this type using a specific property type. + +See more details on [different ARM resource type here.](https://azure.github.io/typespec-azure/docs/howtos/ARM/resource-type) + +```typespec +model Azure.ResourceManager.ExtensionResource +``` + +#### Template Parameters + +| Name | Description | +| ----------- | --------------------------------------------------------------------- | +| TProperties | A model containing the provider-specific properties for this resource | + +### `KeysOf` {#Azure.ResourceManager.KeysOf} + +Extracts the key (path) parameters from a resource and its parents + +```typespec +model Azure.ResourceManager.KeysOf +``` + +#### Template Parameters + +| Name | Description | +| --------- | --------------------------------------- | +| TResource | The resource to extract properties from | + +### `LocationParameter` {#Azure.ResourceManager.LocationParameter} + +The default location parameter type. + +```typespec +model Azure.ResourceManager.LocationParameter +``` + +### `ManagedBy` {#Azure.ResourceManager.ManagedBy} + +Model used only to spread in the standard `managedBy` envelope property for a resource + +```typespec +model Azure.ResourceManager.ManagedBy +``` + +#### Examples + +```typespec +model Foo is TrackedResource { + // Only have standard Succeeded, Failed, Cancelled states + ...ManagedBy; +} +``` + +### `ManagedServiceIdentity` {#Azure.ResourceManager.ManagedServiceIdentity} + +Standard ARM definition of ManagedServiceIdentity + +```typespec +model Azure.ResourceManager.ManagedServiceIdentity +``` + +### `ManagedSystemAssignedIdentity` {#Azure.ResourceManager.ManagedSystemAssignedIdentity} + +Standard ARM definition of ManagedServiceIdentity for services +that only support system-defined identities + +```typespec +model Azure.ResourceManager.ManagedSystemAssignedIdentity +``` + +### `ParentKeysOf` {#Azure.ResourceManager.ParentKeysOf} + +Extracts the key (path) parameters from the parent(s) of the given resource + +```typespec +model Azure.ResourceManager.ParentKeysOf +``` + +#### Template Parameters + +| Name | Description | +| --------- | --------------------------------------- | +| TResource | The resource to extract properties from | + +### `PrivateEndpoint` {#Azure.ResourceManager.PrivateEndpoint} + +The private endpoint resource + +```typespec +model Azure.ResourceManager.PrivateEndpoint +``` + +### `PrivateEndpointConnection` {#Azure.ResourceManager.PrivateEndpointConnection} + +The private endpoint connection resource + +```typespec +model Azure.ResourceManager.PrivateEndpointConnection +``` + +### `PrivateEndpointConnectionParameter` {#Azure.ResourceManager.PrivateEndpointConnectionParameter} + +The name of the private endpoint connection associated with the Azure resource. + +```typespec +model Azure.ResourceManager.PrivateEndpointConnectionParameter +``` + +#### Template Parameters + +| Name | Description | +| -------- | ----------------------------------------------------------------------------------------------- | +| TSegment | The resource type name for private endpoint connections (default is privateEndpointConnections) | + +### `PrivateEndpointConnectionProperties` {#Azure.ResourceManager.PrivateEndpointConnectionProperties} + +Properties of he private endpoint connection resource + +```typespec +model Azure.ResourceManager.PrivateEndpointConnectionProperties +``` + +### `PrivateEndpointConnectionResourceListResult` {#Azure.ResourceManager.PrivateEndpointConnectionResourceListResult} + +List of private endpoint connections associated with the specified resource. + +```typespec +model Azure.ResourceManager.PrivateEndpointConnectionResourceListResult +``` + +### `PrivateLinkResource` {#Azure.ResourceManager.PrivateLinkResource} + +```typespec +model Azure.ResourceManager.PrivateLinkResource +``` + +### `PrivateLinkResourceListResult` {#Azure.ResourceManager.PrivateLinkResourceListResult} + +A list of private link resources. + +```typespec +model Azure.ResourceManager.PrivateLinkResourceListResult +``` + +### `PrivateLinkResourceParameter` {#Azure.ResourceManager.PrivateLinkResourceParameter} + +The name of the private link associated with the Azure resource. + +```typespec +model Azure.ResourceManager.PrivateLinkResourceParameter +``` + +#### Template Parameters + +| Name | Description | +| -------- | -------------------------------------------------------------------------- | +| TSegment | The resource type name for private links (default is privateLinkResources) | + +### `PrivateLinkResourceProperties` {#Azure.ResourceManager.PrivateLinkResourceProperties} + +Properties of a private link resource. + +```typespec +model Azure.ResourceManager.PrivateLinkResourceProperties +``` + +### `PrivateLinkServiceConnectionState` {#Azure.ResourceManager.PrivateLinkServiceConnectionState} + +A collection of information about the state of the connection between service consumer and provider. + +```typespec +model Azure.ResourceManager.PrivateLinkServiceConnectionState +``` + +### `ProviderNamespace` {#Azure.ResourceManager.ProviderNamespace} + +Model describing the provider namespace. + +```typespec +model Azure.ResourceManager.ProviderNamespace +``` + +#### Template Parameters + +| Name | Description | +| --------- | --------------------------------------- | +| TResource | The resource provided by the namespace. | + +### `ProxyResource` {#Azure.ResourceManager.ProxyResource} + +Concrete proxy resource types can be created by aliasing this type using a specific property type. + +See more details on [different ARM resource type here.](https://azure.github.io/typespec-azure/docs/howtos/ARM/resource-type) + +```typespec +model Azure.ResourceManager.ProxyResource +``` + +#### Template Parameters + +| Name | Description | +| ----------- | --------------------------------------------------------------------- | +| TProperties | A model containing the provider-specific properties for this resource | + +### `ResourceGroupParameter` {#Azure.ResourceManager.ResourceGroupParameter} + +The default resource group parameter type. + +```typespec +model Azure.ResourceManager.ResourceGroupParameter +``` + +### `ResourceIdentifierAllowedResource` {#Azure.ResourceManager.ResourceIdentifierAllowedResource} + +Used in ResourceIdentifier definition to represent a particular type of ARM resource, enabling constraints based on resource type. +See [link](https://github.com/Azure/autorest/tree/main/docs/extensions#schema) + +```typespec +model Azure.ResourceManager.ResourceIdentifierAllowedResource +``` + +### `ResourceInstanceParameters` {#Azure.ResourceManager.ResourceInstanceParameters} + +The dynamic parameters of a resource instance - pass in the proper base type to indicate +where the resource is based. The default is in a resource group + +```typespec +model Azure.ResourceManager.ResourceInstanceParameters +``` + +#### Template Parameters + +| Name | Description | +| --------------- | -------------------------------------------------------- | +| TResource | The resource to get parameters for | +| TBaseParameters | The parameters representing the base Uri of the resource | + +### `ResourceKind` {#Azure.ResourceManager.ResourceKind} + +Model used only to spread in the standard `kind` envelope property for a resource + +```typespec +model Azure.ResourceManager.ResourceKind +``` + +#### Examples + +```typespec +model Foo is TrackedResource { + // Only have standard Succeeded, Failed, Cancelled states + ...ResourceKind; +} +``` + +### `ResourceListResult` {#Azure.ResourceManager.ResourceListResult} + +Paged response containing resources + +```typespec +model Azure.ResourceManager.ResourceListResult +``` + +#### Template Parameters + +| Name | Description | +| --------- | -------------------------------------------------------------------------- | +| TResource | The type of the values returned in the paged response (must be a resource) | + +### `ResourceParentParameters` {#Azure.ResourceManager.ResourceParentParameters} + +The dynamic parameters of a list call for a resource instance - pass in the proper base type to indicate +where the list should take place. The default is in a resource group + +```typespec +model Azure.ResourceManager.ResourceParentParameters +``` + +#### Template Parameters + +| Name | Description | +| --------------- | -------------------------------------------------------- | +| TResource | The resource to get parameters for | +| TBaseParameters | The parameters representing the base Uri of the resource | + +### `ResourcePlan` {#Azure.ResourceManager.ResourcePlan} + +Model used only to spread in the standard `plan` envelope property for a resource + +```typespec +model Azure.ResourceManager.ResourcePlan +``` + +#### Examples + +```typespec +model Foo is TrackedResource { + // Only have standard Succeeded, Failed, Cancelled states + ...ResourcePlan; +} +``` + +### `ResourceSku` {#Azure.ResourceManager.ResourceSku} + +Model used only to spread in the standard `sku` envelope property for a resource + +```typespec +model Azure.ResourceManager.ResourceSku +``` + +#### Examples + +```typespec +model Foo is TrackedResource { + // Only have standard Succeeded, Failed, Cancelled states + ...ResourceSku; +} +``` + +### `ResourceUriParameter` {#Azure.ResourceManager.ResourceUriParameter} + +The default resourceUri parameter type. + +```typespec +model Azure.ResourceManager.ResourceUriParameter +``` + +### `SubscriptionIdParameter` {#Azure.ResourceManager.SubscriptionIdParameter} + +The default subscriptionId parameter type. + +```typespec +model Azure.ResourceManager.SubscriptionIdParameter +``` + +### `TrackedResource` {#Azure.ResourceManager.TrackedResource} + +Concrete tracked resource types can be created by aliasing this type using a specific property type. + +See more details on [different ARM resource type here.](https://azure.github.io/typespec-azure/docs/howtos/ARM/resource-type) + +```typespec +model Azure.ResourceManager.TrackedResource +``` + +#### Template Parameters + +| Name | Description | +| ----------- | --------------------------------------------------------------------- | +| TProperties | A model containing the provider-specific properties for this resource | + +### `InfrastructureEncryption` {#Azure.ResourceManager.InfrastructureEncryption} + +(Optional) Discouraged to include in resource definition. Only needed where it is possible to disable platform (AKA infrastructure) encryption. Azure SQL TDE is an example of this. Values are enabled and disabled. + +```typespec +enum Azure.ResourceManager.InfrastructureEncryption +``` + +### `KeyEncryptionIdentity` {#Azure.ResourceManager.KeyEncryptionIdentity} + +The type of identity to use. + +```typespec +enum Azure.ResourceManager.KeyEncryptionIdentity +``` + +### `PrivateEndpointConnectionProvisioningState` {#Azure.ResourceManager.PrivateEndpointConnectionProvisioningState} + +The provisioning state of the connection + +```typespec +enum Azure.ResourceManager.PrivateEndpointConnectionProvisioningState +``` + +### `PrivateEndpointServiceConnectionStatus` {#Azure.ResourceManager.PrivateEndpointServiceConnectionStatus} + +The private endpoint connection status + +```typespec +enum Azure.ResourceManager.PrivateEndpointServiceConnectionStatus +``` + +### `ResourceProvisioningState` {#Azure.ResourceManager.ResourceProvisioningState} + +Standard terminal provisioning state of resource type. You can spread into your +custom provision state to avoid duplication and ensure consistency + +```typespec +enum Azure.ResourceManager.ResourceProvisioningState +``` + +#### Examples + +```typespec +enum FooProvisioningState { + ...ResourceProvisioningState, // include standard provisioning states + starting, + started, + stopping, + stopped, +} +``` + +### `Versions` {#Azure.ResourceManager.Versions} + +Supported versions of Azure.ResourceManager building blocks. + +```typespec +enum Azure.ResourceManager.Versions +``` + +### `ResourceIdentifier` {#Azure.ResourceManager.ResourceIdentifier} + +A type definition that refers the id to an ARM resource. + +Sample usage: +otherArmId: ResourceIdentifier; +networkId: ResourceIdentifier<[{type:"\\Microsoft.Network\\vnet"}]> +vmIds: ResourceIdentifier<[{type:"\\Microsoft.Compute\\vm", scopes["*"]}]> + +```typespec +scalar Azure.ResourceManager.ResourceIdentifier +``` + +### `ResourceIdentifier` {#Azure.ResourceManager.ResourceIdentifier} + +A type definition that refers the id to an ARM resource. + +Sample usage: +otherArmId: ResourceIdentifier; +networkId: ResourceIdentifier<[{type:"\\Microsoft.Network\\vnet"}]> +vmIds: ResourceIdentifier<[{type:"\\Microsoft.Compute\\vm", scopes["*"]}]> + +```typespec +scalar Azure.ResourceManager.ResourceIdentifier +``` + +### `ResourceIdentifier` {#Azure.ResourceManager.ResourceIdentifier} + +A type definition that refers the id to an ARM resource. + +Sample usage: +otherArmId: ResourceIdentifier; +networkId: ResourceIdentifier<[{type:"\\Microsoft.Network\\vnet"}]> +vmIds: ResourceIdentifier<[{type:"\\Microsoft.Compute\\vm", scopes["*"]}]> + +```typespec +scalar Azure.ResourceManager.ResourceIdentifier +``` + +## Azure.ResourceManager.CommonTypes + +### `Versions` {#Azure.ResourceManager.CommonTypes.Versions} + +The ARM common-types versions. + +```typespec +enum Azure.ResourceManager.CommonTypes.Versions +``` + +## Azure.ResourceManager.Foundations + +### `ArmResource` {#Azure.ResourceManager.Foundations.ArmResource} + +Base model that defines common properties for all ARM resources. + +```typespec +model Azure.ResourceManager.Foundations.ArmResource +``` + +### `ArmTagsProperty` {#Azure.ResourceManager.Foundations.ArmTagsProperty} + +Standard type definition for ARM Tags property. + +It is included in the TrackedResource template definition. + +```typespec +model Azure.ResourceManager.Foundations.ArmTagsProperty +``` + +### `BaseParameters` {#Azure.ResourceManager.Foundations.BaseParameters} + +Base parameters for a resource. + +```typespec +model Azure.ResourceManager.Foundations.BaseParameters +``` + +#### Template Parameters + +| Name | Description | +| --------- | ------------------------- | +| TResource | The type of the resource. | + +### `CheckNameAvailabilityRequest` {#Azure.ResourceManager.Foundations.CheckNameAvailabilityRequest} + +The check availability request body. + +```typespec +model Azure.ResourceManager.Foundations.CheckNameAvailabilityRequest +``` + +### `CheckNameAvailabilityResponse` {#Azure.ResourceManager.Foundations.CheckNameAvailabilityResponse} + +The check availability result. + +```typespec +model Azure.ResourceManager.Foundations.CheckNameAvailabilityResponse +``` + +### `ErrorAdditionalInfo` {#Azure.ResourceManager.Foundations.ErrorAdditionalInfo} + +The resource management error additional info. + +```typespec +model Azure.ResourceManager.Foundations.ErrorAdditionalInfo +``` + +### `ErrorDetail` {#Azure.ResourceManager.Foundations.ErrorDetail} + +The error detail. + +```typespec +model Azure.ResourceManager.Foundations.ErrorDetail +``` + +### `ExtensionBaseParameters` {#Azure.ResourceManager.Foundations.ExtensionBaseParameters} + +The static parameters for an extension resource + +```typespec +model Azure.ResourceManager.Foundations.ExtensionBaseParameters +``` + +### `ExtensionResourceBase` {#Azure.ResourceManager.Foundations.ExtensionResourceBase} + +The base extension resource. + +```typespec +model Azure.ResourceManager.Foundations.ExtensionResourceBase +``` + +### `ExtensionScope` {#Azure.ResourceManager.Foundations.ExtensionScope} + +Parameter model for listing an extension resource + +```typespec +model Azure.ResourceManager.Foundations.ExtensionScope +``` + +#### Template Parameters + +| Name | Description | +| --------- | ------------------------- | +| TResource | The type of the resource. | + +### `LocationBaseParameters` {#Azure.ResourceManager.Foundations.LocationBaseParameters} + +The static parameters for a location-based resource + +```typespec +model Azure.ResourceManager.Foundations.LocationBaseParameters +``` + +### `LocationScope` {#Azure.ResourceManager.Foundations.LocationScope} + +Parameter model for listing a resource at the location scope + +```typespec +model Azure.ResourceManager.Foundations.LocationScope +``` + +#### Template Parameters + +| Name | Description | +| --------- | ------------------------- | +| TResource | The type of the resource. | + +### `ManagedIdentityProperties` {#Azure.ResourceManager.Foundations.ManagedIdentityProperties} + +The properties of the managed service identities assigned to this resource. + +```typespec +model Azure.ResourceManager.Foundations.ManagedIdentityProperties +``` + +### `ManagedSystemIdentityProperties` {#Azure.ResourceManager.Foundations.ManagedSystemIdentityProperties} + +The properties of the service-assigned identity associated with this resource. + +```typespec +model Azure.ResourceManager.Foundations.ManagedSystemIdentityProperties +``` + +### `Operation` {#Azure.ResourceManager.Foundations.Operation} + +Details of a REST API operation, returned from the Resource Provider Operations API + +```typespec +model Azure.ResourceManager.Foundations.Operation +``` + +### `OperationDisplay` {#Azure.ResourceManager.Foundations.OperationDisplay} + +Localized display information for and operation. + +```typespec +model Azure.ResourceManager.Foundations.OperationDisplay +``` + +### `OperationIdParameter` {#Azure.ResourceManager.Foundations.OperationIdParameter} + +The default operationId parameter type. + +```typespec +model Azure.ResourceManager.Foundations.OperationIdParameter +``` + +### `OperationListResult` {#Azure.ResourceManager.Foundations.OperationListResult} + +A list of REST API operations supported by an Azure Resource Provider. It contains an URL link to get the next set of results. + +```typespec +model Azure.ResourceManager.Foundations.OperationListResult +``` + +### `OperationStatusResult` {#Azure.ResourceManager.Foundations.OperationStatusResult} + +The current status of an async operation. + +```typespec +model Azure.ResourceManager.Foundations.OperationStatusResult +``` + +### `ProxyResourceBase` {#Azure.ResourceManager.Foundations.ProxyResourceBase} + +The base proxy resource. + +```typespec +model Azure.ResourceManager.Foundations.ProxyResourceBase +``` + +### `ProxyResourceUpdateModel` {#Azure.ResourceManager.Foundations.ProxyResourceUpdateModel} + +The type used for update operations of the resource. + +```typespec +model Azure.ResourceManager.Foundations.ProxyResourceUpdateModel +``` + +#### Template Parameters + +| Name | Description | +| ----------- | --------------------------- | +| TResource | The type of the resource. | +| TProperties | The type of the properties. | + +### `ResourceGroupBaseParameters` {#Azure.ResourceManager.Foundations.ResourceGroupBaseParameters} + +The static parameters for a resource-group based resource + +```typespec +model Azure.ResourceManager.Foundations.ResourceGroupBaseParameters +``` + +### `ResourceGroupScope` {#Azure.ResourceManager.Foundations.ResourceGroupScope} + +Parameter model for listing a resource at the resource group scope + +```typespec +model Azure.ResourceManager.Foundations.ResourceGroupScope +``` + +#### Template Parameters + +| Name | Description | +| --------- | ------------------------- | +| TResource | The type of the resource. | + +### `ResourcePlanType` {#Azure.ResourceManager.Foundations.ResourcePlanType} + +Details of the resource plan. + +```typespec +model Azure.ResourceManager.Foundations.ResourcePlanType +``` + +### `ResourceSkuType` {#Azure.ResourceManager.Foundations.ResourceSkuType} + +The SKU (Stock Keeping Unit) assigned to this resource. + +```typespec +model Azure.ResourceManager.Foundations.ResourceSkuType +``` + +### `ResourceUpdateModel` {#Azure.ResourceManager.Foundations.ResourceUpdateModel} + +Defines a model type used to create named resource update models +e.g. `model MyResourceUpdate is ResourceUpdate {}` + +```typespec +model Azure.ResourceManager.Foundations.ResourceUpdateModel +``` + +#### Template Parameters + +| Name | Description | +| ----------- | --------------------------- | +| TResource | The type of the resource. | +| TProperties | The type of the properties. | + +### `ResourceUpdateModelProperties` {#Azure.ResourceManager.Foundations.ResourceUpdateModelProperties} + +Defines a properties type used to create named resource update models. +This type is not used directly, it is referenced by ResourceUpdateModel. + +```typespec +model Azure.ResourceManager.Foundations.ResourceUpdateModelProperties +``` + +#### Template Parameters + +| Name | Description | +| ----------- | --------------------------- | +| TResource | The type of the resource. | +| TProperties | The type of the properties. | + +### `SubscriptionBaseParameters` {#Azure.ResourceManager.Foundations.SubscriptionBaseParameters} + +The static parameters for a subscription based resource + +```typespec +model Azure.ResourceManager.Foundations.SubscriptionBaseParameters +``` + +### `SubscriptionScope` {#Azure.ResourceManager.Foundations.SubscriptionScope} + +Parameter model for listing a resource at the subscription scope + +```typespec +model Azure.ResourceManager.Foundations.SubscriptionScope +``` + +#### Template Parameters + +| Name | Description | +| --------- | ------------------------- | +| TResource | The type of the resource. | + +### `SystemData` {#Azure.ResourceManager.Foundations.SystemData} + +Metadata pertaining to creation and last modification of the resource. + +```typespec +model Azure.ResourceManager.Foundations.SystemData +``` + +### `TagsUpdateModel` {#Azure.ResourceManager.Foundations.TagsUpdateModel} + +The type used for updating tags in resources. + +```typespec +model Azure.ResourceManager.Foundations.TagsUpdateModel +``` + +#### Template Parameters + +| Name | Description | +| --------- | ------------------------- | +| TResource | The type of the resource. | + +### `TenantBaseParameters` {#Azure.ResourceManager.Foundations.TenantBaseParameters} + +The static parameters for a tenant-based resource + +```typespec +model Azure.ResourceManager.Foundations.TenantBaseParameters +``` + +### `TenantScope` {#Azure.ResourceManager.Foundations.TenantScope} + +Parameter model for listing a resource at the tenant scope + +```typespec +model Azure.ResourceManager.Foundations.TenantScope +``` + +#### Template Parameters + +| Name | Description | +| --------- | ------------------------- | +| TResource | The type of the resource. | + +### `TrackedResourceBase` {#Azure.ResourceManager.Foundations.TrackedResourceBase} + +The base tracked resource. + +```typespec +model Azure.ResourceManager.Foundations.TrackedResourceBase +``` + +### `UserAssignedIdentity` {#Azure.ResourceManager.Foundations.UserAssignedIdentity} + +A managed identity assigned by the user. + +```typespec +model Azure.ResourceManager.Foundations.UserAssignedIdentity +``` + +### `ActionType` {#Azure.ResourceManager.Foundations.ActionType} + +Enum. Indicates the action type. "Internal" refers to actions that are for internal only APIs. + +```typespec +enum Azure.ResourceManager.Foundations.ActionType +``` + +### `CheckNameAvailabilityReason` {#Azure.ResourceManager.Foundations.CheckNameAvailabilityReason} + +Possible reasons for a name not being available. + +```typespec +enum Azure.ResourceManager.Foundations.CheckNameAvailabilityReason +``` + +### `createdByType` {#Azure.ResourceManager.Foundations.createdByType} + +The kind of entity that created the resource. + +```typespec +enum Azure.ResourceManager.Foundations.createdByType +``` + +### `ManagedIdentityType` {#Azure.ResourceManager.Foundations.ManagedIdentityType} + +The kind of managed identity assigned to this resource. + +```typespec +enum Azure.ResourceManager.Foundations.ManagedIdentityType +``` + +### `ManagedSystemIdentityType` {#Azure.ResourceManager.Foundations.ManagedSystemIdentityType} + +The kind of managemed identity assigned to this resource. + +```typespec +enum Azure.ResourceManager.Foundations.ManagedSystemIdentityType +``` + +### `Origin` {#Azure.ResourceManager.Foundations.Origin} + +The intended executor of the operation; as in Resource Based Access Control (RBAC) and audit logs UX. Default value is "user,system" + +```typespec +enum Azure.ResourceManager.Foundations.Origin +``` + +### `ResourceHome` {#Azure.ResourceManager.Foundations.ResourceHome} + +An internal enum to indicate the resource support for various path types + +```typespec +enum Azure.ResourceManager.Foundations.ResourceHome +``` + +### `SkuTier` {#Azure.ResourceManager.Foundations.SkuTier} + +Available service tiers for the SKU. + +```typespec +enum Azure.ResourceManager.Foundations.SkuTier +``` diff --git a/docs/libraries/azure-resource-manager/reference/decorators.md b/docs/libraries/azure-resource-manager/reference/decorators.md new file mode 100644 index 0000000000..5b59891f42 --- /dev/null +++ b/docs/libraries/azure-resource-manager/reference/decorators.md @@ -0,0 +1,405 @@ +--- +title: "Decorators" +toc_min_heading_level: 2 +toc_max_heading_level: 3 +--- + +# Decorators + +## Azure.ResourceManager + +### `@armCommonTypesVersion` {#@Azure.ResourceManager.armCommonTypesVersion} + +This decorator is used either on a namespace or a version enum value to indicate +the version of the ARM common-types to use for refs in emitted Swagger files. + +```typespec +@Azure.ResourceManager.armCommonTypesVersion(version: valueof string | EnumMember) +``` + +#### Target + +`union Namespace | EnumMember` + +#### Parameters + +| Name | Type | Description | +| ------- | ------------------------------------ | ------------------------------------------------------------------------------------------------------------------ | +| version | `valueof union string \| EnumMember` | The Azure.ResourceManager.CommonTypes.Versions for the desired common-types version or an equivalent string value. | + +### `@armLibraryNamespace` {#@Azure.ResourceManager.armLibraryNamespace} + +`@armLibraryNamespace` designates a namespace as containign ARM Provider information. + +```typespec +@Azure.ResourceManager.armLibraryNamespace +``` + +#### Target + +`Namespace` + +#### Parameters + +None + +#### Examples + +```typespec +@armLibraryNamespace +namespace Microsoft.Contoso; +``` + +### `@armProviderNamespace` {#@Azure.ResourceManager.armProviderNamespace} + +`@armProviderNamespace` sets the ARM provider name. It will default to use the +Namespace element value unless an override value is specified. + +```typespec +@Azure.ResourceManager.armProviderNamespace(providerNamespace?: valueof string) +``` + +#### Target + +`Namespace` + +#### Parameters + +| Name | Type | Description | +| ----------------- | ----------------------- | ------------------ | +| providerNamespace | `valueof scalar string` | Provider namespace | + +#### Examples + +```typespec +@armProviderNamespace +namespace Microsoft.Contoso; +``` + +```typespec +@armProviderNamespace("Microsoft.Contoso") +namespace Microsoft.ContosoService; +``` + +### `@armProviderNameValue` {#@Azure.ResourceManager.armProviderNameValue} + +`@armResourceType` sets the value fo the decorated string +property to the type of the ARM resource. + +```typespec +@Azure.ResourceManager.armProviderNameValue +``` + +#### Target + +`union Operation | Model` + +#### Parameters + +None + +### `@armRenameListByOperation` {#@Azure.ResourceManager.armRenameListByOperation} + +Marks the operation as being a collection action + +```typespec +@Azure.ResourceManager.armRenameListByOperation(resourceType: Model, parentTypeName?: valueof string, parentFriendlyTypeName?: valueof string) +``` + +#### Target + +`Operation` + +#### Parameters + +| Name | Type | Description | +| ---------------------- | ----------------------- | ------------------------- | +| resourceType | `Model` | Resource | +| parentTypeName | `valueof scalar string` | : Parent type name. | +| parentFriendlyTypeName | `valueof scalar string` | Friendly name for parent. | + +### `@armResourceAction` {#@Azure.ResourceManager.armResourceAction} + +```typespec +@Azure.ResourceManager.armResourceAction(resourceType: Model) +``` + +#### Target + +`Operation` + +#### Parameters + +| Name | Type | Description | +| ------------ | ------- | -------------- | +| resourceType | `Model` | Resource model | + +### `@armResourceCollectionAction` {#@Azure.ResourceManager.armResourceCollectionAction} + +Marks the operation as being a collection action + +```typespec +@Azure.ResourceManager.armResourceCollectionAction +``` + +#### Target + +`Operation` + +#### Parameters + +None + +### `@armResourceCreateOrUpdate` {#@Azure.ResourceManager.armResourceCreateOrUpdate} + +```typespec +@Azure.ResourceManager.armResourceCreateOrUpdate(resourceType: Model) +``` + +#### Target + +`Operation` + +#### Parameters + +| Name | Type | Description | +| ------------ | ------- | -------------- | +| resourceType | `Model` | Resource model | + +### `@armResourceDelete` {#@Azure.ResourceManager.armResourceDelete} + +```typespec +@Azure.ResourceManager.armResourceDelete(resourceType: Model) +``` + +#### Target + +`Operation` + +#### Parameters + +| Name | Type | Description | +| ------------ | ------- | -------------- | +| resourceType | `Model` | Resource model | + +### `@armResourceList` {#@Azure.ResourceManager.armResourceList} + +```typespec +@Azure.ResourceManager.armResourceList(resourceType: Model) +``` + +#### Target + +`Operation` + +#### Parameters + +| Name | Type | Description | +| ------------ | ------- | -------------- | +| resourceType | `Model` | Resource model | + +### `@armResourceOperations` {#@Azure.ResourceManager.armResourceOperations} + +This decorator is used to identify interfaces containing resource operations. +When applied, it marks the interface with the `@autoRoute` decorator so that +all of its contained operations will have their routes generated +automatically. + +It also adds a `@tag` decorator bearing the name of the interface so that all +of the operations will be grouped based on the interface name in generated +clients. + +```typespec +@Azure.ResourceManager.armResourceOperations(_?: unknown) +``` + +#### Target + +`Interface` + +#### Parameters + +| Name | Type | Description | +| ---- | --------------------- | ----------- | +| \_ | `(intrinsic) unknown` | DEPRECATED | + +### `@armResourceRead` {#@Azure.ResourceManager.armResourceRead} + +```typespec +@Azure.ResourceManager.armResourceRead(resourceType: Model) +``` + +#### Target + +`Operation` + +#### Parameters + +| Name | Type | Description | +| ------------ | ------- | -------------- | +| resourceType | `Model` | Resource model | + +### `@armResourceUpdate` {#@Azure.ResourceManager.armResourceUpdate} + +```typespec +@Azure.ResourceManager.armResourceUpdate(resourceType: Model) +``` + +#### Target + +`Operation` + +#### Parameters + +| Name | Type | Description | +| ------------ | ------- | -------------- | +| resourceType | `Model` | Resource model | + +### `@extensionResource` {#@Azure.ResourceManager.extensionResource} + +`@extensionResource` marks an ARM resource model as an Extension resource. +Extension resource extends other resource types. URL path is appended +to another segment {scope} which refers to another Resource URL. + +`{resourceUri}/providers/Microsoft.Contoso/accessPermissions` + +See more details on [different ARM resource type here.](https://azure.github.io/typespec-azure/docs/howtos/ARM/resource-type) + +```typespec +@Azure.ResourceManager.extensionResource +``` + +#### Target + +`Model` + +#### Parameters + +None + +### `@locationResource` {#@Azure.ResourceManager.locationResource} + +`@locationResource` marks an ARM resource model as a location based resource. + +Location based resources have REST API paths like +`/subscriptions/{subscriptionId}/locations/{location}/providers/Microsoft.Contoso/employees` + +See more details on [different ARM resource type here.](https://azure.github.io/typespec-azure/docs/howtos/ARM/resource-type) + +```typespec +@Azure.ResourceManager.locationResource +``` + +#### Target + +`Model` + +#### Parameters + +None + +### `@resourceGroupResource` {#@Azure.ResourceManager.resourceGroupResource} + +`@resourceGroupResource` marks an ARM resource model as a resource group level resource. +This is the default option for ARM resources. It is provided for symmetry and clarity, and +you typically do not need to specify it. + +`/subscription/{id}/resourcegroups/{rg}/providers/Microsoft.Contoso/employees` + +See more details on [different ARM resource type here.](https://azure.github.io/typespec-azure/docs/howtos/ARM/resource-type) + +```typespec +@Azure.ResourceManager.resourceGroupResource +``` + +#### Target + +`Model` + +#### Parameters + +None + +### `@singleton` {#@Azure.ResourceManager.singleton} + +`@singleton` marks an ARM resource model as a singleton resource. + +Singleton resources only have a single instance with a fixed key name. +`.../providers/Microsoft.Contoso/monthlyReports/default` + +See more details on [different ARM resource type here.](https://azure.github.io/typespec-azure/docs/howtos/ARM/resource-type) + +```typespec +@Azure.ResourceManager.singleton(keyValue?: valueof string | default) +``` + +#### Target + +`Model` + +#### Parameters + +| Name | Type | Description | +| -------- | --------------------------------- | -------------------------------------------------------------- | +| keyValue | `valueof union string \| default` | The name of the singleton resource. Default name is "default". | + +### `@subscriptionResource` {#@Azure.ResourceManager.subscriptionResource} + +`@subscriptionResource` marks an ARM resource model as a subscription resource. + +Subscription resources have REST API paths like: +`/subscription/{id}/providers/Microsoft.Contoso/employees` + +See more details on [different ARM resource type here.](https://azure.github.io/typespec-azure/docs/howtos/ARM/resource-type) + +```typespec +@Azure.ResourceManager.subscriptionResource +``` + +#### Target + +`Model` + +#### Parameters + +None + +### `@tenantResource` {#@Azure.ResourceManager.tenantResource} + +`@tenantResource` marks an ARM resource model as a Tenant resource/Root resource/Top-Level resource. + +Tenant resources have REST API paths like: +`/provider/Microsoft.Contoso/FooResources` + +See more details on [different ARM resource type here.](https://azure.github.io/typespec-azure/docs/howtos/ARM/resource-type) + +```typespec +@Azure.ResourceManager.tenantResource +``` + +#### Target + +`Model` + +#### Parameters + +None + +### `@useLibraryNamespace` {#@Azure.ResourceManager.useLibraryNamespace} + +Declare the ARM library namespaces used in this provider. +This allows sharing ARM resource types across specifications + +```typespec +@Azure.ResourceManager.useLibraryNamespace(...namespaces: Namespace[]) +``` + +#### Target + +`Namespace` + +#### Parameters + +| Name | Type | Description | +| ---------- | ------------------- | ----------------------------------------------------- | +| namespaces | `model Namespace[]` | The namespaces of arm libraries used in this provider | diff --git a/docs/libraries/azure-resource-manager/reference/index.mdx b/docs/libraries/azure-resource-manager/reference/index.mdx new file mode 100644 index 0000000000..4b82579494 --- /dev/null +++ b/docs/libraries/azure-resource-manager/reference/index.mdx @@ -0,0 +1,204 @@ +--- +title: Overview +sidebar_position: 0 +toc_min_heading_level: 2 +toc_max_heading_level: 3 +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Overview + +TypeSpec Azure Resource Manager library + +## Install + + + + +```bash +npm install @azure-tools/typespec-azure-resource-manager +``` + + + + +```bash +npm install --save-peer @azure-tools/typespec-azure-resource-manager +``` + + + + +## Azure + +## Azure.ResourceManager + +### Decorators + +- [`@armCommonTypesVersion`](./decorators.md#@Azure.ResourceManager.armCommonTypesVersion) +- [`@armLibraryNamespace`](./decorators.md#@Azure.ResourceManager.armLibraryNamespace) +- [`@armProviderNamespace`](./decorators.md#@Azure.ResourceManager.armProviderNamespace) +- [`@armProviderNameValue`](./decorators.md#@Azure.ResourceManager.armProviderNameValue) +- [`@armRenameListByOperation`](./decorators.md#@Azure.ResourceManager.armRenameListByOperation) +- [`@armResourceAction`](./decorators.md#@Azure.ResourceManager.armResourceAction) +- [`@armResourceCollectionAction`](./decorators.md#@Azure.ResourceManager.armResourceCollectionAction) +- [`@armResourceCreateOrUpdate`](./decorators.md#@Azure.ResourceManager.armResourceCreateOrUpdate) +- [`@armResourceDelete`](./decorators.md#@Azure.ResourceManager.armResourceDelete) +- [`@armResourceList`](./decorators.md#@Azure.ResourceManager.armResourceList) +- [`@armResourceOperations`](./decorators.md#@Azure.ResourceManager.armResourceOperations) +- [`@armResourceRead`](./decorators.md#@Azure.ResourceManager.armResourceRead) +- [`@armResourceUpdate`](./decorators.md#@Azure.ResourceManager.armResourceUpdate) +- [`@extensionResource`](./decorators.md#@Azure.ResourceManager.extensionResource) +- [`@locationResource`](./decorators.md#@Azure.ResourceManager.locationResource) +- [`@resourceGroupResource`](./decorators.md#@Azure.ResourceManager.resourceGroupResource) +- [`@singleton`](./decorators.md#@Azure.ResourceManager.singleton) +- [`@subscriptionResource`](./decorators.md#@Azure.ResourceManager.subscriptionResource) +- [`@tenantResource`](./decorators.md#@Azure.ResourceManager.tenantResource) +- [`@useLibraryNamespace`](./decorators.md#@Azure.ResourceManager.useLibraryNamespace) + +### Interfaces + +- [`ExtensionResourceCollectionOperations`](./interfaces.md#Azure.ResourceManager.ExtensionResourceCollectionOperations) +- [`ExtensionResourceInstanceOperations`](./interfaces.md#Azure.ResourceManager.ExtensionResourceInstanceOperations) +- [`ExtensionResourceOperations`](./interfaces.md#Azure.ResourceManager.ExtensionResourceOperations) +- [`Operations`](./interfaces.md#Azure.ResourceManager.Operations) +- [`ProxyResourceOperations`](./interfaces.md#Azure.ResourceManager.ProxyResourceOperations) +- [`ResourceCollectionOperations`](./interfaces.md#Azure.ResourceManager.ResourceCollectionOperations) +- [`ResourceCreateAsync`](./interfaces.md#Azure.ResourceManager.ResourceCreateAsync) +- [`ResourceCreateSync`](./interfaces.md#Azure.ResourceManager.ResourceCreateSync) +- [`ResourceDeleteAsync`](./interfaces.md#Azure.ResourceManager.ResourceDeleteAsync) +- [`ResourceDeleteSync`](./interfaces.md#Azure.ResourceManager.ResourceDeleteSync) +- [`ResourceDeleteWithoutOkAsync`](./interfaces.md#Azure.ResourceManager.ResourceDeleteWithoutOkAsync) +- [`ResourceInstanceOperations`](./interfaces.md#Azure.ResourceManager.ResourceInstanceOperations) +- [`ResourceListByParent`](./interfaces.md#Azure.ResourceManager.ResourceListByParent) +- [`ResourceListBySubscription`](./interfaces.md#Azure.ResourceManager.ResourceListBySubscription) +- [`ResourceOperations`](./interfaces.md#Azure.ResourceManager.ResourceOperations) +- [`ResourceRead`](./interfaces.md#Azure.ResourceManager.ResourceRead) +- [`ResourceUpdateAsync`](./interfaces.md#Azure.ResourceManager.ResourceUpdateAsync) +- [`ResourceUpdateSync`](./interfaces.md#Azure.ResourceManager.ResourceUpdateSync) +- [`TenantResourceOperations`](./interfaces.md#Azure.ResourceManager.TenantResourceOperations) +- [`TrackedResourceOperations`](./interfaces.md#Azure.ResourceManager.TrackedResourceOperations) + +### Operations + +- [`ArmCustomPatchAsync`](./interfaces.md#Azure.ResourceManager.ArmCustomPatchAsync) +- [`ArmCustomPatchSync`](./interfaces.md#Azure.ResourceManager.ArmCustomPatchSync) +- [`ArmListBySubscription`](./interfaces.md#Azure.ResourceManager.ArmListBySubscription) +- [`ArmResourceActionAsync`](./interfaces.md#Azure.ResourceManager.ArmResourceActionAsync) +- [`ArmResourceActionAsyncBase`](./interfaces.md#Azure.ResourceManager.ArmResourceActionAsyncBase) +- [`ArmResourceActionNoContentAsync`](./interfaces.md#Azure.ResourceManager.ArmResourceActionNoContentAsync) +- [`ArmResourceActionNoContentSync`](./interfaces.md#Azure.ResourceManager.ArmResourceActionNoContentSync) +- [`ArmResourceActionNoResponseContentAsync`](./interfaces.md#Azure.ResourceManager.ArmResourceActionNoResponseContentAsync) +- [`ArmResourceActionSync`](./interfaces.md#Azure.ResourceManager.ArmResourceActionSync) +- [`ArmResourceCreateOrReplaceSync`](./interfaces.md#Azure.ResourceManager.ArmResourceCreateOrReplaceSync) +- [`ArmResourceCreateOrUpdateAsync`](./interfaces.md#Azure.ResourceManager.ArmResourceCreateOrUpdateAsync) +- [`ArmResourceCreateOrUpdateSync`](./interfaces.md#Azure.ResourceManager.ArmResourceCreateOrUpdateSync) +- [`ArmResourceDeleteAsync`](./interfaces.md#Azure.ResourceManager.ArmResourceDeleteAsync) +- [`ArmResourceDeleteAsyncBase`](./interfaces.md#Azure.ResourceManager.ArmResourceDeleteAsyncBase) +- [`ArmResourceDeleteSync`](./interfaces.md#Azure.ResourceManager.ArmResourceDeleteSync) +- [`ArmResourceDeleteWithoutOkAsync`](./interfaces.md#Azure.ResourceManager.ArmResourceDeleteWithoutOkAsync) +- [`ArmResourceListAtScope`](./interfaces.md#Azure.ResourceManager.ArmResourceListAtScope) +- [`ArmResourceListByParent`](./interfaces.md#Azure.ResourceManager.ArmResourceListByParent) +- [`ArmResourceRead`](./interfaces.md#Azure.ResourceManager.ArmResourceRead) +- [`checkGlobalNameAvailability`](./interfaces.md#Azure.ResourceManager.checkGlobalNameAvailability) +- [`checkLocalNameAvailability`](./interfaces.md#Azure.ResourceManager.checkLocalNameAvailability) + +### Models + +- [`ApiVersionParameter`](./data-types.md#Azure.ResourceManager.ApiVersionParameter) +- [`ArmAcceptedLroResponse`](./data-types.md#Azure.ResourceManager.ArmAcceptedLroResponse) +- [`ArmAcceptedResponse`](./data-types.md#Azure.ResourceManager.ArmAcceptedResponse) +- [`ArmCreatedResponse`](./data-types.md#Azure.ResourceManager.ArmCreatedResponse) +- [`ArmDeleteAcceptedLroResponse`](./data-types.md#Azure.ResourceManager.ArmDeleteAcceptedLroResponse) +- [`ArmDeleteAcceptedResponse`](./data-types.md#Azure.ResourceManager.ArmDeleteAcceptedResponse) +- [`ArmDeletedNoContentResponse`](./data-types.md#Azure.ResourceManager.ArmDeletedNoContentResponse) +- [`ArmDeletedResponse`](./data-types.md#Azure.ResourceManager.ArmDeletedResponse) +- [`ArmNoContentResponse`](./data-types.md#Azure.ResourceManager.ArmNoContentResponse) +- [`ArmResourceCreatedResponse`](./data-types.md#Azure.ResourceManager.ArmResourceCreatedResponse) +- [`ArmResourceCreatedSyncResponse`](./data-types.md#Azure.ResourceManager.ArmResourceCreatedSyncResponse) +- [`ArmResourceUpdatedResponse`](./data-types.md#Azure.ResourceManager.ArmResourceUpdatedResponse) +- [`ArmResponse`](./data-types.md#Azure.ResourceManager.ArmResponse) +- [`CustomerManagedKeyEncryption`](./data-types.md#Azure.ResourceManager.CustomerManagedKeyEncryption) +- [`DefaultProvisioningStateProperty`](./data-types.md#Azure.ResourceManager.DefaultProvisioningStateProperty) +- [`Encryption`](./data-types.md#Azure.ResourceManager.Encryption) +- [`EncryptionConfiguration`](./data-types.md#Azure.ResourceManager.EncryptionConfiguration) +- [`EntityTag`](./data-types.md#Azure.ResourceManager.EntityTag) +- [`ErrorResponse`](./data-types.md#Azure.ResourceManager.ErrorResponse) +- [`ExtensionResource`](./data-types.md#Azure.ResourceManager.ExtensionResource) +- [`KeysOf`](./data-types.md#Azure.ResourceManager.KeysOf) +- [`LocationParameter`](./data-types.md#Azure.ResourceManager.LocationParameter) +- [`ManagedBy`](./data-types.md#Azure.ResourceManager.ManagedBy) +- [`ManagedServiceIdentity`](./data-types.md#Azure.ResourceManager.ManagedServiceIdentity) +- [`ManagedSystemAssignedIdentity`](./data-types.md#Azure.ResourceManager.ManagedSystemAssignedIdentity) +- [`ParentKeysOf`](./data-types.md#Azure.ResourceManager.ParentKeysOf) +- [`PrivateEndpoint`](./data-types.md#Azure.ResourceManager.PrivateEndpoint) +- [`PrivateEndpointConnection`](./data-types.md#Azure.ResourceManager.PrivateEndpointConnection) +- [`PrivateEndpointConnectionParameter`](./data-types.md#Azure.ResourceManager.PrivateEndpointConnectionParameter) +- [`PrivateEndpointConnectionProperties`](./data-types.md#Azure.ResourceManager.PrivateEndpointConnectionProperties) +- [`PrivateEndpointConnectionResourceListResult`](./data-types.md#Azure.ResourceManager.PrivateEndpointConnectionResourceListResult) +- [`PrivateLinkResource`](./data-types.md#Azure.ResourceManager.PrivateLinkResource) +- [`PrivateLinkResourceListResult`](./data-types.md#Azure.ResourceManager.PrivateLinkResourceListResult) +- [`PrivateLinkResourceParameter`](./data-types.md#Azure.ResourceManager.PrivateLinkResourceParameter) +- [`PrivateLinkResourceProperties`](./data-types.md#Azure.ResourceManager.PrivateLinkResourceProperties) +- [`PrivateLinkServiceConnectionState`](./data-types.md#Azure.ResourceManager.PrivateLinkServiceConnectionState) +- [`ProviderNamespace`](./data-types.md#Azure.ResourceManager.ProviderNamespace) +- [`ProxyResource`](./data-types.md#Azure.ResourceManager.ProxyResource) +- [`ResourceGroupParameter`](./data-types.md#Azure.ResourceManager.ResourceGroupParameter) +- [`ResourceIdentifierAllowedResource`](./data-types.md#Azure.ResourceManager.ResourceIdentifierAllowedResource) +- [`ResourceInstanceParameters`](./data-types.md#Azure.ResourceManager.ResourceInstanceParameters) +- [`ResourceKind`](./data-types.md#Azure.ResourceManager.ResourceKind) +- [`ResourceListResult`](./data-types.md#Azure.ResourceManager.ResourceListResult) +- [`ResourceParentParameters`](./data-types.md#Azure.ResourceManager.ResourceParentParameters) +- [`ResourcePlan`](./data-types.md#Azure.ResourceManager.ResourcePlan) +- [`ResourceSku`](./data-types.md#Azure.ResourceManager.ResourceSku) +- [`ResourceUriParameter`](./data-types.md#Azure.ResourceManager.ResourceUriParameter) +- [`SubscriptionIdParameter`](./data-types.md#Azure.ResourceManager.SubscriptionIdParameter) +- [`TrackedResource`](./data-types.md#Azure.ResourceManager.TrackedResource) + +## Azure.ResourceManager.CommonTypes + +## Azure.ResourceManager.Foundations + +### Operations + +- [`checkNameAvailability`](./interfaces.md#Azure.ResourceManager.Foundations.checkNameAvailability) + +### Models + +- [`ArmResource`](./data-types.md#Azure.ResourceManager.Foundations.ArmResource) +- [`ArmTagsProperty`](./data-types.md#Azure.ResourceManager.Foundations.ArmTagsProperty) +- [`BaseParameters`](./data-types.md#Azure.ResourceManager.Foundations.BaseParameters) +- [`CheckNameAvailabilityRequest`](./data-types.md#Azure.ResourceManager.Foundations.CheckNameAvailabilityRequest) +- [`CheckNameAvailabilityResponse`](./data-types.md#Azure.ResourceManager.Foundations.CheckNameAvailabilityResponse) +- [`ErrorAdditionalInfo`](./data-types.md#Azure.ResourceManager.Foundations.ErrorAdditionalInfo) +- [`ErrorDetail`](./data-types.md#Azure.ResourceManager.Foundations.ErrorDetail) +- [`ExtensionBaseParameters`](./data-types.md#Azure.ResourceManager.Foundations.ExtensionBaseParameters) +- [`ExtensionResourceBase`](./data-types.md#Azure.ResourceManager.Foundations.ExtensionResourceBase) +- [`ExtensionScope`](./data-types.md#Azure.ResourceManager.Foundations.ExtensionScope) +- [`LocationBaseParameters`](./data-types.md#Azure.ResourceManager.Foundations.LocationBaseParameters) +- [`LocationScope`](./data-types.md#Azure.ResourceManager.Foundations.LocationScope) +- [`ManagedIdentityProperties`](./data-types.md#Azure.ResourceManager.Foundations.ManagedIdentityProperties) +- [`ManagedSystemIdentityProperties`](./data-types.md#Azure.ResourceManager.Foundations.ManagedSystemIdentityProperties) +- [`Operation`](./data-types.md#Azure.ResourceManager.Foundations.Operation) +- [`OperationDisplay`](./data-types.md#Azure.ResourceManager.Foundations.OperationDisplay) +- [`OperationIdParameter`](./data-types.md#Azure.ResourceManager.Foundations.OperationIdParameter) +- [`OperationListResult`](./data-types.md#Azure.ResourceManager.Foundations.OperationListResult) +- [`OperationStatusResult`](./data-types.md#Azure.ResourceManager.Foundations.OperationStatusResult) +- [`ProxyResourceBase`](./data-types.md#Azure.ResourceManager.Foundations.ProxyResourceBase) +- [`ProxyResourceUpdateModel`](./data-types.md#Azure.ResourceManager.Foundations.ProxyResourceUpdateModel) +- [`ResourceGroupBaseParameters`](./data-types.md#Azure.ResourceManager.Foundations.ResourceGroupBaseParameters) +- [`ResourceGroupScope`](./data-types.md#Azure.ResourceManager.Foundations.ResourceGroupScope) +- [`ResourcePlanType`](./data-types.md#Azure.ResourceManager.Foundations.ResourcePlanType) +- [`ResourceSkuType`](./data-types.md#Azure.ResourceManager.Foundations.ResourceSkuType) +- [`ResourceUpdateModel`](./data-types.md#Azure.ResourceManager.Foundations.ResourceUpdateModel) +- [`ResourceUpdateModelProperties`](./data-types.md#Azure.ResourceManager.Foundations.ResourceUpdateModelProperties) +- [`SubscriptionBaseParameters`](./data-types.md#Azure.ResourceManager.Foundations.SubscriptionBaseParameters) +- [`SubscriptionScope`](./data-types.md#Azure.ResourceManager.Foundations.SubscriptionScope) +- [`SystemData`](./data-types.md#Azure.ResourceManager.Foundations.SystemData) +- [`TagsUpdateModel`](./data-types.md#Azure.ResourceManager.Foundations.TagsUpdateModel) +- [`TenantBaseParameters`](./data-types.md#Azure.ResourceManager.Foundations.TenantBaseParameters) +- [`TenantScope`](./data-types.md#Azure.ResourceManager.Foundations.TenantScope) +- [`TrackedResourceBase`](./data-types.md#Azure.ResourceManager.Foundations.TrackedResourceBase) +- [`UserAssignedIdentity`](./data-types.md#Azure.ResourceManager.Foundations.UserAssignedIdentity) diff --git a/docs/libraries/azure-resource-manager/reference/interfaces.md b/docs/libraries/azure-resource-manager/reference/interfaces.md new file mode 100644 index 0000000000..54082c820c --- /dev/null +++ b/docs/libraries/azure-resource-manager/reference/interfaces.md @@ -0,0 +1,957 @@ +--- +title: "Interfaces and Operations" +toc_min_heading_level: 2 +toc_max_heading_level: 3 +--- + +# Interfaces and Operations + +## Azure.ResourceManager + +### `ExtensionResourceCollectionOperations` {#Azure.ResourceManager.ExtensionResourceCollectionOperations} + +A composite interface for resource collections that include a paginated list operation. + +```typespec +interface Azure.ResourceManager.ExtensionResourceCollectionOperations +``` + +#### Template Parameters + +| Name | Description | +| --------- | ---------------------------------------------- | +| TResource | The ArmResource that provides these operations | + +#### `ExtensionResourceCollectionOperations.list` {#Azure.ResourceManager.ExtensionResourceCollectionOperations.list} + +```typespec +op Azure.ResourceManager.ExtensionResourceCollectionOperations.list(apiVersion: string, resourceUri: string, provider: Microsoft.ThisWillBeReplaced): Azure.ResourceManager.ArmResponse> | Azure.ResourceManager.ErrorResponse +``` + +### `ExtensionResourceInstanceOperations` {#Azure.ResourceManager.ExtensionResourceInstanceOperations} + +A composite interface for resources that includes CRUD operations. + +```typespec +interface Azure.ResourceManager.ExtensionResourceInstanceOperations +``` + +#### Template Parameters + +| Name | Description | +| ----------- | ---------------------------------------------- | +| TResource | The ArmResource that provides these operations | +| TProperties | RP-specific property bag for the resource | + +#### `ExtensionResourceInstanceOperations.get` {#Azure.ResourceManager.ExtensionResourceInstanceOperations.get} + +```typespec +op Azure.ResourceManager.ExtensionResourceInstanceOperations.get(apiVersion: string, resourceUri: string, provider: Microsoft.ThisWillBeReplaced): Azure.ResourceManager.ArmResponse | Azure.ResourceManager.ErrorResponse +``` + +#### `ExtensionResourceInstanceOperations.createOrUpdate` {#Azure.ResourceManager.ExtensionResourceInstanceOperations.createOrUpdate} + +```typespec +op Azure.ResourceManager.ExtensionResourceInstanceOperations.createOrUpdate(apiVersion: string, resourceUri: string, provider: Microsoft.ThisWillBeReplaced, resource: TResource): Azure.ResourceManager.ArmResourceUpdatedResponse | Azure.ResourceManager.ArmResourceCreatedResponse | Azure.ResourceManager.ErrorResponse +``` + +#### `ExtensionResourceInstanceOperations.update` {#Azure.ResourceManager.ExtensionResourceInstanceOperations.update} + +```typespec +op Azure.ResourceManager.ExtensionResourceInstanceOperations.update(apiVersion: string, resourceUri: string, provider: Microsoft.ThisWillBeReplaced, properties: Azure.ResourceManager.Foundations.ResourceUpdateModel): Azure.ResourceManager.ArmResponse | Azure.ResourceManager.ErrorResponse +``` + +#### `ExtensionResourceInstanceOperations.delete` {#Azure.ResourceManager.ExtensionResourceInstanceOperations.delete} + +```typespec +op Azure.ResourceManager.ExtensionResourceInstanceOperations.delete(apiVersion: string, resourceUri: string, provider: Microsoft.ThisWillBeReplaced): Azure.ResourceManager.ArmDeletedResponse | Azure.ResourceManager.ArmDeleteAcceptedLroResponse | Azure.ResourceManager.ArmDeletedNoContentResponse | Azure.ResourceManager.ErrorResponse +``` + +### `ExtensionResourceOperations` {#Azure.ResourceManager.ExtensionResourceOperations} + +A composite interface for resources that include CRUD and list operations. + +```typespec +interface Azure.ResourceManager.ExtensionResourceOperations +``` + +#### Template Parameters + +| Name | Description | +| ----------- | ---------------------------------------------- | +| TResource | The ArmResource that provides these operations | +| TProperties | RP-specific property bag for the resource | + +#### `ExtensionResourceOperations.get` {#Azure.ResourceManager.ExtensionResourceOperations.get} + +```typespec +op Azure.ResourceManager.ExtensionResourceOperations.get(apiVersion: string, resourceUri: string, provider: Microsoft.ThisWillBeReplaced): Azure.ResourceManager.ArmResponse | Azure.ResourceManager.ErrorResponse +``` + +#### `ExtensionResourceOperations.createOrUpdate` {#Azure.ResourceManager.ExtensionResourceOperations.createOrUpdate} + +```typespec +op Azure.ResourceManager.ExtensionResourceOperations.createOrUpdate(apiVersion: string, resourceUri: string, provider: Microsoft.ThisWillBeReplaced, resource: TResource): Azure.ResourceManager.ArmResourceUpdatedResponse | Azure.ResourceManager.ArmResourceCreatedResponse | Azure.ResourceManager.ErrorResponse +``` + +#### `ExtensionResourceOperations.update` {#Azure.ResourceManager.ExtensionResourceOperations.update} + +```typespec +op Azure.ResourceManager.ExtensionResourceOperations.update(apiVersion: string, resourceUri: string, provider: Microsoft.ThisWillBeReplaced, properties: Azure.ResourceManager.Foundations.ResourceUpdateModel): Azure.ResourceManager.ArmResponse | Azure.ResourceManager.ErrorResponse +``` + +#### `ExtensionResourceOperations.delete` {#Azure.ResourceManager.ExtensionResourceOperations.delete} + +```typespec +op Azure.ResourceManager.ExtensionResourceOperations.delete(apiVersion: string, resourceUri: string, provider: Microsoft.ThisWillBeReplaced): Azure.ResourceManager.ArmDeletedResponse | Azure.ResourceManager.ArmDeleteAcceptedLroResponse | Azure.ResourceManager.ArmDeletedNoContentResponse | Azure.ResourceManager.ErrorResponse +``` + +#### `ExtensionResourceOperations.list` {#Azure.ResourceManager.ExtensionResourceOperations.list} + +```typespec +op Azure.ResourceManager.ExtensionResourceOperations.list(apiVersion: string, resourceUri: string, provider: Microsoft.ThisWillBeReplaced): Azure.ResourceManager.ArmResponse> | Azure.ResourceManager.ErrorResponse +``` + +### `Operations` {#Azure.ResourceManager.Operations} + +This is the interface that implements the standard ARM operation that returns +all supported RP operations. You should have exactly one declaration for each +ARM service. It implements +GET "/providers/Microsoft.ContosoProviderHub/operations" + +```typespec +interface Azure.ResourceManager.Operations<> +``` + +#### `Operations.list` {#Azure.ResourceManager.Operations.list} + +List the operations for the provider + +```typespec +op Azure.ResourceManager.Operations.list(apiVersion: string, provider: Microsoft.ThisWillBeReplaced): Azure.ResourceManager.ArmResponse | Azure.ResourceManager.ErrorResponse +``` + +### `ProxyResourceOperations` {#Azure.ResourceManager.ProxyResourceOperations} + +A composite interface for Proxy resources that include `ResourceInstanceOperations` +and `ResourceListByParent`. It includes: `GET`, `PUT`, `PATCH`, `DELETE`, ListByParent operations. + +The actual route depends on the resource model but would have started with +`/subscriptions/{id}/resourcegroups/{rg}/providers/Microsoft.XXX/...` + +This is the most common API pattern for Proxy Resources to use. + +```typespec +interface Azure.ResourceManager.ProxyResourceOperations +``` + +#### Template Parameters + +| Name | Description | +| --------------- | ------------------------------------------------ | +| TResource | the ArmResource that provides these operations | +| TBaseParameters | The http parameters that are part of the request | + +#### `ProxyResourceOperations.get` {#Azure.ResourceManager.ProxyResourceOperations.get} + +```typespec +op Azure.ResourceManager.ProxyResourceOperations.get(provider: Microsoft.ThisWillBeReplaced): Azure.ResourceManager.ArmResponse | Azure.ResourceManager.ErrorResponse +``` + +#### `ProxyResourceOperations.createOrUpdate` {#Azure.ResourceManager.ProxyResourceOperations.createOrUpdate} + +```typespec +op Azure.ResourceManager.ProxyResourceOperations.createOrUpdate(provider: Microsoft.ThisWillBeReplaced, resource: TResource): Azure.ResourceManager.ArmResourceUpdatedResponse | Azure.ResourceManager.ArmResourceCreatedResponse | Azure.ResourceManager.ErrorResponse +``` + +#### `ProxyResourceOperations.delete` {#Azure.ResourceManager.ProxyResourceOperations.delete} + +```typespec +op Azure.ResourceManager.ProxyResourceOperations.delete(provider: Microsoft.ThisWillBeReplaced): Azure.ResourceManager.ArmDeletedResponse | Azure.ResourceManager.ArmDeleteAcceptedLroResponse | Azure.ResourceManager.ArmDeletedNoContentResponse | Azure.ResourceManager.ErrorResponse +``` + +#### `ProxyResourceOperations.listByResourceGroup` {#Azure.ResourceManager.ProxyResourceOperations.listByResourceGroup} + +```typespec +op Azure.ResourceManager.ProxyResourceOperations.listByResourceGroup(provider: Microsoft.ThisWillBeReplaced): Azure.ResourceManager.ArmResponse> | Azure.ResourceManager.ErrorResponse +``` + +### `ResourceCollectionOperations` {#Azure.ResourceManager.ResourceCollectionOperations} + +A composite interface for resource collections. + +```typespec +interface Azure.ResourceManager.ResourceCollectionOperations +``` + +#### Template Parameters + +| Name | Description | +| --------------- | ------------------------------------------------ | +| TResource | The ArmResource that provides these operations | +| TBaseParameters | The http parameters that are part of the request | + +#### `ResourceCollectionOperations.listByResourceGroup` {#Azure.ResourceManager.ResourceCollectionOperations.listByResourceGroup} + +```typespec +op Azure.ResourceManager.ResourceCollectionOperations.listByResourceGroup(provider: Microsoft.ThisWillBeReplaced): Azure.ResourceManager.ArmResponse> | Azure.ResourceManager.ErrorResponse +``` + +#### `ResourceCollectionOperations.listBySubscription` {#Azure.ResourceManager.ResourceCollectionOperations.listBySubscription} + +```typespec +op Azure.ResourceManager.ResourceCollectionOperations.listBySubscription(apiVersion: string, subscriptionId: string, provider: Microsoft.ThisWillBeReplaced): Azure.ResourceManager.ArmResponse> | Azure.ResourceManager.ErrorResponse +``` + +### `ResourceCreateAsync` {#Azure.ResourceManager.ResourceCreateAsync} + +A composite interface for resources that include a long-running create or update operation. + +```typespec +interface Azure.ResourceManager.ResourceCreateAsync +``` + +#### Template Parameters + +| Name | Description | +| --------------- | ------------------------------------------------ | +| TResource | The ArmResource that provides these operations | +| TBaseParameters | The http parameters that are part of the request | + +#### `ResourceCreateAsync.createOrUpdate` {#Azure.ResourceManager.ResourceCreateAsync.createOrUpdate} + +```typespec +op Azure.ResourceManager.ResourceCreateAsync.createOrUpdate(provider: Microsoft.ThisWillBeReplaced, resource: TResource): Azure.ResourceManager.ArmResourceUpdatedResponse | Azure.ResourceManager.ArmResourceCreatedResponse | Azure.ResourceManager.ErrorResponse +``` + +### `ResourceCreateSync` {#Azure.ResourceManager.ResourceCreateSync} + +A composite interface for resources that include a synchronous create or update operation. + +```typespec +interface Azure.ResourceManager.ResourceCreateSync +``` + +#### Template Parameters + +| Name | Description | +| --------------- | ------------------------------------------------ | +| TResource | The ArmResource that provides these operations | +| TBaseParameters | The http parameters that are part of the request | + +#### `ResourceCreateSync.createOrUpdate` {#Azure.ResourceManager.ResourceCreateSync.createOrUpdate} + +```typespec +op Azure.ResourceManager.ResourceCreateSync.createOrUpdate(provider: Microsoft.ThisWillBeReplaced, resource: TResource): Azure.ResourceManager.ArmResponse | Azure.ResourceManager.ErrorResponse +``` + +### `ResourceDeleteAsync` {#Azure.ResourceManager.ResourceDeleteAsync} + +```typespec +interface Azure.ResourceManager.ResourceDeleteAsync +``` + +#### Template Parameters + +| Name | Description | +| --------------- | ------------------------------------------------ | +| TResource | The ArmResource that provides these operations | +| TBaseParameters | The http parameters that are part of the request | + +#### `ResourceDeleteAsync.delete` {#Azure.ResourceManager.ResourceDeleteAsync.delete} + +```typespec +op Azure.ResourceManager.ResourceDeleteAsync.delete(provider: Microsoft.ThisWillBeReplaced): Azure.ResourceManager.ArmDeletedResponse | Azure.ResourceManager.ArmDeleteAcceptedLroResponse | Azure.ResourceManager.ArmDeletedNoContentResponse | Azure.ResourceManager.ErrorResponse +``` + +### `ResourceDeleteSync` {#Azure.ResourceManager.ResourceDeleteSync} + +A composite interface for resources that include a synchronous delete operation. + +```typespec +interface Azure.ResourceManager.ResourceDeleteSync +``` + +#### Template Parameters + +| Name | Description | +| --------------- | ------------------------------------------------ | +| TResource | The ArmResource that provides these operations | +| TBaseParameters | The http parameters that are part of the request | + +#### `ResourceDeleteSync.delete` {#Azure.ResourceManager.ResourceDeleteSync.delete} + +```typespec +op Azure.ResourceManager.ResourceDeleteSync.delete(provider: Microsoft.ThisWillBeReplaced): Azure.ResourceManager.ArmDeletedResponse | Azure.ResourceManager.ArmDeletedNoContentResponse | Azure.ResourceManager.ErrorResponse +``` + +### `ResourceDeleteWithoutOkAsync` {#Azure.ResourceManager.ResourceDeleteWithoutOkAsync} + +```typespec +interface Azure.ResourceManager.ResourceDeleteWithoutOkAsync +``` + +#### Template Parameters + +| Name | Description | +| --------------- | ------------------------------------------------ | +| TResource | The ArmResource that provides these operations | +| TBaseParameters | The http parameters that are part of the request | + +#### `ResourceDeleteWithoutOkAsync.delete` {#Azure.ResourceManager.ResourceDeleteWithoutOkAsync.delete} + +```typespec +op Azure.ResourceManager.ResourceDeleteWithoutOkAsync.delete(provider: Microsoft.ThisWillBeReplaced): Azure.ResourceManager.ArmDeleteAcceptedLroResponse | Azure.ResourceManager.ArmDeletedNoContentResponse | Azure.ResourceManager.ErrorResponse +``` + +### `ResourceInstanceOperations` {#Azure.ResourceManager.ResourceInstanceOperations} + +A composite interface for resources that have CRUD operations. + +```typespec +interface Azure.ResourceManager.ResourceInstanceOperations +``` + +#### Template Parameters + +| Name | Description | +| --------------- | ------------------------------------------------ | +| TResource | The ArmResource that provides these operations | +| TProperties | RP-specific property bag for the resource | +| TBaseParameters | The http parameters that are part of the request | +| TPatchModel | The model used for PATCH operations | + +#### `ResourceInstanceOperations.get` {#Azure.ResourceManager.ResourceInstanceOperations.get} + +```typespec +op Azure.ResourceManager.ResourceInstanceOperations.get(provider: Microsoft.ThisWillBeReplaced): Azure.ResourceManager.ArmResponse | Azure.ResourceManager.ErrorResponse +``` + +#### `ResourceInstanceOperations.createOrUpdate` {#Azure.ResourceManager.ResourceInstanceOperations.createOrUpdate} + +```typespec +op Azure.ResourceManager.ResourceInstanceOperations.createOrUpdate(provider: Microsoft.ThisWillBeReplaced, resource: TResource): Azure.ResourceManager.ArmResourceUpdatedResponse | Azure.ResourceManager.ArmResourceCreatedResponse | Azure.ResourceManager.ErrorResponse +``` + +#### `ResourceInstanceOperations.update` {#Azure.ResourceManager.ResourceInstanceOperations.update} + +```typespec +op Azure.ResourceManager.ResourceInstanceOperations.update(provider: Microsoft.ThisWillBeReplaced, properties: Azure.ResourceManager.Foundations.ResourceUpdateModel): Azure.ResourceManager.ArmResponse | Azure.ResourceManager.ErrorResponse +``` + +#### `ResourceInstanceOperations.delete` {#Azure.ResourceManager.ResourceInstanceOperations.delete} + +```typespec +op Azure.ResourceManager.ResourceInstanceOperations.delete(provider: Microsoft.ThisWillBeReplaced): Azure.ResourceManager.ArmDeletedResponse | Azure.ResourceManager.ArmDeleteAcceptedLroResponse | Azure.ResourceManager.ArmDeletedNoContentResponse | Azure.ResourceManager.ErrorResponse +``` + +### `ResourceListByParent` {#Azure.ResourceManager.ResourceListByParent} + +An interface for resources which can be listed by parent. + +```typespec +interface Azure.ResourceManager.ResourceListByParent +``` + +#### Template Parameters + +| Name | Description | +| ------------------- | ------------------------------------------------ | +| TResource | The ArmResource that provides these operations | +| TBaseParameters | The http parameters that are part of the request | +| TParentName | The name of the parent resource | +| TParentFriendlyName | The friendly name of the parent resource | + +#### `ResourceListByParent.listByParent` {#Azure.ResourceManager.ResourceListByParent.listByParent} + +```typespec +op Azure.ResourceManager.ResourceListByParent.listByParent(provider: Microsoft.ThisWillBeReplaced): Azure.ResourceManager.ArmResponse> | Azure.ResourceManager.ErrorResponse +``` + +### `ResourceListBySubscription` {#Azure.ResourceManager.ResourceListBySubscription} + +An interface for resources with can be listed by subscription. + +```typespec +interface Azure.ResourceManager.ResourceListBySubscription +``` + +#### Template Parameters + +| Name | Description | +| --------- | ---------------------------------------------- | +| TResource | The ArmResource that provides these operations | + +#### `ResourceListBySubscription.listBySubscription` {#Azure.ResourceManager.ResourceListBySubscription.listBySubscription} + +```typespec +op Azure.ResourceManager.ResourceListBySubscription.listBySubscription(apiVersion: string, subscriptionId: string, provider: Microsoft.ThisWillBeReplaced): Azure.ResourceManager.ArmResponse> | Azure.ResourceManager.ErrorResponse +``` + +### `ResourceOperations` {#Azure.ResourceManager.ResourceOperations} + +```typespec +interface Azure.ResourceManager.ResourceOperations +``` + +#### Template Parameters + +| Name | Description | +| --------------- | ------------------------------------------------ | +| TResource | the ArmResource that provides these operations | +| TProperties | RP-specific property bag for the resource | +| TBaseParameters | The http parameters that are part of the request | + +#### `ResourceOperations.get` {#Azure.ResourceManager.ResourceOperations.get} + +```typespec +op Azure.ResourceManager.ResourceOperations.get(provider: Microsoft.ThisWillBeReplaced): Azure.ResourceManager.ArmResponse | Azure.ResourceManager.ErrorResponse +``` + +#### `ResourceOperations.createOrUpdate` {#Azure.ResourceManager.ResourceOperations.createOrUpdate} + +```typespec +op Azure.ResourceManager.ResourceOperations.createOrUpdate(provider: Microsoft.ThisWillBeReplaced, resource: TResource): Azure.ResourceManager.ArmResourceUpdatedResponse | Azure.ResourceManager.ArmResourceCreatedResponse | Azure.ResourceManager.ErrorResponse +``` + +#### `ResourceOperations.update` {#Azure.ResourceManager.ResourceOperations.update} + +```typespec +op Azure.ResourceManager.ResourceOperations.update(provider: Microsoft.ThisWillBeReplaced, properties: Azure.ResourceManager.Foundations.ResourceUpdateModel): Azure.ResourceManager.ArmResponse | Azure.ResourceManager.ErrorResponse +``` + +#### `ResourceOperations.delete` {#Azure.ResourceManager.ResourceOperations.delete} + +```typespec +op Azure.ResourceManager.ResourceOperations.delete(provider: Microsoft.ThisWillBeReplaced): Azure.ResourceManager.ArmDeletedResponse | Azure.ResourceManager.ArmDeleteAcceptedLroResponse | Azure.ResourceManager.ArmDeletedNoContentResponse | Azure.ResourceManager.ErrorResponse +``` + +#### `ResourceOperations.listByResourceGroup` {#Azure.ResourceManager.ResourceOperations.listByResourceGroup} + +```typespec +op Azure.ResourceManager.ResourceOperations.listByResourceGroup(provider: Microsoft.ThisWillBeReplaced): Azure.ResourceManager.ArmResponse> | Azure.ResourceManager.ErrorResponse +``` + +#### `ResourceOperations.listBySubscription` {#Azure.ResourceManager.ResourceOperations.listBySubscription} + +```typespec +op Azure.ResourceManager.ResourceOperations.listBySubscription(apiVersion: string, subscriptionId: string, provider: Microsoft.ThisWillBeReplaced): Azure.ResourceManager.ArmResponse> | Azure.ResourceManager.ErrorResponse +``` + +### `ResourceRead` {#Azure.ResourceManager.ResourceRead} + +A composite interface for resources that include a GET operation. + +```typespec +interface Azure.ResourceManager.ResourceRead +``` + +#### Template Parameters + +| Name | Description | +| --------------- | ------------------------------------------------ | +| TResource | The ArmResource that provides these operations | +| TBaseParameters | The http parameters that are part of the request | + +#### `ResourceRead.get` {#Azure.ResourceManager.ResourceRead.get} + +```typespec +op Azure.ResourceManager.ResourceRead.get(provider: Microsoft.ThisWillBeReplaced): Azure.ResourceManager.ArmResponse | Azure.ResourceManager.ErrorResponse +``` + +### `ResourceUpdateAsync` {#Azure.ResourceManager.ResourceUpdateAsync} + +```typespec +interface Azure.ResourceManager.ResourceUpdateAsync +``` + +#### Template Parameters + +| Name | Description | +| --------------- | ------------------------------------------------ | +| TResource | The ArmResource that provides these operations | +| TProperties | RP-specific property bag for the resource | +| TBaseParameters | The http parameters that are part of the request | + +#### `ResourceUpdateAsync.update` {#Azure.ResourceManager.ResourceUpdateAsync.update} + +```typespec +op Azure.ResourceManager.ResourceUpdateAsync.update(provider: Microsoft.ThisWillBeReplaced, properties: Azure.ResourceManager.Foundations.ResourceUpdateModel): Azure.ResourceManager.ArmResponse | Azure.ResourceManager.ArmAcceptedLroResponse | Azure.ResourceManager.ErrorResponse +``` + +### `ResourceUpdateSync` {#Azure.ResourceManager.ResourceUpdateSync} + +A composite interface for resources that include a synchronous update operation. + +```typespec +interface Azure.ResourceManager.ResourceUpdateSync +``` + +#### Template Parameters + +| Name | Description | +| --------------- | ------------------------------------------------ | +| TResource | The ArmResource that provides these operations | +| TProperties | RP-specific property bag for the resource | +| TBaseParameters | The http parameters that are part of the request | + +#### `ResourceUpdateSync.update` {#Azure.ResourceManager.ResourceUpdateSync.update} + +```typespec +op Azure.ResourceManager.ResourceUpdateSync.update(provider: Microsoft.ThisWillBeReplaced, properties: Azure.ResourceManager.Foundations.ResourceUpdateModel): Azure.ResourceManager.ArmResponse | Azure.ResourceManager.ErrorResponse +``` + +### `TenantResourceOperations` {#Azure.ResourceManager.TenantResourceOperations} + +A composite interface for Tenant resources that include `ResourceInstanceOperations` +and `ResourceListByParent`. It includes: `GET`, `PUT`, `PATCH`, `DELETE`, ListByParent operations. + +The routes are always start at root level: +`/providers/Microsoft.XXX/...` + +This is the most common API pattern for Tenant Resources to use. + +```typespec +interface Azure.ResourceManager.TenantResourceOperations +``` + +#### Template Parameters + +| Name | Description | +| ----------- | ---------------------------------------------- | +| TResource | the ArmResource that provides these operations | +| TProperties | RP-specific property bag for the resource | + +#### `TenantResourceOperations.get` {#Azure.ResourceManager.TenantResourceOperations.get} + +```typespec +op Azure.ResourceManager.TenantResourceOperations.get(apiVersion: string, provider: Microsoft.ThisWillBeReplaced): Azure.ResourceManager.ArmResponse | Azure.ResourceManager.ErrorResponse +``` + +#### `TenantResourceOperations.createOrUpdate` {#Azure.ResourceManager.TenantResourceOperations.createOrUpdate} + +```typespec +op Azure.ResourceManager.TenantResourceOperations.createOrUpdate(apiVersion: string, provider: Microsoft.ThisWillBeReplaced, resource: TResource): Azure.ResourceManager.ArmResourceUpdatedResponse | Azure.ResourceManager.ArmResourceCreatedResponse | Azure.ResourceManager.ErrorResponse +``` + +#### `TenantResourceOperations.update` {#Azure.ResourceManager.TenantResourceOperations.update} + +```typespec +op Azure.ResourceManager.TenantResourceOperations.update(apiVersion: string, provider: Microsoft.ThisWillBeReplaced, properties: Azure.ResourceManager.Foundations.ResourceUpdateModel): Azure.ResourceManager.ArmResponse | Azure.ResourceManager.ErrorResponse +``` + +#### `TenantResourceOperations.delete` {#Azure.ResourceManager.TenantResourceOperations.delete} + +```typespec +op Azure.ResourceManager.TenantResourceOperations.delete(apiVersion: string, provider: Microsoft.ThisWillBeReplaced): Azure.ResourceManager.ArmDeletedResponse | Azure.ResourceManager.ArmDeleteAcceptedLroResponse | Azure.ResourceManager.ArmDeletedNoContentResponse | Azure.ResourceManager.ErrorResponse +``` + +#### `TenantResourceOperations.listByTenant` {#Azure.ResourceManager.TenantResourceOperations.listByTenant} + +```typespec +op Azure.ResourceManager.TenantResourceOperations.listByTenant(apiVersion: string, provider: Microsoft.ThisWillBeReplaced): Azure.ResourceManager.ArmResponse> | Azure.ResourceManager.ErrorResponse +``` + +### `TrackedResourceOperations` {#Azure.ResourceManager.TrackedResourceOperations} + +A composite interface for resources that include `ResourceInstanceOperations` +and `ResourceCollectionOperations`. It includes: `GET`, `PUT`, `PATCH`, `DELETE`, ListByParent, +ListBySubscription operations. The actual route depends on the resource model. +This is the most common API pattern for Tracked Resources to use. + +```typespec +interface Azure.ResourceManager.TrackedResourceOperations +``` + +#### Template Parameters + +| Name | Description | +| --------------- | ------------------------------------------------ | +| TResource | the ArmResource that provides these operations | +| TProperties | RP-specific property bag for the resource | +| TBaseParameters | The http parameters that are part of the request | + +#### `TrackedResourceOperations.get` {#Azure.ResourceManager.TrackedResourceOperations.get} + +```typespec +op Azure.ResourceManager.TrackedResourceOperations.get(provider: Microsoft.ThisWillBeReplaced): Azure.ResourceManager.ArmResponse | Azure.ResourceManager.ErrorResponse +``` + +#### `TrackedResourceOperations.createOrUpdate` {#Azure.ResourceManager.TrackedResourceOperations.createOrUpdate} + +```typespec +op Azure.ResourceManager.TrackedResourceOperations.createOrUpdate(provider: Microsoft.ThisWillBeReplaced, resource: TResource): Azure.ResourceManager.ArmResourceUpdatedResponse | Azure.ResourceManager.ArmResourceCreatedResponse | Azure.ResourceManager.ErrorResponse +``` + +#### `TrackedResourceOperations.update` {#Azure.ResourceManager.TrackedResourceOperations.update} + +```typespec +op Azure.ResourceManager.TrackedResourceOperations.update(provider: Microsoft.ThisWillBeReplaced, properties: Azure.ResourceManager.Foundations.ResourceUpdateModel): Azure.ResourceManager.ArmResponse | Azure.ResourceManager.ErrorResponse +``` + +#### `TrackedResourceOperations.delete` {#Azure.ResourceManager.TrackedResourceOperations.delete} + +```typespec +op Azure.ResourceManager.TrackedResourceOperations.delete(provider: Microsoft.ThisWillBeReplaced): Azure.ResourceManager.ArmDeletedResponse | Azure.ResourceManager.ArmDeleteAcceptedLroResponse | Azure.ResourceManager.ArmDeletedNoContentResponse | Azure.ResourceManager.ErrorResponse +``` + +#### `TrackedResourceOperations.listByResourceGroup` {#Azure.ResourceManager.TrackedResourceOperations.listByResourceGroup} + +```typespec +op Azure.ResourceManager.TrackedResourceOperations.listByResourceGroup(provider: Microsoft.ThisWillBeReplaced): Azure.ResourceManager.ArmResponse> | Azure.ResourceManager.ErrorResponse +``` + +#### `TrackedResourceOperations.listBySubscription` {#Azure.ResourceManager.TrackedResourceOperations.listBySubscription} + +```typespec +op Azure.ResourceManager.TrackedResourceOperations.listBySubscription(apiVersion: string, subscriptionId: string, provider: Microsoft.ThisWillBeReplaced): Azure.ResourceManager.ArmResponse> | Azure.ResourceManager.ErrorResponse +``` + +### `ArmCustomPatchAsync` {#Azure.ResourceManager.ArmCustomPatchAsync} + +A long-running resource update using a custom PATCH payload (Asynchronous) + +```typespec +op Azure.ResourceManager.ArmCustomPatchAsync(provider: Microsoft.ThisWillBeReplaced, properties: TPatchModel): Azure.ResourceManager.ArmResponse | Azure.ResourceManager.ArmAcceptedLroResponse | Azure.ResourceManager.ErrorResponse +``` + +#### Template Parameters + +| Name | Description | +| --------------- | ---------------------------------------------------- | +| TResource | the resource being patched | +| TPatchModel | The input model for the PATCH request | +| TBaseParameters | Optional. Allows overriding the operation parameters | + +### `ArmCustomPatchSync` {#Azure.ResourceManager.ArmCustomPatchSync} + +A resource update using a custom PATCH payload (synchronous) + +```typespec +op Azure.ResourceManager.ArmCustomPatchSync(provider: Microsoft.ThisWillBeReplaced, properties: TPatchModel): Azure.ResourceManager.ArmResponse | Azure.ResourceManager.ErrorResponse +``` + +#### Template Parameters + +| Name | Description | +| --------------- | ---------------------------------------------------- | +| TResource | the resource being patched | +| TPatchModel | The input model for the PATCH request | +| TBaseParameters | Optional. Allows overriding the operation parameters | + +### `ArmListBySubscription` {#Azure.ResourceManager.ArmListBySubscription} + +A resource list operation, at the subscription scope + +```typespec +op Azure.ResourceManager.ArmListBySubscription(apiVersion: string, subscriptionId: string, provider: Microsoft.ThisWillBeReplaced): Azure.ResourceManager.ArmResponse> | Azure.ResourceManager.ErrorResponse +``` + +#### Template Parameters + +| Name | Description | +| --------- | -------------------------- | +| TResource | the resource being patched | + +### `ArmResourceActionAsync` {#Azure.ResourceManager.ArmResourceActionAsync} + +A long-running resource action. + +```typespec +op Azure.ResourceManager.ArmResourceActionAsync(provider: Microsoft.ThisWillBeReplaced, body: TRequest): Azure.ResourceManager.ArmAcceptedLroResponse | TResponse | Azure.ResourceManager.ErrorResponse +``` + +#### Template Parameters + +| Name | Description | +| --------------- | ------------------------------------------------------------ | +| TResource | The resource being acted upon | +| TRequest | The request model for the action | +| TResponse | The response model for the action | +| TBaseParameters | Optional. Allows overriding the parameters for the operation | + +### `ArmResourceActionAsyncBase` {#Azure.ResourceManager.ArmResourceActionAsyncBase} + +A long-running resource action. + +```typespec +op Azure.ResourceManager.ArmResourceActionAsyncBase(provider: Microsoft.ThisWillBeReplaced, body: TRequest): TResponse | Azure.ResourceManager.ErrorResponse +``` + +#### Template Parameters + +| Name | Description | +| --------------- | ------------------------------------------------------------ | +| TResource | The resource being acted upon | +| TRequest | The request model for the action | +| TResponse | The response type for the action | +| TBaseParameters | Optional. Allows overriding the parameters for the operation | + +### `ArmResourceActionNoContentAsync` {#Azure.ResourceManager.ArmResourceActionNoContentAsync} + +A long-running resource action that returns no content. DEPRECATED: Use 'ArmResourceActionNoResponseContentAsync' instead + +```typespec +op Azure.ResourceManager.ArmResourceActionNoContentAsync(provider: Microsoft.ThisWillBeReplaced, body: TRequest): Azure.ResourceManager.ArmAcceptedLroResponse | Azure.ResourceManager.ArmNoContentResponse | Azure.ResourceManager.ErrorResponse +``` + +#### Template Parameters + +| Name | Description | +| --------------- | ------------------------------------------------------------ | +| TResource | The resource being acted upon | +| TRequest | The request model for the action | +| TBaseParameters | Optional. Allows overriding the parameters for the operation | + +### `ArmResourceActionNoContentSync` {#Azure.ResourceManager.ArmResourceActionNoContentSync} + +A synchronous resource action that returns no content. + +```typespec +op Azure.ResourceManager.ArmResourceActionNoContentSync(provider: Microsoft.ThisWillBeReplaced, body: TRequest): Azure.ResourceManager.ArmNoContentResponse | Azure.ResourceManager.ErrorResponse +``` + +#### Template Parameters + +| Name | Description | +| --------------- | ------------------------------------------------------------ | +| TResource | The resource being acted upon | +| TRequest | The request model for the action | +| TBaseParameters | Optional. Allows overriding the parameters for the operation | + +### `ArmResourceActionNoResponseContentAsync` {#Azure.ResourceManager.ArmResourceActionNoResponseContentAsync} + +A long-running resource action that returns no content. + +```typespec +op Azure.ResourceManager.ArmResourceActionNoResponseContentAsync(provider: Microsoft.ThisWillBeReplaced, body: TRequest): Azure.ResourceManager.ArmAcceptedLroResponse | Azure.ResourceManager.ErrorResponse +``` + +#### Template Parameters + +| Name | Description | +| --------------- | ------------------------------------------------------------ | +| TResource | The resource being acted upon | +| TRequest | The request model for the action | +| TBaseParameters | Optional. Allows overriding the parameters for the operation | + +### `ArmResourceActionSync` {#Azure.ResourceManager.ArmResourceActionSync} + +A synchronous resource action. + +```typespec +op Azure.ResourceManager.ArmResourceActionSync(provider: Microsoft.ThisWillBeReplaced, body: TRequest): TResponse | Azure.ResourceManager.ErrorResponse +``` + +#### Template Parameters + +| Name | Description | +| --------------- | ------------------------------------------------------------ | +| TResource | The resource being acted upon | +| TRequest | The request model for the action | +| TResponse | The response model for the action | +| TBaseParameters | Optional. Allows overriding the parameters for the operation | + +### `ArmResourceCreateOrReplaceSync` {#Azure.ResourceManager.ArmResourceCreateOrReplaceSync} + +Synchronous PUT operation for ARM resources + +```typespec +op Azure.ResourceManager.ArmResourceCreateOrReplaceSync(provider: Microsoft.ThisWillBeReplaced, resource: TResource): Azure.ResourceManager.ArmResourceUpdatedResponse | Azure.ResourceManager.ArmResourceCreatedSyncResponse | Azure.ResourceManager.ErrorResponse +``` + +#### Template Parameters + +| Name | Description | +| --------------- | ---------------------------------------------------- | +| TResource | the resource being patched | +| TBaseParameters | Optional. Allows overriding the operation parameters | + +### `ArmResourceCreateOrUpdateAsync` {#Azure.ResourceManager.ArmResourceCreateOrUpdateAsync} + +A long-running resource CreateOrUpdate (PUT) + +```typespec +op Azure.ResourceManager.ArmResourceCreateOrUpdateAsync(provider: Microsoft.ThisWillBeReplaced, resource: TResource): Azure.ResourceManager.ArmResourceUpdatedResponse | Azure.ResourceManager.ArmResourceCreatedResponse | Azure.ResourceManager.ErrorResponse +``` + +#### Template Parameters + +| Name | Description | +| --------------- | ---------------------------------------------------- | +| TResource | the resource being patched | +| TBaseParameters | Optional. Allows overriding the operation parameters | + +### `ArmResourceCreateOrUpdateSync` {#Azure.ResourceManager.ArmResourceCreateOrUpdateSync} + +DEPRECATED: Please use ArmResourceCreateOrReplaceSync instead + +```typespec +op Azure.ResourceManager.ArmResourceCreateOrUpdateSync(provider: Microsoft.ThisWillBeReplaced, resource: TResource): Azure.ResourceManager.ArmResponse | Azure.ResourceManager.ErrorResponse +``` + +#### Template Parameters + +| Name | Description | +| --------------- | ---------------------------------------------------- | +| TResource | the resource being patched | +| TBaseParameters | Optional. Allows overriding the operation parameters | + +### `ArmResourceDeleteAsync` {#Azure.ResourceManager.ArmResourceDeleteAsync} + +```typespec +op Azure.ResourceManager.ArmResourceDeleteAsync(provider: Microsoft.ThisWillBeReplaced): Azure.ResourceManager.ArmDeletedResponse | Azure.ResourceManager.ArmDeleteAcceptedLroResponse | Azure.ResourceManager.ArmDeletedNoContentResponse | Azure.ResourceManager.ErrorResponse +``` + +#### Template Parameters + +| Name | Description | +| --------------- | ------------------------------------------------------------ | +| TResource | The resource being deleted | +| TBaseParameters | Optional. Allows overriding the parameters for the operation | + +### `ArmResourceDeleteAsyncBase` {#Azure.ResourceManager.ArmResourceDeleteAsyncBase} + +```typespec +op Azure.ResourceManager.ArmResourceDeleteAsyncBase(provider: Microsoft.ThisWillBeReplaced): TResponse | Azure.ResourceManager.ErrorResponse +``` + +#### Template Parameters + +| Name | Description | +| --------------- | ------------------------------------------------------------ | +| TResource | The resource being deleted | +| TResponse | The response type for the operation | +| TBaseParameters | Optional. Allows overriding the parameters for the operation | + +### `ArmResourceDeleteSync` {#Azure.ResourceManager.ArmResourceDeleteSync} + +Delete a resource synchronously + +```typespec +op Azure.ResourceManager.ArmResourceDeleteSync(provider: Microsoft.ThisWillBeReplaced): Azure.ResourceManager.ArmDeletedResponse | Azure.ResourceManager.ArmDeletedNoContentResponse | Azure.ResourceManager.ErrorResponse +``` + +#### Template Parameters + +| Name | Description | +| --------------- | ------------------------------------------------------------ | +| TResource | The resource being deleted | +| TBaseParameters | Optional. Allows overriding the parameters for the operation | + +### `ArmResourceDeleteWithoutOkAsync` {#Azure.ResourceManager.ArmResourceDeleteWithoutOkAsync} + +```typespec +op Azure.ResourceManager.ArmResourceDeleteWithoutOkAsync(provider: Microsoft.ThisWillBeReplaced): Azure.ResourceManager.ArmDeleteAcceptedLroResponse | Azure.ResourceManager.ArmDeletedNoContentResponse | Azure.ResourceManager.ErrorResponse +``` + +#### Template Parameters + +| Name | Description | +| --------------- | ------------------------------------------------------------ | +| TResource | The resource being deleted | +| TBaseParameters | Optional. Allows overriding the parameters for the operation | + +### `ArmResourceListAtScope` {#Azure.ResourceManager.ArmResourceListAtScope} + +A resource list operation, with scope determined by TBaseParameters + +```typespec +op Azure.ResourceManager.ArmResourceListAtScope(provider: Microsoft.ThisWillBeReplaced): Azure.ResourceManager.ArmResponse> | Azure.ResourceManager.ErrorResponse +``` + +#### Template Parameters + +| Name | Description | +| --------------- | ---------------------------------------------------- | +| TResource | the resource being patched | +| TBaseParameters | Optional. Allows overriding the operation parameters | + +### `ArmResourceListByParent` {#Azure.ResourceManager.ArmResourceListByParent} + +A resource list operation, at the scope of the resource's parent + +```typespec +op Azure.ResourceManager.ArmResourceListByParent(provider: Microsoft.ThisWillBeReplaced): Azure.ResourceManager.ArmResponse> | Azure.ResourceManager.ErrorResponse +``` + +#### Template Parameters + +| Name | Description | +| ------------------- | ---------------------------------------------------- | +| TResource | the resource being patched | +| TBaseParameters | Optional. Allows overriding the operation parameters | +| TParentName | Optional. The name of the parent resource | +| TParentFriendlyName | Optional. The friendly name of the parent resource | + +### `ArmResourceRead` {#Azure.ResourceManager.ArmResourceRead} + +A resource GET operation + +```typespec +op Azure.ResourceManager.ArmResourceRead(provider: Microsoft.ThisWillBeReplaced): Azure.ResourceManager.ArmResponse | Azure.ResourceManager.ErrorResponse +``` + +#### Template Parameters + +| Name | Description | +| --------------- | ---------------------------------------------------- | +| TResource | the resource being patched | +| TBaseParameters | Optional. Allows overriding the operation parameters | + +### `checkGlobalNameAvailability` {#Azure.ResourceManager.checkGlobalNameAvailability} + +Adds check global name availability operation, normally used if +a resource name must be globally unique (for example, if the resource +exposes and endpoint that uses the resource name in the url) + +```typespec +op Azure.ResourceManager.checkGlobalNameAvailability(apiVersion: string, subscriptionId: string, provider: Microsoft.ThisWillBeReplaced, body: TRequest): TResponse | Azure.ResourceManager.ErrorResponse +``` + +#### Template Parameters + +| Name | Description | +| ----------------- | --------------------------------------------------------------------------------------------- | +| TRequest | the availability request, defaults to the standard request, containing name and resource type | +| TResponse | the availability response, default to the standard response | +| TAdditionalParams | A model specifying additional non-path parameters to the availability request | + +### `checkLocalNameAvailability` {#Azure.ResourceManager.checkLocalNameAvailability} + +Adds check location-specific name availability operation, normally used if +a resource name must be globally unique (for example, if the resource +exposes and endpoint that uses the resource name in the url) + +```typespec +op Azure.ResourceManager.checkLocalNameAvailability(apiVersion: string, subscriptionId: string, provider: Microsoft.ThisWillBeReplaced, location: string, body: TRequest): TResponse | Azure.ResourceManager.ErrorResponse +``` + +#### Template Parameters + +| Name | Description | +| ----------------- | --------------------------------------------------------------------------------------------- | +| TRequest | the availability request, defaults to the standard request, containing name and resource type | +| TResponse | the availability response, default to the standard response | +| TAdditionalParams | A model specifying additional non-path parameters to the availability request | + +## Azure.ResourceManager.Foundations + +### `checkNameAvailability` {#Azure.ResourceManager.Foundations.checkNameAvailability} + +Adds check name availability operation, normally used if +a resource name must be globally unique (for example, if the resource +exposes an endpoint that uses the resource name in the url) + +```typespec +op Azure.ResourceManager.Foundations.checkNameAvailability(apiVersion: string, body: TRequest): TResponse | Azure.ResourceManager.ErrorResponse +``` + +#### Template Parameters + +| Name | Description | +| ----------------- | ------------------------------------------------------------------------ | +| TScopeParameters | A parameter model with properties representing the scope of the resource | +| TRequest | The operation request body | +| TResponse | The operation response | +| TAdditionalParams | A parameter model with properties representing non-path parameters | diff --git a/docs/libraries/azure-resource-manager/reference/linter.md b/docs/libraries/azure-resource-manager/reference/linter.md new file mode 100644 index 0000000000..a202644a27 --- /dev/null +++ b/docs/libraries/azure-resource-manager/reference/linter.md @@ -0,0 +1,51 @@ +--- +title: "Linter usage" +toc_min_heading_level: 2 +toc_max_heading_level: 3 +--- + +# Linter + +## Usage + +Add the following in `tspconfig.yaml`: + +```yaml +linter: + extends: + - "@azure-tools/typespec-azure-resource-manager/all" +``` + +## RuleSets + +Available ruleSets: + +- [`@azure-tools/typespec-azure-resource-manager/all`](#@azure-tools/typespec-azure-resource-manager/all) + +## Rules + +| Name | Description | +| ------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------- | +| `@azure-tools/typespec-azure-resource-manager/arm-resource-action-no-segment` | `@armResourceAction` should not be used with `@segment`. | +| `@azure-tools/typespec-azure-resource-manager/arm-resource-duplicate-property` | Warn about duplicate properties in resources. | +| `@azure-tools/typespec-azure-resource-manager/arm-resource-interface-requires-decorator` | Each resource interface must have an @armResourceOperations decorator. | +| `@azure-tools/typespec-azure-resource-manager/arm-resource-invalid-action-verb` | Actions must be HTTP Post operations. | +| `@azure-tools/typespec-azure-resource-manager/arm-resource-invalid-envelope-property` | Check for invalid resource envelope properties. | +| `@azure-tools/typespec-azure-resource-manager/arm-resource-invalid-version-format` | Check for valid versions. | +| `@azure-tools/typespec-azure-resource-manager/arm-resource-key-invalid-chars` | Arm resource key must contain only alphanumeric characters. | +| `@azure-tools/typespec-azure-resource-manager/arm-resource-operation-response` | [RPC 008]: PUT, GET, PATCH & LIST must return the same resource schema. | +| `@azure-tools/typespec-azure-resource-manager/arm-resource-patch` | Validate ARM PATCH operations. | +| `@azure-tools/typespec-azure-resource-manager/arm-resource-path-segment-invalid-chars` | Arm resource name must contain only alphanumeric characters. | +| `@azure-tools/typespec-azure-resource-manager/arm-resource-provisioning-state` | Check for properly configured provisioningState property. | +| `@azure-tools/typespec-azure-resource-manager/arm-common-types-version` | Specify the ARM common-types version using @armCommonTypesVersion. | +| `@azure-tools/typespec-azure-resource-manager/beyond-nesting-levels` | Tracked Resources must use 3 or fewer levels of nesting. | +| `@azure-tools/typespec-azure-resource-manager/arm-resource-operation` | Validate ARM Resource operations. | +| `@azure-tools/typespec-azure-resource-manager/no-resource-delete-operation` | Check for resources that must have a delete operation. | +| `@azure-tools/typespec-azure-resource-manager/empty-updateable-properties` | Should have updateable properties. | +| `@azure-tools/typespec-azure-resource-manager/improper-subscription-list-operation` | Tenant and Extension resources should not define a list by subscription operation. | +| `@azure-tools/typespec-azure-resource-manager/no-response-body` | The body of 202 response should be empty. | +| `@azure-tools/typespec-azure-resource-manager/missing-operations-endpoint` | Check for missing Operations interface. | +| `@azure-tools/typespec-azure-resource-manager/patch-envelope` | Patch envelope properties should match the resource properties. | +| `@azure-tools/typespec-azure-resource-manager/resource-name` | Check the resource name. | +| `@azure-tools/typespec-azure-resource-manager/retry-after` | Check if retry-after header appears in response body. | +| [`@azure-tools/typespec-azure-resource-manager/unsupported-type`](/libraries/azure-resource-manager/rules/unsupported-type.md) | Check for unsupported ARM types. | diff --git a/docs/libraries/azure-resource-manager/rules/unsupported-type.md b/docs/libraries/azure-resource-manager/rules/unsupported-type.md new file mode 100644 index 0000000000..3e0104a559 --- /dev/null +++ b/docs/libraries/azure-resource-manager/rules/unsupported-type.md @@ -0,0 +1,34 @@ +--- +title: unsupported-types +--- + +```text title=- Full name- +@azure-tools/typespec-azure-core/unsupported-types +``` + +Check the ARM specification is not using types not supported in ARM. + +Primitive types currently unsupported in ARM: + +- int8 +- int16 +- uint8 +- uint16 +- uint32 +- uint64 + +#### ❌ Incorrect + +```tsp +model ResourceProperties { + count: uint32; +} +``` + +#### ✅ Correct + +```tsp +model ResourceProperties { + count: int32; +} +``` diff --git a/docs/libraries/typespec-client-generator-core/reference/decorators.md b/docs/libraries/typespec-client-generator-core/reference/decorators.md new file mode 100644 index 0000000000..e010294943 --- /dev/null +++ b/docs/libraries/typespec-client-generator-core/reference/decorators.md @@ -0,0 +1,307 @@ +--- +title: "Decorators" +toc_min_heading_level: 2 +toc_max_heading_level: 3 +--- + +# Decorators + +## Azure.ClientGenerator.Core + +### `@access` {#@Azure.ClientGenerator.Core.access} + +Set access for operations, models and enums. All models that are only used in operations with access "internal" will be implicitly set to access "internal". + +```typespec +@Azure.ClientGenerator.Core.access(value: EnumMember, scope?: valueof string) +``` + +#### Target + +`union Model | Operation | Enum` + +#### Parameters + +| Name | Type | Description | +| ----- | ----------------------- | ------------------------------------------------------------------------------------------------------------- | +| value | `EnumMember` | The access info you want to set for this model or operation. | +| scope | `valueof scalar string` | The language scope you want this decorator to apply to. If not specified, will apply to all language emitters | + +#### Examples + +```typespec +@access(Access.internal) +model ModelToHide { +prop: valueof string +} +@access(Access.internal) +op test: void; +``` + +### `@client` {#@Azure.ClientGenerator.Core.client} + +Create a ClientGenerator.Core client out of a namespace or interface + +```typespec +@Azure.ClientGenerator.Core.client(value?: {}, scope?: valueof string) +``` + +#### Target + +`union Namespace | Interface` + +#### Parameters + +| Name | Type | Description | +| ----- | ----------------------- | ------------------------------------------------------------------------------------------------------------- | +| value | `model {}` | Optional configuration for the service. | +| scope | `valueof scalar string` | The language scope you want this decorator to apply to. If not specified, will apply to all language emitters | + +#### Examples + +##### Basic client setting + +```typespec +@client +namespace MyService { + +} +``` + +##### Setting with other service + +```typespec +namespace MyService { + +} + +@client({ + service: MyService, +}) +interface MyInterface {} +``` + +##### Changing client name if you don't want Client + +```typespec +@client({ + client: MySpecialClient, +}) +interface MyInterface {} +``` + +### `@clientFormat` {#@Azure.ClientGenerator.Core.clientFormat} + +Can be used to explain the client type that the current TYPESPEC +type should map to. + +```typespec +@Azure.ClientGenerator.Core.clientFormat(value: valueof unixtime | iso8601 | rfc1123 | seconds) +``` + +#### Target + +`ModelProperty` + +#### Parameters + +| Name | Type | Description | +| ----- | --------------------------------------------------------- | --------------------------- | +| value | `valueof union unixtime \| iso8601 \| rfc1123 \| seconds` | The client format to apply. | + +#### Examples + +```typespec +model MyModel { + @clientFormat("unixtime") + created_at?: int64; +} +``` + +### `@convenientAPI` {#@Azure.ClientGenerator.Core.convenientAPI} + +Whether you want to generate an operation as a convenient operation. + +```typespec +@Azure.ClientGenerator.Core.convenientAPI(value?: valueof boolean, scope?: valueof string) +``` + +#### Target + +`Operation` + +#### Parameters + +| Name | Type | Description | +| ----- | ------------------------ | ------------------------------------------------------------------------------------------------------------- | +| value | `valueof scalar boolean` | Whether to generate the operation as convenience method or not. | +| scope | `valueof scalar string` | The language scope you want this decorator to apply to. If not specified, will apply to all language emitters | + +#### Examples + +```typespec +@convenientAPI(false) +op test: void; +``` + +### `@exclude` {#@Azure.ClientGenerator.Core.exclude} + +Whether to exclude a model from generation for specific languages. By default we generate +all models that are included in operations. + +```typespec +@Azure.ClientGenerator.Core.exclude(scope?: valueof string) +``` + +#### Target + +`Model` + +#### Parameters + +| Name | Type | Description | +| ----- | ----------------------- | ------------------------------------------------------------------------------------------------------------- | +| scope | `valueof scalar string` | The language scope you want this decorator to apply to. If not specified, will apply to all language emitters | + +#### Examples + +```typespec +@exclude("python") +model ModelToExclude { + prop: valueof string; +} +``` + +### `@include` {#@Azure.ClientGenerator.Core.include} + +Whether to include a model in generation for specific languages. By default we generate +all models that are included in operations. + +```typespec +@Azure.ClientGenerator.Core.include(scope?: valueof string) +``` + +#### Target + +`Model` + +#### Parameters + +| Name | Type | Description | +| ----- | ----------------------- | ------------------------------------------------------------------------------------------------------------- | +| scope | `valueof scalar string` | The language scope you want this decorator to apply to. If not specified, will apply to all language emitters | + +#### Examples + +```typespec +@include("python") +model ModelToInclude { + prop: valueof string; +} +``` + +### `@internal` {#@Azure.ClientGenerator.Core.internal} + +Whether to mark an operation as internal for specific languages, +meaning it should not be exposed to end SDK users + +```typespec +@Azure.ClientGenerator.Core.internal(scope?: valueof string) +``` + +#### Target + +`Operation` + +#### Parameters + +| Name | Type | Description | +| ----- | ----------------------- | ------------------------------------------------------------------------------------------------------------- | +| scope | `valueof scalar string` | The language scope you want this decorator to apply to. If not specified, will apply to all language emitters | + +#### Examples + +```typespec +@internal("python") +op test: void; +``` + +### `@operationGroup` {#@Azure.ClientGenerator.Core.operationGroup} + +Create a ClientGenerator.Core operation group out of a namespace or interface + +```typespec +@Azure.ClientGenerator.Core.operationGroup(scope?: valueof string) +``` + +#### Target + +`union Namespace | Interface` + +#### Parameters + +| Name | Type | Description | +| ----- | ----------------------- | ------------------------------------------------------------------------------------------------------------- | +| scope | `valueof scalar string` | The language scope you want this decorator to apply to. If not specified, will apply to all language emitters | + +#### Examples + +```typespec +@operationGroup +interface MyInterface {} +``` + +### `@protocolAPI` {#@Azure.ClientGenerator.Core.protocolAPI} + +Whether you want to generate an operation as a protocol operation. + +```typespec +@Azure.ClientGenerator.Core.protocolAPI(value?: valueof boolean, scope?: valueof string) +``` + +#### Target + +`Operation` + +#### Parameters + +| Name | Type | Description | +| ----- | ------------------------ | ------------------------------------------------------------------------------------------------------------- | +| value | `valueof scalar boolean` | Whether to generate the operation as protocol or not. | +| scope | `valueof scalar string` | The language scope you want this decorator to apply to. If not specified, will apply to all language emitters | + +#### Examples + +```typespec +@protocolAPI(false) +op test: void; +``` + +### `@usage` {#@Azure.ClientGenerator.Core.usage} + +Expand usage for models/enums. A model's default usage info is always calculated by the operations that use it. +You could use this decorator to expand the default usage info. (e.g. append Usage.input by + +```typespec +@Azure.ClientGenerator.Core.usage(value: EnumMember | Union, scope?: valueof string) +``` + +#### Target + +`union Model | Enum` + +#### Parameters + +| Name | Type | Description | +| ----- | --------------------------- | ------------------------------------------------------------------------------------------------------------- | +| value | `union EnumMember \| Union` | The usage info you want to set for this model. | +| scope | `valueof scalar string` | The language scope you want this decorator to apply to. If not specified, will apply to all language emitters | + +#### Examples + +```typespec +@usage(Usage.input | Usage.output) +model InputAndOutPutModel { + prop: string; +} +``` diff --git a/docs/libraries/typespec-client-generator-core/reference/index.mdx b/docs/libraries/typespec-client-generator-core/reference/index.mdx new file mode 100644 index 0000000000..393298f789 --- /dev/null +++ b/docs/libraries/typespec-client-generator-core/reference/index.mdx @@ -0,0 +1,51 @@ +--- +title: Overview +sidebar_position: 0 +toc_min_heading_level: 2 +toc_max_heading_level: 3 +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Overview + +TypeSpec Data Plane Generation library + +## Install + + + + +```bash +npm install @azure-tools/typespec-client-generator-core +``` + + + + +```bash +npm install --save-peer @azure-tools/typespec-client-generator-core +``` + + + + +## Azure + +## Azure.ClientGenerator + +## Azure.ClientGenerator.Core + +### Decorators + +- [`@access`](./decorators.md#@Azure.ClientGenerator.Core.access) +- [`@client`](./decorators.md#@Azure.ClientGenerator.Core.client) +- [`@clientFormat`](./decorators.md#@Azure.ClientGenerator.Core.clientFormat) +- [`@convenientAPI`](./decorators.md#@Azure.ClientGenerator.Core.convenientAPI) +- [`@exclude`](./decorators.md#@Azure.ClientGenerator.Core.exclude) +- [`@include`](./decorators.md#@Azure.ClientGenerator.Core.include) +- [`@internal`](./decorators.md#@Azure.ClientGenerator.Core.internal) +- [`@operationGroup`](./decorators.md#@Azure.ClientGenerator.Core.operationGroup) +- [`@protocolAPI`](./decorators.md#@Azure.ClientGenerator.Core.protocolAPI) +- [`@usage`](./decorators.md#@Azure.ClientGenerator.Core.usage) diff --git a/docs/reference/arm/index.md b/docs/reference/arm/index.md new file mode 100644 index 0000000000..dc42eeec4f --- /dev/null +++ b/docs/reference/arm/index.md @@ -0,0 +1,143 @@ +# Library Tour + +The `@azure-tools/typespec-azure-resource-manager` library defines the following artifacts: + +- TypeSpec Azure Resource Manager Library + - [Models](#models) + - [Operations](#operations) + - [Decorators](#decorators) + - [API](#api) + +## Models + +The `@azure-tools/typespec-azure-resource-manager` library defines the following models: + +### ARM Resource Models + +The following table shows the list of ARM resource base model definitions. For the details of these different resource types, please consult [ARMWiki on resources.](https://armwiki.azurewebsites.net/introduction/concepts/resources.html) + +| Model | Notes | +| ------------------------------- | --------------------------------- | +| TrackedResource | Defines an ARM tracked resource. | +| ProxyResource | Defines an ARM proxy resource | +| ExtensionResource | Defines an ARM extension resource | + +### Other Support Models + +The following models are used for different purposes: + +- Base: Base models used for defining other models +- Common: Common definition models that can be spread(`...`) into resources +- Response: Common response models can be used in custom action operation return types. +- Parameter: Common parameter models can be used to define custom action operation APIs and formulate the REST path. +- Helper: Helper models for tasks such as extract model properties or transformations. + +| Model | Category | Notes | +| -------------------------------------- | --------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| ArmResource | Base | Defines the base model with common properties for all ARM resources. | +| ResourceIdentifier | Common | A type definition that refers the id to an ARM resource. Sample usage: ` otherArmId: ResourceIdentifier; networkId: ResourceIdentifier<[{type:"\\Microsoft.Network\\vnet"}]> vmIds: ResourceIdentifier<[{type:"\\Microsoft.Compute\\vm", scopes["*"]}]>` | +| DefaultProvisioningStateProperty | Common | Contains a default provisioningState property to be spread into resource property types. Available values: `Succeeded`, `Failed`, and `Cancelled` | +| ManagedServiceIdentity | Common | The managed service identities envelope. | +| EntityTag | Common | The eTag property envelope. | +| ManagedBy | Common | The managedBy property envelope. | +| ResourceKind | Common | The resource kind property envelope. | +| ResourcePlan | Common | The resource plan property envelope. | +| ResourceSku | Common | The SKU (Stock Keeping Unit) assigned to this resource. | +| ArmResponse | Response | Response model for ARM operation completed successfully. Status code: 200 | +| ArmCreatedResponse | Response | Response model for ARM create operation completed successfully. Status code: 201 | +| ArmDeletedResponse | Response | Response model for ARM resource deleted successfully. Status code: 200 | +| ArmDeleteAcceptedResponse | Response | Response model for ARM resource deletion accepted. Status code: 202 | +| ArmDeletedNoContentResponse | Response | Response model for ARM delete operation completed successfully. Status code: 204 | +| ArmNoContentResponse | Response | Response model for ARM operation completed with status code 204. | +| ErrorResponse | Response | Common error response for all Azure Resource Manager APIs to return error details for failed operations. | +| ApiVersionParameter | Parameter | The default api-version parameter type. | +| SubscriptionIdParameter | Parameter | The default subscriptionId parameter type. | +| ResourceGroupParameter | Parameter | The default resource group parameter type. | +| ProviderNamespace | Parameter | The provider namespace parameter type. | +| ResourceInstanceParameters | Parameter | A composite parameter model that includes `ResourceCommonParameters` and the key of `KeyOf`. | +| SubscriptionScope | Parameter | A composite parameter for subscription level operations. It includes `ApiVersionParameter`, `SubscriptionIdParameter`, `ProviderNamespace`, and `ParentKeysOf` | +| ResourceGroupScope | Parameter | A composite parameter for resource group level operations. It includes `ApiVersionParameter`, `SubscriptionIdParameter`,`ResourceGroupParameter`,`ProviderNamespace`, and `ParentKeysOf` | +| TenantParentScope | Parameter | A composite parameter for tenante level operations. It includes `CommonTenantScope`, `ParentKeysOf`. | +| TenantInstanceParameters | Parameter | A composite parameter for tenante level operations. It includes `CommonTenantScope`, `KeysOf`. | +| ResourceUriParameter | Parameter | The default resourceUri parameter type that refers to a fully qualified Azure Resource manager identifier of the resource. It sets `x-ms-skip-url-encoding` to true for this route segment. | +| OperationIdParameter | Parameter | The default operationId parameter type. | +| KeysOf | Helper | The model extract the ARM resource name key. | +| ParentKeysOf | Helper | The model extract the ARM resource's immediate parent's name key. | + +## Interfaces + +The `@azure-tools/typespec-azure-resource-manager` library defines these standard interfaces as basic building blocks that you can expose. You can use `extends` to compose the operations to meet the exact needs of your APIs. + +For tracked resources, it is expected to implement the full `ResourceOperations` interface. +For other resource types, you can use these basic interfaces to compose desired APIs. Certain linting rules may apply. + +```typespec +model Employee is TrackedResource +... + +@armResourceOperations +interface Employees extends TrackedResourceOperations {} + +------ +model Widget is ProxyResource +... + +@armResourceOperations +interface Widgets extends extends ResourceRead, + ResourceCreate, + ResourceDelete {} + +``` + +| Interface | Notes | +| ------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Operations | Standard interface that provides ARM required Operation API. Each service should have exact ONE definition with following line. `interface Operations extends Azure.ResourceManager.Operations {}` | +| TenantResourceOperations | A composite interface for Tenant resource that include `TenantResourceRead`, `TenantResourceCreate`, `TenantResourceUpdate`, `TenantResourceDelete`, and `TenantResourceListByParent`. | +| TenantResourceRead | A interface definition for Tenant resource Read operation. | +| TenantResourceCreate | A interface definition for Tenant resource CreateOrUpdate operation. | +| TenantResourceUpdate | A interface definition for Tenant resource Update operation. | +| TenantResourceDelete | A interface definition for Tenant resource Delete operation. | | +| TenantResourceListByParent | A interface definition for Tenant resource ListByParent operation. | +| ResourceOperations | A composite interface for resources that include `ResourceInstanceOperations`, `ResourceCollectionOperations`. | +| ResourceInstanceOperations | A composite interface for resources that include `ResourceRead`,`ResourceCreate`,`ResourceUpdate`,`ResourceDelete`. | +| ResourceCollectionOperations | A composite interface for resources that include `ResourceListByParent`,`ResourceListBySubscription`. | +| ResourceRead | A interface definition for resource Read operation. | +| ResourceCreate | A interface definition for resource CreateOrUpdate operation. | +| ResourceUpdate | A interface definition for resource Update operation. | +| ResourceDelete | A interface definition for resource Delete operation. | +| ResourceListBySubscription | A interface definition for resource ListBySubscription operation. | +| ResourceListByParent | A interface definition for resource ListByParent operation. | +| ProxyResourceOperations | A composite interface for Proxy resource that include `ResourceRead`,`ResourceCreate`,`ResourceDelete`,`ResourceListByParent`. | +| ProxyResourceUpdate | A interface definition for Proxy resource Update operation. | +| ExtensionResourceOperations | A composite interface for Extension resources that include `ExtensionResourceInstanceOperations`, `ExtensionResourceCollectionOperations`. | +| ExtensionResourceInstanceOperations | A composite interface for Extension resources that include `ExtensionResourceRead`,`ExtensionResourceCreate`,`ExtensionResourceUpdate`,`ExtensionResourceDelete`. | +| ExtensionResourceCollectionOperations | A composite interface for Extension resources that include `ExtensionResourceList`. | +| ExtensionResourceRead | A interface definition for Extension resource Read operation. | +| ExtensionResourceCreate | A interface definition for Extension resource CreateOrUpdate operation. | +| ExtensionResourceUpdate | A interface definition for Extension resource Update operation. | +| ExtensionResourceDelete | A interface definition for Extension resource Delete operation. | +| ExtensionResourceList | A interface definition for Extension resource List operation. | + +## Decorators + +The `@azure-tools/typespec-azure-resource-manager` library defines the following decorators: + +| Declarator | Scope | Usage | +| ---------------------- | ---------- | ----------------------------------------------------------------------------------------------- | +| @armProviderNamespace | namespace | sets the ARM provider namespace. | +| @armResourceOperations | interfaces | This decorator is used to identify interfaces containing resource operations. | +| @singleton | models | This decorator is used to mark a resource type as a "singleton", a type with only one instance. | + +## API + +The `@azure-tools/typespec-azure-resource-manager` library defines the following API functions that emitter authors can use for development: + +| Name | Entity | Returns | Description | +| ----------------------- | -------------------------- | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------ | +| isArmCommonType | models and modelProperties | boolean | Check if a given model or model property is an ARM common type. | +| isSingletonResource | models | boolean | Check if a given model or model property is a singleton resource. | +| getArmProviderNamespace | namespace and models | string or undefined | Get the ARM provider namespace for a given entity | +| getArmResources | - | ArmResourceDetails[] | Returns fully-resolved details about all ARM resources registered in the TypeSpec document including operations and their details. | +| getArmResourceInfo | models | ArmResourceDetails | Returns fully-resolved details about a given ARM resource model. | +| getArmResourceKind | models | ArmResourceKind or undefined | Returns resource type for a given ARM resource model. Return values: `TrackedResource`, `ProxyResource`, `ExtensionResource` | +| getSingletonResourceKey | models | string or undefined | Returns the name/key of a singleton resource or `undefined` for non-singleton resources. | diff --git a/docs/reference/azure-style-guide.md b/docs/reference/azure-style-guide.md new file mode 100644 index 0000000000..81bfd1602f --- /dev/null +++ b/docs/reference/azure-style-guide.md @@ -0,0 +1,164 @@ +# Azure TypeSpec Style Guide + +## History + +| Date | Notes | +| ----------- | ---------------- | +| 2022-Oct-28 | Initial version. | + +## Introduction + +This document contains guidelines that complement and extend the +[Microsoft Azure REST API Guidelines](https://github.com/microsoft/api-guidelines/blob/vNext/azure/Guidelines.md) for describing an Azure API with a TypeSpec API design document. +The goal of these guidelines is to establish the requirements for complete and consistent API designs +that will ensure high quality in generated documentation and client libraries. + +## Use the Azure.Core library + +The [Azure.Core](azure.core/index.md) library enforces many of the requirements for complete and consistent API designs. +If your TypeSpec definition imports the Azure.Core library and compiles without linter errors, this ensures +compliance with the most important Azure API style guidelines. + +```typespec +import "@azure-tools/typespec-azure-core"; +``` + +## Use the Versioning library + +All TypeSpec API designs for Azure must import the typespec-lang/versioning library, define their api-versions, +and the versions of all imported libraries. + +```typespec +import "@typespec/versioning"; + +@versioned(Contoso.WidgetManager.Versions) +namespace Contoso.WidgetManager; + +enum Versions { + @useDependency(Azure.Core.Versions.v1_0_Preview_2) + v2022_08_31: "2022-08-31", +} +``` + +## Decorators + +Certain decorators from the TypeSpec standard library or common extension libaries must not be used +in Azure TypeSpec definitions. + +- `@operationId` -- the operationId is derived from the operation name. +- `@format` -- not recommended for use in Azure specs because this is an open-ended string and the interpretation is open to each emitter. + Instead, we recommend using supported scalars. Azure-specific scalars include: `eTag`, `ipV4Address`, `ipV6Address` and `uuid`. General + TypeSpec scalars include: `bytes`, `numeric`, `integer`, `float`, `int64`, `int32`, `int16`, `int8`, `uint64`, `uint32`, `uint16`, `uint8`, + `safeint`, `float64`, `float32`, `decimal`, `decimal128`, `string`, `plainDate`, `plainTime`, `utcDateTime`, `offsetDateTime`, `duration`, + `boolean`, and `url`. For more information, see the document on [Types Relations](https://microsoft.github.io/typespec/language-basics/type-relations) + +## Operation Groups + +Operations should be grouped within an interface or namespace. The name of the interface or namespace +should be a plural noun, and for ARM apis it should match the resource type name in the path segment. +This name will be prepended to the operation name to form the operationId. + +For example, the interface that groups the operations for the 'Microsoft.Compute/virtualMachines' +resource type should be named 'VirtualMachines'. + +## Operation Names + +Operation names should follow a consistent pattern + +| operation template | name should contain | notes | +| ------------------------------------- | ---------------------- | ----- | +| ResourceCreateOrUpdate | "Create" and "Update" | | +| ResourceCreateOrReplace | "Create" and "Replace" | | +| ResourceCreateWithServiceProvidedName | "Create" | | +| ResourceRead | "Get" | | +| ResourceDelete | "Delete" | | +| ResourceList | "List" | | +| LongRunningResourceCreateOrReplace | "Create" and "Replace" | | +| LongRunningResourceDelete | "Delete" | | + +## Parameters + +When a path parameter specifies the identifier of a resource being created, it should + +- use the `@maxLength` decorator to specify the maximum length allowed for the identifier, and +- use the `@pattern` decorator to specify the characters that can be used in the identifier. + +## Support for pagination + +If the operation accepts a `top`, `skip`, `maxpagesize`, `filter`, `orderby`, `select`, or `expand` parameter, +use the appropriate parameter description in the Azure.Core library. + +```typespec +interface Widgets { + @doc("List Widget resources") + listWidgets is ResourceList< + Widget, + { + parameters: { + ...TopQueryParameter; + ...SkipQueryParameter; + ...MaxPageSizeQueryParameter; + ...FilterQueryParameter; + ...OrderByQueryParameter; + ...SelectQueryParameter; + ...ExpandQueryParameter; + }; + } + >; +} +``` + +## Security Definitions + +Every TypeSpec definition must define at least one valid security scheme. + +Management plane services only need to import the Azure.ResourceManager library +to define the standard ARM security definitions. + +Data plane services must explicitly define their security scheme(s) with the Azure.Core `@useAuth` decorator. + +Each security scheme must have a `type` of "oauth2" or "apiKey" with `in` "header". + +Each security scheme must have a `description` with a plain English explanation of the security scheme. + +For "oauth2" security schemes, `scopes` must contain at least one entry. + +The key of each entry in `scopes` must be of the form `/scope name`, where "scope name" is typically ".default" for Azure services. + +### Examples + +The following example shows how to define a security scheme for Azure Active Directory authentication: + +```typespec +@useAuth(AADToken) +namespace Contoso.WidgetManager; + +@doc("The Azure Active Directory OAuth2 Flow") +model AADToken + is OAuth2Auth<[ + { + type: OAuth2FlowType.authorizationCode; + authorizationUrl: "https://api.example.com/oauth2/authorize"; + tokenUrl: "https://api.example.com/oauth2/token"; + scopes: ["https://management.azure.com/read", "https://management.azure.com/write"]; + } + ]>; +``` + +Note that the name "AADToken" has no significance, and "https://resource.azure.com/" is meant to signify the URI of the public cloud resource. + +The "type" is not particularly relevant but the "implicit" oauth2 flow is now considered insecure so another choice like "authorizationCode" is preferable. + +The following example defines an apikey security scheme: + +```typespec +@useAuth(AzureKey) +namespace Contoso.WidgetManager; + +@doc("The secret key for your Azure Cognitive Services subscription.") +model AzureKey is ApiKeyAuth; +``` + +Here also, the name "AzureKey" has no significance. + +All operations for the service should accept the security defined for the service. diff --git a/docs/reference/azure.core/index.md b/docs/reference/azure.core/index.md new file mode 100644 index 0000000000..c6d37a3c88 --- /dev/null +++ b/docs/reference/azure.core/index.md @@ -0,0 +1,93 @@ +# Library Tour + +The `@azure-tools/typespec-azure-core` library defines the following artifacts: + +- TypeSpec Azure Core Library + - [Models](#models) + - [Operations](#operations) + - [Decorators](#decorators) + - [API](#api) + +### Models + +The `@azure-tools/typespec-azure-core` library defines the following models: + +| Model | Notes | +| --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Page | Model for a paged resource. `` is the model description of the item. | +| PagedResultMetadata | Contains the metadata associated with a `Page`. | +| RequestParameter | For long-running operations, identifies that a continuation operation request parameter is pulled from the original request. `` is the property name on the original request. | +| ResponseProperty | For long-running operations, identifies that a continuation operation request parameter is pulled from the response of the previous request. `` is the property name on the previous response. | +| LongRunningStates | Identifies the long-running states associated with a long-running operation. | +| OperationLinkMetadata | Contains the metadata associated with an operation link. | + +### Operations + +The `@azure-tools/typespec-azure-core` library defines these standard operation templates as basic building blocks that you can expose. You can use `is` to compose the operations to meet the exact needs of your APIs. + +For all of these operation templates, `TResource` is the resource model and `TCustom` allows customization of the operation parameters or response. `TCustom`, if provided, must extend the `Azure.Core.Foundations.CustomizationFields` model, which looks like: + +```typespec +@doc("The expected shape of model types passed to the TCustom parameter of operation signatures.") +model CustomizationFields { + @doc("An object containing custom parameters that will be included in the operation.") + parameters?: object; + + @doc("An object containing custom properties that will be included in the response.") + response?: object; +} +``` + +| Operation | Notes | +| -------------------------------------------------------------------- | ----------------------------------------------------- | +| ResourceCreateOrUpdate | Resource PATCH operation. | +| ResourceCreateOrReplace | Resource PUT operation. | +| ResourceCreateWithServiceProvidedName | Resource POST operation. | +| ResourceRead | Resource GET operation. | +| ResourceDelete | Resource DELETE operation. | +| ResourceList | Resource LIST operation with server-driven paging. | +| NonPagedResourceList | Resource LIST operation without paging. | +| ResourceAction | Perform a custom action on a specific resource. | +| ResourceCollectionAction | Perform a custom action on a collection of resources. | +| LongRunningResourceCreateOrReplace | Long-running resource PUT operation. | +| LongRunningResourceCreateOrUpdate | Long-running resource PATCH operation. | +| LongRunningResourceCreateWithServiceProvidedName | Long-running resource POST operation. | +| LongRunningResourceDelete | Long-running resource DELETE operation. | + +### Decorators + +The `@azure-tools/typespec-azure-core` library defines the following decorators: + +| Declarator | Scope | Usage | +| ------------------ | -------------------------- | ------------------------------------------------------------------------------------------------------- | +| @pagedResult | models | indicates model describes a paged result. | +| @items | model properties | indicates model property that stores the items within a paged result. | +| @nextLink | model properties | indicates model property that contains the continuation information for the next page. | +| @nextPageOperation | operations | indicates operation that will be called for subsequent page requests. | +| @lroStatus | enums and model properties | indicates model or model property that represents long-running operation status. | +| @lroSucceeded | enum members | indicates enum member that corresponds to the long-running operation succeeded status. | +| @lroCanceled | enum members | indicates enum member that corresponds to the long-running operation canceled status. | +| @lroFailed | enum members | indicates enum member that corresponds to the long-running operation failed status. | +| @pollingLocation | model properties | indicates model property that contains the location to poll for operation state. | +| @finalLocation | model properties | indicates model property that contains the final location for the operation result. | +| @operationLink | operations | indicates operation that is linked to the decorated operation by virtue of its `linkType`. | +| @pollingOperation | operations | indicates an operation is a polling operation for a long-running operation. | +| @finalOperation | operations | indicates an operation is the final operation for a long-running operation. | + +### API + +The `@azure-tools/typespec-azure-core` library defines the following API functions that emitter authors can use for development: + +| Name | Entity | Returns | Description | +| -------------------- | ---------------------------------- | ----------------------------------- | ---------------------------------------------------------------------------------------------------- | +| getPagedResult | models and operations | PagedResultMetadata? | Returns the `PagedResultMetadata` if associated with a model or operation return type. | +| getItems | model properties | boolean | Returns `true` if the model property is annotated with `@items`. | +| getNextLink | model properties | boolean | Returns `true` if the model property is annotated with `@nextLink`. | +| getLongRunningStates | enums, models and model properties | LongRunningStates? | Returns the `LongRunningStates` associated with an entity. | +| isLroSucceededState | enum members | boolean | Returns `true` if the enum member represents a "succeeded" state. | +| isLroCanceledState | enum members | boolean | Returns `true` if the enum member represents a "canceled" state. | +| isLroFailedState | enum members | boolean | Returns `true` if the enum member represents a "failed" state. | +| isPollingLocation | model properties | boolean | Returns `true` if the model property is annotated with `@pollingLocation`. | +| isFinalLocation | model properties | boolean | Returns `true` if the model property is annotated with `@finalLocation`. | +| getOperationLink | operations | OperationLinkMetadata? | Returns the `OperationLinkMetadata` for an operation with a specific `linkType`. | +| getOperationLinks | operations | Map? | Returns a `Map` of `OperationLinkMetadata` objects for an Operation where the key is the `linkType`. | diff --git a/docs/release-notes/cadl-typespec-migration.md b/docs/release-notes/cadl-typespec-migration.md new file mode 100644 index 0000000000..0feefc8eb6 --- /dev/null +++ b/docs/release-notes/cadl-typespec-migration.md @@ -0,0 +1,84 @@ +# Cadl to TypeSpec rename completed in March 2023 release + +As you may recall from our previous email to partners, we are renaming the product as it becomes more mature, stable and one step closer to release. + +With the 2023-03-13 release, We are pleased to announce that we have completed the process of changing the name of our product from **Cadl** to **TypeSpec**. This marks another important milestone. The new name better aligns with the functionality and benefits of the product, and we believe it will make it easier for our customers to understand and remember. + +We understand that change can be challenging, and we appreciate your patience and support during this process. + +## Name Changes + +- Packages: + + - NPM package scope: + + - @cadl-lang/[xx] -> @typespec/[xx] + - @azure-tools/ unchanged. + + - Package names + +| Old Package Name | Old Namespace | New Package Name | New Namespace | +| ---------------------------------------- | ---------------------------- | -------------------------------------------- | --------------------------------- | +| @cadl-lang/compiler | using Cadl; | @typespec/compiler | using TypeSpec; | +| @cadl-lang/rest | using Cadl.Http; | @typespec/http; | using TypeSpec.Http; | +| @cadl-lang/rest | using Cadl.Rest; | @typespec/rest | using TypeSpec.Rest; | +| @cadl-lang/openapi | using Cadl.OpenApi; | @typespec/openapi | using TypeSpec.OpenApi; | +| @cadl-lang/openapi3 | using Cadl.OpenApi3; | @typespec/openapi3 | using TypeSpec.OpenApi3; | +| | | | | +| @azure-tools/cadl-autorest | using Cadl.AutoRest; | @azure-tools/typespec-autorest | using TypeSpec.AutoRest; | +| @azure-tools/cadl-azure-core | using Azure.Core; | @azure-tools/typespec-azure-core | using Azure.Core; | +| @azure-tools/cadl-azure-resource-manager | using Azure.ResourceManager; | @azure-tools/typespec-azure-resource-manager | using Azure.ResourceManager; | +| @azure-tools/cadl-dpg | using Azure.DPG; | @azure-tools/typespec-client-generator-core | using Azure.ClientGenerator.Core; | +| @azure-tools/cadl-providerhub | using Azure.ProviderHub; | @azure-tools/typespec-providerhub | using Azure.ProviderHub; | +| @azure-tools/cadl-providerhub-controller | - (emitter only) | @azure-tools/typespec-providerhub-controller | - | + +- File extension: + + - `.cadl` -> `.tsp` + +- Configuration file: + + - `cadl-project.yaml` -> `tspconfig.yaml` + +- CLI + + - `npx cadl compile .` -> `npx tsp compile .` + +- Compiler JS APIs + - All artifacts with `*Cadl*` in the name have been updated to `*TypeSpec*`. However, aliases have been created with older `*Cadl*` name with `@deprecated` flag. +- Noteable changes: + + - @cadl-lang/rest was split into two packages, @typespec/rest and @typespec/http + - `@azure-tools/cadl-dpg` has been renamed to `@azure-tools/typespec-client-generator-core`. See above table for details. + +- Back-compatibility + - `.cadl` files are continue be recognized by compiler. + - `cadl-project.yaml` is still supported if `tspconfig.yaml` not found + +## Migration tool + +An experimental migration tool has been introduced to take care of many of the manual migration steps. Just execute following command in your TypeSpec folder. + +```bash + npx @typespec/migrate +``` + +If you would like execute from a different folder or don't have a `package.json` that indicates compiler package versions, please see command line options: + +```bash + npx @typespec/migrate --help +``` + +The migration tool will perform following steps: + +- Rename `cadl-project.yaml` to `tspconfig.yaml`. +- Update `tspconfig.yaml` format to new `emit` schema if necessary. +- Rename `.cadl` files to `.tsp`. +- Update `import` and `using` statements in any `.tsp` files +- Update `package.json` with new package name and versions. + +## Deprecate older Cadl packages + +You can follow this easy EngSys instructions to deprecate older Cadl\* packages. + +https://dev.azure.com/azure-sdk/internal/_wiki/wikis/internal.wiki/354/NPM-Admin-Tasks-Pipeline diff --git a/docs/release-notes/release-2022-07-08.md b/docs/release-notes/release-2022-07-08.md new file mode 100644 index 0000000000..42138eb4b2 --- /dev/null +++ b/docs/release-notes/release-2022-07-08.md @@ -0,0 +1,69 @@ +--- +title: July 2022 +--- + +# Release Notes July 2022 (2022-07-08) + +This release contains **breaking changes** + +- Emitter options normalized to use kebab-case instead of camelCase. +- `@serviceHost` decorator replaced by `@server` decorator +- Versioning decorators now use enumerated values instead of strings + +## Impact on ARM specifications + +- Scripts that call typespec from the command line must be updated to use the new emitter option caseing, as described in the [migration guide](#migrating-command-line-scripts). +- Visual studio projects that use the `` element will need to be updated to use the new emitter option casing, as described in the [migration guide](#migrating-projects). + +## Emitter options + +This release brings a stricter option definition for emitters and requires usage of those options to be specified with the fully qualified name to prevent conflicts. +All options have also been renamed to match `kebab-case` naming. +The options can also be specified via the `tspconfig.yaml` file. + +## `@serviceHost` decorator replaced with `@server` decorator + +Note that **it is unlikely that this change has any impact on existing ARM specs**. The `@serviceHost` decorator that decorated the root namespace was used to specify the domain name of the base service endpoint. This functionality has been replaced by the `@server` decorator, which allows specifying full and parametrized Uris for the service endpoint, as described [here](https://github.com/microsoft/typespec/tree/main/docs/tutorial.md#service-definition-and-metadata) + +### Before + +```JavaScript +@serviceHost("example.com") +namespace MyService; + +``` + +### After + +```JavaScript +@server("https://example.com", "The endpoint for my service") +namespace MyService; + +``` + +## Versioning uses enums instead of strings + +Note that **it is unlikely that this change has any impact on existing ARM specs**. Versions must now be specified using string-valued enumerations, and each of the versioning decorators must reference an enum value rather than using the version string directly. + +```JavaScript +// Before +@versioned("2021-01-12" | "2022-01-15-preview") +namespace Api; + +// After +@versioned(Versions) +namespace Api; + +enum Versions { v2021_01_12: "2021-01-12", v2022_01_15_preview: "2022-01-15-preview" } +``` + +```JavaScript +// Before +@added("2022-01-15-preview") +model Foo {} + +// After +@added(Versions.v2022_01_15_preview) +model Foo {} + +``` diff --git a/docs/release-notes/release-2022-08-10.md b/docs/release-notes/release-2022-08-10.md new file mode 100644 index 0000000000..f3f3a670dc --- /dev/null +++ b/docs/release-notes/release-2022-08-10.md @@ -0,0 +1,339 @@ +--- +title: August 2022 +--- + +# Release Notes August 2022 (2022-08-10) + +This release contains **breaking changes** + +- typespec-azure-core library requires a versioned dependency +- typespec-azure-resource-manager requires a versioned dependency +- Operation parameters without decorators +- OkResponse is no longer a template +- Route resolution changes +- Remove `Map` type +- `@path` may not decorate optional properties or parameters without a default value + +## typespec-azure-core library requires a versioned dependency + +The typespec-azure-core library is now versioned, so each spec using it must specify the version to ensure no breaking changes. + +### Unversioned dependency to typespec-azure-core will now emit an error + +```typespec +import "@azure-tools/typespec-azure-core"; + +namespace MyService; +using Azure.Core; +``` + +### Resolve by adding an `@versionedDependency` to typespec-azure-core to the service namespace + +```typespec +import "@azure-tools/typespec-azure-core"; +import "@typespec/versioning"; + +using Azure.Core; +using Versioning; + +@versionedDependency(Azure.Core.Versions.v1_0_Preview_1) +namespace MyService; +``` + +## typespec-azure-resource-manager library requires a versioned dependency + +The typespec-azure-resource-manager library is now versioned, so each spec using it must specify the version to ensure no breaking changes. + +### Unversioned dependency to typespec-azure-resource-manager will now emit an error + +```typespec +import "@azure-tools/typespec-azure-resource-manager"; + +namespace Microsoft.MyService; +using Azure.ResourceManager; +``` + +### Resolve by adding an `@versionedDependency` to typespec-azure-resource-manager to the service namespace + +```typespec +import "@azure-tools/typespec-azure-resource-manager"; +import "@typespec/versioning"; + +using Azure.ResourceManager; +using Versioning; + +@versionedDependency(Azure.ResourceManager.Versions.v1_0_Preview_1) +namespace Microsoft.MyService; +``` + +## Operation parameters without decorators + +A single undecorated (not marked `@query`, `@header`, `@body` or `@path`) operation parameter will now become a property of the request body rather than have its type define the request body. This allows defining the body with multiple unannotated parameters, which can include unannotated properties that are spread into parameters. (Previously, more than one unannotated parameter was an error.) + +For example, the following used to define a request body of type `string`, but now defines a request body that is an object with a property named `body` of type string. + +```typespec +op create(body: string): void; +``` + +To get the previous behavior, the parameter now needs to be explicitly marked with `@body`: + +```typespec +op create(@body body: string): void; +``` + +## OkResponse is no longer a template + +Previously, OkResponse took an argument for the body type. Now it is a simple model like the other XxxResponse types. Alone, it implies a status code of 200 with no body. + +Since 200 is the default status code for non-empty bodies, you can usually replace `OkResponse` with simply `T`. + +```typespec +op get(id: string): OkResponse; +``` + +Can be: + +```typespec +op get(id: string): Pet; +``` + +In certain situations where the body type is not (necessarily) a model, you will need to use the new `Body` type. For example. + +```typespec +op list(): OkResponse; +``` + +Can become: + +```typespec +op list(): OkResponse & Body; +``` + +Since 200 status code is used by default, this could also be: + +```typespec +op list(): Pet[]; +``` + +Generic models based on `OkResponse` may also require `Body`. For example: + +```typespec +model MyResponse { + ...OkResponse; + @header example: string; +} +``` + +Since T is not constrainted to be a model, it might be an intrinsic type, an array, or the like, the template should be changed to use `Body`: + +```typespec +model MyResponse { + ...OkResponse; + ...Body; + @header example: string; +} +``` + +In general, the prior `OkResponse` is equivalent to `OkResponse & Body` now or, equivalently, `{ ...OkResponse, ...Body }`. In practice there are many situations where you can leave out OkResponse altogether and use plain `T` rather than `Body`. + +See also https://github.com/microsoft/typespec/blob/main/docs/tutorial.md#request--response-bodies + +## Route resolution changes + +Resolving operation routes now follows the following logic: + +- if there is a service namespace specified + - only emit the operations and interfaces under that namespace(recursively) +- if not: + - only emit the operations and interfaces defined at the root (DO NOT look into namespaces) + +### Action if applicable + +- If a typespec specused a service namespace without `@serviceTitle` add the `@serviceTitle` decorator to the service namespace, otherwise no routes will be emitted. +- If a typespec spec contains service namespaces that are not child namespaces of the service namespace, move these namespaces under the service namespace. + +### Cases + +#### Operation at the root + +```typespec +op test(): void; +``` + +✅ Stay the same + +| Before | After | +| ------- | ------- | +| `["/"]` | `["/"]` | + +#### Operation in namespace (not service namespace) + +```typespec +namespace DemoService; + +op test(): void; +``` + +⚠️ Output stays the same but add warning that no routes are emitted + +| Before | After | +| ------ | ----- | +| `[]` | `[]` | + +#### Operation in namespace (not service namespace) with @route + +```typespec +namespace DemoService; + +@route("/") +op test(): void; +``` + +⚠️ Now the same as previous case, no routes emitted and emit warning + +| Before | After | +| ------- | ----- | +| `["/"]` | `[]` | + +##### Resolve by adding the `@serviceTitle` decorator + +Add `@serviceTitle` to the namespace + +```typespec +@serviceTitle("DemoService") +namespace DemoService; + +@route("/") +op test(): void; +``` + +#### Operation in service namespace + +```typespec +@serviceTitle("My Service") +namespace Foo; + +op test(): void; +``` + +✅ Stay the same + +| Before | After | +| ------- | ------- | +| `["/"]` | `["/"]` | + +#### Operation in namespaces other than the service namespace + +```typespec +import "@typespec/rest"; + +using TypeSpec.Http; + +@serviceTitle("My Service") +namespace Foo { + @route("in-service") + op test(): void; +} + +namespace MyLib { + @route("my-lib") + op test(): void; +} +``` + +⚠️ Other namespace routes are not included anymore + +| Before | After | +| --------------------------- | ----------------- | +| `["/in-service", "my-lib"]` | `["/in-service"]` | + +##### Resolve by making additional namespaces children of the service namespace + +Make any added namespaces children of the service namespace + +```typespec +import "@typespec/rest"; + +using TypeSpec.Http; + +@serviceTitle("My Service") +namespace Foo { + @route("in-service") + op test(): void; +} + +namespace Foo.MyLib { + @route("my-lib") + op test(): void; +} +``` + +## Remove Map type + +`Map` type was removed. Usages of `Map` can be replaced with new type `Record`. Other usages of `Map` may be replaced with `object`. + +### Map using string key type + +```typespec +model Foo { + options: Map; +} +``` + +#### Replace with `Record` + +```typespec +model Foo { + options: Record; +} +``` + +### Map using non-string key type + +```typespec +model Foo { + options: Map; +} +``` + +#### Replace with `object` + +```typespec +model Foo { + options: object; +} +``` + +## `@path` may not decorate optional properties or parameters without a default + +Properties and parameters marked with the `@path` decorator should be required, but may be optional if they have a default value + +### optional path parameters + +```typespec +model Foo { + @path + name?: string; +} +``` + +Was a bad practice, but was allowed in previous versions. This will not throw an error diagnostic. + +### Resolve by making the property required + +```typespec +model Foo { + @path + name: string; +} +``` + +### Resolve by adding a default value + +```typespec +model Foo { + @path + name?: string = "singleton"; +} +``` diff --git a/docs/release-notes/release-2022-09-07.md b/docs/release-notes/release-2022-09-07.md new file mode 100644 index 0000000000..be07b9249d --- /dev/null +++ b/docs/release-notes/release-2022-09-07.md @@ -0,0 +1,63 @@ +--- +title: September 2022 +--- + +# Release Notes September 2022 (2022-09-07) + +This release contains **breaking changes** + +Change to compiler, rest libraries [See TypeSpec Core release notes](https://github.com/microsoft/typespec/blob/main/docs/release/release-2022-09-07.md) + +- **`Api`**: Remove `Type` suffix +- **`TypeSpec`**: Rename `Page` to `CollectionWithNextLink` +- **`Api`**: `Enum.members` change typed from `EnumMember[]` to `Map` +- **`TypeSpec`** **`Api`**: **Deprecation** of `@consumes` `@produces` decorators + +Change to Azure libraries: + +- **[TypeSpec]** `Azure.Core` Changes to standard operation signatures + +## **[TypeSpec]** `Azure.Core` Changes to standard operation signatures + +There have been a few changes to the standard operation signatures +provided by the `Azure.Core` namespace: + +### The use of standard operation signatures is now enforced + +The `use-standard-operations` diagnostic will now be raised for any operation +that is not based on the standard operation signatures in the `Azure.Core` +namespace. This diagnostic is a warning that can be suppressed when there is a +legitimate case where a standard signature cannot be used. + +For example: + +``` +#suppress "@azure-tools/typespec-azure-core/use-standard-operations" "This is a top-level operation without a resource type." +@get +@route("languages") +op getSupportedLanguages is Foundations.Operation; +``` + +### New low-level building block signatures have been added + +We have added new low-level operation signatures to `Azure.Core.Foundations` +which encode the most fundamental parts of the Azure REST API Guidelines. You +may use these when you need to define custom operations that are not covered by +the standard signatures in `Azure.Core`. + +- `Operation` - The fundamental operation shape which + contains the `api-version` parameter and the standard `ErrorResponse`. +- `LongRunningOperation` - Similar to `Operation` but adds a + long-running operation header to the response. +- `ResourceOperation` - The fundamental operation + shape for all resource operations. Adds the `@autoRoute` decorator and + inserts the key properties for the `TResource` type and its parents. +- `ResourceCollectionOperation` - The fundamental + operation shape for all resource collection operations. Adds the `@autoRoute` + decorator key properties for the parent type(s) of `TResource`. + +### The success response type for the `ResourceRead` operation is now the resource type + +There was previously an issue with the `ResourceRead` signature that caused the +resource type in the response to be treated as an anonymous schema. This has +now been corrected. diff --git a/docs/release-notes/release-2022-10-12.md b/docs/release-notes/release-2022-10-12.md new file mode 100644 index 0000000000..c2ed13e954 --- /dev/null +++ b/docs/release-notes/release-2022-10-12.md @@ -0,0 +1,29 @@ +--- +title: October 2022 +--- + +# Release Notes October 2022 (2022-10-12) + +This release contains **breaking changes** + +Change to compiler, rest libraries [See TypeSpec Core release notes](https://microsoft.github.io/typespec/docs/release-notes/release-2022-10-12/) + +- **`TypeSpec`**: Cannot `extends` or `is` a model expression via alias +- **`Api`**: Removed `createProgram` and changed `compile` parameter order +- **`TypeSpec`** **Deprecation** `@service` decorator replacing `@serviceTitle` and `@serviceVersion` +- **`TypeSpec`** **`Api`**: Move `@discriminator` to compiler + +Change to Azure libraries: + +- **`TypeSpec`** `Azure.ResourceManager` Operations Interface explicitly required +- **`Emitter`** `typespec-provider-hub-controller` Deprecate `service-code-path` + +## **`TypeSpec`** `Azure.ResourceManager` Operations Interface explicitly required + +Previous version of the Azure.ResourceManager depended on a weird behavior of the operation resolution which automatically included the `Operations` interface. +You now have to explicitly include this interface in your Arm spec. + +```typespec +// Add this to your spec. +interface Operations extends Azure.ResourceManager.Operations {} +``` diff --git a/docs/release-notes/release-2022-11-11.md b/docs/release-notes/release-2022-11-11.md new file mode 100644 index 0000000000..ef9146a5fc --- /dev/null +++ b/docs/release-notes/release-2022-11-11.md @@ -0,0 +1,75 @@ +--- +title: November 2022 +--- + +# Release Notes for November 2022 (2022-11-11) + +## **[TypeSpec]** `Azure.Core` and `Azure.ResourceManager` updated `TResource` template parameter constraint + +Most of the `interface` types in these packages(e.g. `Page`, `ResourceCreateOrUpdate`, `GetResourceOperationStatus` , etc.) have been updated to have a constraint on the `TResource` template parameter. It must now be an `object`. This was already validated by the requirement for presence of `@resource` but this means that it is a built in complier validation. + +In most cases this shouldn't affect you as you will already be passing an object to one of those templates. However if you defined your own template expecting a TResource that would be referencing one of those updated templates you will get an error. This can be resolved by defining the same constraint on your own parameter by adding `extends object` + +Before + +```typespec +model MyCustomPage is Page; +``` + +After + +```typespec +model MyCustomPage is Page; +``` + +## **[TypeSpec]** `Azure.ResourceManager` added lint rules to enforce consistent response schema and `@armResource` decorators' usage + +### `@armResource` decorators' usage + +For ARM resource operations definition, the `op` must be decorated with `@armResource`. More specifically, + +- `put`: `@armResourceCreateOrUpdate` +- `get`: `@armResourceRead` or `@armResourceList` +- `patch`: `@armResourceUpdate` +- `delete`: `@armResourceDelete` +- `post`: `@armResourceAction` + +Before + +```typespec + @post + GiveRaise(...ResourceInstanceParameters): ArmResponse | ErrorResponse; +``` + +After + +```typespec + @post + @armResourceAction(Employee) + GiveRaise(...ResourceInstanceParameters): ArmResponse | ErrorResponse; +``` + +### [ARM RPC008 rule](https://armwiki.azurewebsites.net/api_contracts/guidelines/rpc.html#rpc008-put-get-patch--list-must-return-the-same-resource-schema) + +The response model of `put`, `get`, `patch`, `list` is enforced to be same with resource model. + +Before + +```typespec + @get @armResourceRead(FooResource) read(...ResourceInstanceParameters): ArmResponse | ErrorResponse; +``` + +After + +```typespec + @get @armResourceRead(FooResource) read(...ResourceInstanceParameters): ArmResponse | ErrorResponse; +``` + +To resolve the lint issues, you can add the missing decorators or use the same resource model in response. However, the recommended way is to extend ARM operation templates on `interface`, for example: + +```typespec +using Azure.ResourceManager; + +@armResourceOperations +interface FooResourcess extends ResourceOperations {} +``` diff --git a/docs/release-notes/release-2022-12-07.md b/docs/release-notes/release-2022-12-07.md new file mode 100644 index 0000000000..d8052e3756 --- /dev/null +++ b/docs/release-notes/release-2022-12-07.md @@ -0,0 +1,52 @@ +--- +title: December 2022 +--- + +# Release Notes December 2022 (2022-12-07) + +:::danger +This release contains **breaking changes** +::: + +See TypeSpec Core [release notes](https://microsoft.github.io/typespec/release-notes/release-2022-12-07) + +## Breaking change + +See TypeSpec Core breaking changes in [release notes](https://microsoft.github.io/typespec/release-notes/release-2022-12-07) + +### `TypeSpec > @azure-tools/typespec-azure-core` - change in handling of extensible enums + +All Azure emitters (DPG, Autorest) will migrate to treating raw TypeSpec enums as extensible, without using the `@knownValues` decorator. Azure emitters that want to suppress this behavior and model raw enums as closed must use the new `@fixed` decorator. + +### `typespec-azure-core` becomes more strict on camelCase/PascalCase check + +- PascalCase must be applied to model/interface/namespace name +- camelCase must be applied to property name +- To customize query/header/query parameter name on the wire, set in `@query`, `@header` or `@path` decorator arguments, for example: + +``` +model ContentTypeParameter{ + @header("Content-type") + contentType: string; +} +``` + +- `@projectedName("json", "Content-type")` doesn't work any more on `@query`, `@header` and `@path` parameters (still work on `@body` parameter) + +To suppress the case style check warning, use `#suppress "@azure-tools/typespec-azure-core/casing-style" "reason"` + +## Deprecations + +:::caution +Deprecated items will be removed in 2 release cycle. +::: + +### `TypeSpec > @azure-tools/typespec-azure-core` Deprecation of clients decorator + +The following decorators have been deprecated + +- `@client` +- `@clientDefinition` +- (internal) `@returnsClient` + +New `@client` decorators with a different semantic are in `@azure-tools/typespec-client-generator-core` using the `Azure.ClientGenerator.Core` namespace diff --git a/docs/release-notes/release-2023-01-12.md b/docs/release-notes/release-2023-01-12.md new file mode 100644 index 0000000000..3d8c9260a6 --- /dev/null +++ b/docs/release-notes/release-2023-01-12.md @@ -0,0 +1,79 @@ +--- +title: January 2023 +--- + +# Release Notes January 2023 (2023-01-12) + +:::danger +This release contains **breaking changes** +::: + +See TypeSpec Core [release notes](https://microsoft.github.io/typespec/release-notes/release-2023-01-12) + +## Breaking Changes + +### `Azure.Core` operation customization has changed + +Prior to the January 2023 release, `Azure.Core` lifecycle operations were customized using a `TCustom` template parameter which expected a `parameters` and/or `response` property which indicates the customizations to be applied for that operation. + +In this release, we have changed to a new Service Traits design which is more flexible and enables customizations for individual operations as well as all operations across an entire service specification. + +Documentation and additional details can be found in this page of the `Azure.Core` documentation: + +https://azure.github.io/typespec-azure/docs/getstarted/azure-core/step09 + +#### Migrating to the new model + +If you have previously been customizing operation parameters using the `parameters` field of `TCustom`, you should now use either `QueryParametersTrait` or `RequestHeadersTrait`. If you were customizing response headers with the `response` field of `TCustom`, you should now use `ResponseHeadersTrait` for customization. + +The documentation link above explains how to use these trait types. + +## Deprecations + +:::caution +Deprecated items will be removed in 2 release cycles. +::: + +### `@collectionFormat` decorator is deprecated + +The `@collectionFormat` decorator in `@azure-tools/typespec-autorest` is deprecated in favor of a new 'format' option in the `@query` and `@header` decorators. Note that "csv" is the new default format for representing array types in headers, while "multi" is the default format for representing array types in query parameters. + +For example + +```typespec +model Widget { + @collectionFormat("multi") + @query + colors: string[]; + + @collectionFormat("csv") + @header("x-ms-flanges") + flanges: string[]; +} +``` + +should be changed to + +```typespec +model Widget { + @query({ + format: "multi", + }) + colors: string[]; + + @header({ + name: "x-ms-flanges", + format: "csv", + }) + flanges: string[]; +} +``` + +or, taking advantage of the default format for headers and query parameters + +```typespec +model Widget { + @query colors: string[]; + @header("x-ms-flanges") flanges: string[]; +} +``` diff --git a/docs/release-notes/release-2023-02-07.md b/docs/release-notes/release-2023-02-07.md new file mode 100644 index 0000000000..703ac950be --- /dev/null +++ b/docs/release-notes/release-2023-02-07.md @@ -0,0 +1,81 @@ +--- +title: February 2023 +--- + +# Release Notes February 2023 (2023-02-07) + +:::danger +This release contains **breaking changes** +::: + +See TypeSpec Core [release notes](https://microsoft.github.io/typespec/release-notes/release-2023-02-07) + +## New Features + +### typespec-autorest + +- Added reference docs for `typespec-autorest` emitter to the website + +### typespec-azure-core + +- Allow customization of error types in the second parameter to the `Azure.Core.ResourceOperations` interface. +- Added documentation to the website + +### typespec-client-generator-core + +- Add abstractions for client and json naming `getClientName` and `getJsonName` +- Add `@include` and `exclude` decorators to control type emission +- Use `DPGContext` instead of `Program` +- Add usage and reference documentation to the website + +## Breaking Changes + +### typespec-autorest breaking changes + +- Removed deprecated `@pageable` decorator, use `Azure.Core.Page` instead +- Removed deprecated `@asyncOperationOptions` decorator. Use `@extension("x-ms-long-running-operation-options", {options})` directly instead + +### typespec-azure-core breaking changes + +#### Client sidecar types and decortors move to `typespec-client-generator-core` library + +- Removed `@client`, `@clientDefinition` and `@returnsSubclient` decorators. Use `@client` from the `typespec-client-generator-core` library instead. +- Removed `getClientItems`, `getClientDefinition`, `getClientDefinitions`, `getReturnedSubclient`, `gatherOperations` and `getClientOperations` functions. Use the `getClient` operation from `typespec-client-generator-core` instead +- Removed `ClientDefinition` interface. +- Removed `Subclient` operation template. + +### typespec-azure-resource-maneger breaking changes + +- Removed deprecated `@armNamespace` decorator. Use `@armProviderNamespace` instead. +- Removed deprecated `TenantResourceList` model. Use `ResourceListByParent` or `ResourceListAtScope` instead. +- Removed deprecated `ResourceCommonParameters` model. Use `BaseParameters` instead. +- Removed `ExtensionResourceCommonParameters` model. Use `ExtensionBaseParameters` or `Baseparameters` instead. +- Removed `CommonTenantScope` model. Use `TenantBaseParameters` or `BaseParameters` instead. + +### typespec-client-generator-core breaking changes + +- Removed `@convenienceAPI` decorator. Use `@convenientAPI` and `@protocolAPI` instead. +- Removed `getConvenienceAPIName` function. Use `shouldGenerateProtocol` and `shouldGenerateConvenient` functions instead. + +## Deprecations + +### typespec-azure-resource-manager deprecations + +#### `Azure.ResourceManager` ResourceOperations interface will be changed to TrackedResourceOperations + +The standard interface template for resource operations was called `ResourceOperations`. This has changed to +`TrackedResourceOperations` to avoid name clashes with similar resource operations interfaces in `@typespec/rest` and `@azure-tools/typespec-azure-core`. + +##### Migrating to the new model + +Change references to `ResourceOperations` to `TrackedResourceOperations`: + +```typespec +interface Widgets extends ResourceOperations {} +``` + +should be changed to: + +```typespec +interface Widgets extends TrackedResourceOperations {} +``` diff --git a/docs/release-notes/release-2023-03-13.md b/docs/release-notes/release-2023-03-13.md new file mode 100644 index 0000000000..5f55ec9a75 --- /dev/null +++ b/docs/release-notes/release-2023-03-13.md @@ -0,0 +1,47 @@ +--- +title: March 2023 +--- + +# Release Notes March 2023 (2023-03-13) + +:::danger +This release contains **breaking changes** +::: + +See TypeSpec Core [release notes](https://microsoft.github.io/typespec/release-notes/release-2023-03-13) + +See [Cadl to TypeSpec rename and migration FAQ](./cadl-typespec-migration.md) + +## New Features + +### typespec-azure-core + +- Added `getLroMetadata` helper for resolving LROs in client generation code +- Added documentation of semantic models for LROs +- Fixed issues with OperationStatus templates + +### typespec-azure-resource-manager + +- Update operation templates to conform with new ARM RPC requirements + +### typespec-client-generator-core + +- Export embedded models in Array/List/Model for `getAllModels`. +- fix getAllModels when there are no models + +## Breaking Changes + +### Package Renaming (Cadl -> TypeSpec) + +Packages now use `typespec` instead of `cadl` in package names. + +| Old Package Name | New Package Name | +| ---------------------------------------- | -------------------------------------------- | +| @azure-tools/cadl-autorest | @azure-tools/typespec-autorest | +| @azure-tools/cadl-azure-core | @azure-tools/typespec-azure-core | +| @azure-tools/cadl-azure-resource-manager | @azure-tools/typespec-azure-resource-manager | +| @azure-tools/cadl-DPG | @azure-tools/typespec-client-generator-core | +| @azure-tools/cadl-diff | @azure-tools/typespec-diff | + +The `migrate` package can be used to migrate specs to using the new package imports and namespaces. +For more information about migrating to new TypeSpec packages, see the [note on Cadl to TypeScript Migration](https://azure.github.io/typespec-azure/docs/next/release-notes/cadl-typespec-migration). diff --git a/docs/release-notes/release-2023-04-11.md b/docs/release-notes/release-2023-04-11.md new file mode 100644 index 0000000000..1bd3bbc619 --- /dev/null +++ b/docs/release-notes/release-2023-04-11.md @@ -0,0 +1,67 @@ +--- +title: April 2023 +--- + +# Release Notes April 2023 (2023-04-11) + +:::danger +This release contains **breaking changes** +::: + +See TypeSpec Core [release notes](https://microsoft.github.io/typespec/release-notes/release-2023-04-11) + +## New Features + +### @azure-tools/typespec-autorest + +- Support share route scenarios with x-ms-paths. + +### @azure-tools/typespec-azure-core + +- Add versioning support to standard Azure.Core traits via the `traitAdded` decorator +- Add a `TErrorResponse` template parameter to `RpcOperation` to make the error response type customizable + +### @azure-tools/typespec-client-generator-core + +- Add support for unions +- Add DPG shared interfaces and initial logic to create a method response +- Expose list and dict converter +- Expose converter functions, fix simple sdk types +- Update Client and Dpg prefixes to be Sdk for consistency + +## Bug Fixes + +### @azure-tools/typespec-azure-core + +- Fix CreateOrReplace Lro template +- Change `@azure-tools\typespec-azure-core\no-unknown` diagnostic from error to warning +- Suppress diagnostics in getLroMetadata execution + +### @azure-tools/typespec-client-generator-core + +- Fix intrinsic type checking in getSdkSimpleType + +## Breaking Changes + +### @azure-tools/typespec-autorest: Config interpolation + +`output-file` now use config path interpolation. Existing value must be change to include the values to interpolate. e.g. `custom.json` -> `{azure-resource-provider-folder}/{service-name}/{version-status}/{version}/custom.json` + +### @azure-tools/typespec-autorest: Remove deprecated decorator + +Removed deprecated `@collectionFormat` decorator. Use `@header({format: })` or `@query({format:})` instead. + +**Example:** + +```tsp +// Before +op list(@collectionFormat("multi") @query select: string[]): Pet[]; + +// Now +op list( + @query({ + format: "multi", + }) + select: string[], +): Pet[]; +``` diff --git a/docs/release-notes/release-2023-05-10.md b/docs/release-notes/release-2023-05-10.md new file mode 100644 index 0000000000..53b9ddd2a7 --- /dev/null +++ b/docs/release-notes/release-2023-05-10.md @@ -0,0 +1,59 @@ +--- +title: May 2023 +--- + +# Release Notes May 2023 (2023-05-10) + +See TypeSpec Core [release notes](https://microsoft.github.io/typespec/release-notes/release-2023-05-10) + +## New Features + +### @azure-tools/typespec-autorest features + +- **Added** new option `arm-types-dir` used to specify the directory for arm common types +- Respect `client` projection target to resolve `operationId` and `x-ms-client-name` + +### @azure-tools/typespec-azure-core features + +- **Added** new `operation-missing-api-version` linting rule for operations in versioned namespaces. +- Add linter rules for operation names. +- Add warning if operation has multiple non-error status codes with different schemas. +- Add linter warning if property name is the same as its enclosing model in a case-insensitive manner. +- Add warning if `OpenAPI.operationId` decorator is used in Azure specs, as it should not be required. +- Add linter warning if orderBy is used as a parameter to list operations. +- Add linter warning if request body is a raw array type. +- **Added** new `byos` linting rule, warning against storage management +- **Added** linter rule recommending to use `csv` for query and header collection format. +- [Linter] Added new rule against using fixed enum as discriminator +- **Added** new linting rule discouraging use of nullable properties +- **Added** new `no-object` linting rule warning against usage of `object` type +- **Added** linting rule discouraging use of `offsetDateTime` +- Add trait properties to parameters and response of `RpcOperation` + +### @azure-tools/typespec-azure-resource-manager features + +- Added templates for checkNameAvailability +- **Added** Support for the new autorest `arm-types-dir` option + +### @azure-tools/typespec-client-generator-core features + +- **Added** getSdkModelPropertyType +- **Added** enum converter +- **Added** duration to client format +- **Added** lint rule for @friendlyName. +- **Added** getSdkConstant +- Compete transitive closure of @internal methods and models +- generate nullable enums +- refine types in union and enum +- remove support for zonedDateTime + +### @azure-tools/typespec-azure-core bug fixes + +- Fix issue with LongRunningResourceCreateWithServiceProvidedName. +- Update SkipQueryParameter default to 0. +- FIx: `byos` rule doesn't report twice on `op is` referencing a template instance + +### @azure-tools/typespec-azure-resource-manager fixes + +- Fix issue where a decorator renames operations in a way that is contrary to guidelines. +- Fix issue with overriding interface lifecycle operations diff --git a/docs/release-notes/release-2023-06-06.md b/docs/release-notes/release-2023-06-06.md new file mode 100644 index 0000000000..07b39b2520 --- /dev/null +++ b/docs/release-notes/release-2023-06-06.md @@ -0,0 +1,131 @@ +--- +title: June 2023 +--- + +# Release Notes June 2023 (2023-06-06) + +:::danger +This release contains **breaking changes** +::: + +See TypeSpec Core [release notes](https://microsoft.github.io/typespec/release-notes/release-2023-06-06) + +## New Features + +- .Net packages now published to public Nuget +- Decorators are now fully specified in TypeSPec across all libraries. This improves reference documentation and IDE completion when using decorators. + +### `@azure-tools/typespec-azure-core` + +- Added `LongRunningRpcOperation` template to Azure.Core +- Added new scalars for known formats `uuid`, `ipV4Address`, `ipV6Address` and `eTag` +- Added descriptions to library enums + +### `@azure-tools/typespec-azure-resource-manager` + +- Added descriptions to library enums + +### `@azure-tools/typespec-client-generator-core` + +- Add support for scalars that use `@encode`. +- Add mitigation for `format` removal in `url` scalar. +- Add `scope` to internal decorator + +## Bug Fixes + +- Missing decorator signatures added for all libraries, adding reference documentation and completion help in language IDE tooling. +- OpenAPI `format` derived from encoding is fixed to favor the appropriate format +- OpenAPI parameter `@doc` now overrides the `@doc` for the underlying type + +## New Linting Rules + +### `@azure-tools/azure-core` + +- Documentation comments now required on Enums and Enum values +- Using encodings outside the known set causes a warning. +- Discourage using explicit `@route` in resource operations. +- Discourage using path parameters in RPC operations. +- Add validation to `@pollingOperation` so it can only refer to an operation that returns a model or union of models + +## Deprecations + +### Azure.Core Deprecations + +Operation templates not accessed through `ResourceOperations` should not be used in new specifications. Instead, services should specify the standard operation traits using `ResourceOperations` and use the resulting interface to define these operations. This change will not cause any deprecation warning in existing specs, but the older operations should not be used for new APIs. + +#### Old (deprecated) operations pattern + +```typespec +op get is Azure.Core.ResourceRead; +``` + +#### New operations pattern + +```typespec +alias ServiceTraits = SupportsRepeatableRequests & + SupportsConditionalRequests & + SupportsClientRequestId; + +alias Operations = Azure.Core.ResourceOperations; + +op get is Operations.ResourceRead; +``` + +This deprecation impacts the following operations: + +- Azure.Core.ResourceCreateOrReplace +- Azure.Core.LongRunningResourceCreateOrReplace +- Azure.Core.ResourceCreateOrUpdate +- Azure.Core.LongRunningResourceCreateOrUpdate +- Azure.Core.ResourceUpdate +- Azure.Core.ResourceCreateWithServiceProvidedName +- Azure.Core.LongRunningResourceCreateWithServiceProvidedName +- Azure.Core.ResourceRead +- Azure.Core.ResourceDelete +- Azure.Core.LongRunningResourceDelete +- Azure.Core.ResourceList +- Azure.Core.ResourceAction +- Azure.Core.LongRunningResourceAction +- Azure.Core.ResourceCollectionAction +- Azure.Core.LongRunningResourceCollectionAction + +## Breaking Changes + +### `@azure-tools/typespec-autorest` Breaking Changes + +- Examples for the same operation must have unique titles. In the past, one of the examples would have been silently dropped. When examples for an operation have duplicate titles, a diagnostic is thrown, prompting users to fix the problem. +- In operations with an implicit body parameter, the body parameter is now required. + +### `@azure-tools/typespec-azure-core` Breaking Changes + +- Standard error type schema corrected to match API Guidelines. This will cause OpenAPI emission to change to the correct error schema. + +### `@azure-tools/typespec-azure-resource-manager` Breaking Changes + +- The following templates now use `TypeSpec.Reflection.Model` as the constraint for their `TProperties` parameter. Any template that builds on or uses these templates should have the same parameter constraint: + - ResourceUpdateModelProperties + - ResourceUpdateModel + - ProxyresourceUpdateModel + - ResourceOperations + - TrackedResourceOperations + - ResourceInstanceOperations + - TenantResourceOperations + - ResourceUpdateAsync + - ResourceUpdateSync + - ExtensionResourceInstanceOperations + - ExtensionResourceOperations + - ResourceUpdate + - ProxyResourceUpdate + - ExtensionResourceUpdate + - TenantResourceUpdate + - ArmResourcePatchAsync + - ArmResourcePatchSync +- CustomPatch templates were updated to that the `TPatchModel` parameter extends `TypeSpec.Reflection.Model`. Any template that builds on or uses these templates should use the same parameter constraint: + - ArmCustomPatchAsync + - ArmCustomPatchSync +- Resource Action operation teamplates have been updated to use `TypeSPec.Reflection.Model` as the constraint for `TRequest` and `TResponse` parameters. Any template that builds on or uses these templates should have the same parameter constraint: + - ArmResourceActionAsync + - ArmResourceActionSync + - ArmResourceActionNoContentAsync + - ArmResourceActionNoContentSync +- The `checkNameAvailability`, `checkGlobalNameAvailability` and `checkLocalNameAvailability` templates have been updated so that all of their parameters extend `TypeSpec.Model.Reflection`. Any template that builds on or uses these templates should use the same parameter constraint. diff --git a/docs/release-notes/release-2023-07-11.md b/docs/release-notes/release-2023-07-11.md new file mode 100644 index 0000000000..dd4ed1d05a --- /dev/null +++ b/docs/release-notes/release-2023-07-11.md @@ -0,0 +1,62 @@ +--- +title: July 2023 +--- + +# Release Notes July 2023 (2023-07-11) + +:::danger +This release contains **breaking changes** +::: + +See TypeSpec Core [release notes](https://microsoft.github.io/typespec/release-notes/release-2023-07-11) + +## New Features + +### `@azure-tools/typespec-autorest` emitter + +- Deterministically order properties in generated OpenAPI documents. This will cause some ordering changes in this release, but should prevent ordering changes in the future. +- Allow use of an `enum` type as a discriminator +- Add warning for unsupported empty `enum` types +- Show error details when failing to load an example file +- Add support for nullable `enum` properties +- Omit `x-typespec-name` extension by default from autorest output. A new configuration and command line option `include-x-typespec-name: \"inline-only\" | \"never\"` has been added to get previous behavior +- Allow `readonly` schema for long-running operation status values, like `provisioningState`. Enable the new configuration option `use-read-only-status-schema: true` to get the new behavior. +- Support non-specific scalar types like `numeric`, `integer` and `float`. Emit a warning when these types are used and emit the best approximation for the type. + +### `@azure-tools/typespec-azure-resource-manager` library + +- Add operation templates to support new Asynchronous delete API guidelines `ArmResourceDeleteWithoutOkAsync` +- Add operation templates to support new Asynchronous action operations with no return value `ArmResourceActionNoResponseContentAsync` + +### `@azure-tools/typespec-azure-core` bug fixes + +- Correct `GetLroMetadata` response for operations not tied to a resource (e.g. RPC operations) + +### `@azure-tools/typespec-azure-resource-manager` bug fixes + +- Fix generated route for `CheckLocalNameAvailability` operation template +- Update `LocationParameter` to reference ARM common types + +### `@azure-tools/typespec-client-generator-core` bug fixes + +- fix for decorator about `scalar extends string/numeric` + +## New Linting Rules (`@azure-tools/typespec-azure-core`) + +- Use standard names for operations +- Ensure `NoContent` (204) responses do not have a response body and `OK` (200) and `Created` (201) responses have a response body +- Ensure RPC operations marked with `@get` or `@delete` don't have request bodies +- Require `@useAuth` decorator on Azure services +- Discourage overriding the HTTP verb on standard operations +- Discourage custom 4xx and 5xx responses + +## Deprecations + +### `@azure-tools/typespec-azure-resource-manager` deprecations + +- `ArmResourceDeleteAsync` is deprecated due to new ARM RPC guidelines. Asynchronous delete operations should use `ArmResourceDeleteWithoutOkAsync` +- `ArmResourceActionNoContentAsync` is deprecated due to new ARM RPC guidelines. Asynchronous actions with no response value should use `ArmResourceActionNoResponseContentAsync` + +## Breaking Changes + +There are breaking changes in typespec core libraries, see [release notes](https://microsoft.github.io/typespec/release-notes/release-2023-07-11) for details. diff --git a/docs/release-notes/release-2023-08-08.md b/docs/release-notes/release-2023-08-08.md new file mode 100644 index 0000000000..a21e5fc415 --- /dev/null +++ b/docs/release-notes/release-2023-08-08.md @@ -0,0 +1,55 @@ +--- +title: August 2023 +--- + +# Release Notes August 2023 (2023-08-08) + +:::danger +This release contains **breaking changes** +::: + +See TypeSpec Core [release notes](https://microsoft.github.io/typespec/release-notes/release-2023-08-08) + +## New Features + +### `@azure-tools/typespec-autorest` New Features + +- Annotate long-running operations with \"x-ms-long-running-operation\" extension. +- Add interpolation support of `emitter-output-dir` for the `arm-types-dir` emitter option. +- Add support for `@info` decorator providing the ability to specify the additional fields from openapi info object. + +### `@azure-tools/typespec-azure-core` New Features + +- Add new properties to `LroMetadata` returned from `getLroMetadata` +- Update ResourceCreateOrReplace template to include StatusMonitor information. +- Update `CustomPage` to generate an informative model name on instantiation +- Add conceptual documentation on custom LRO patterns in Azure.Core + +### `@azure-tools/typespec-azure-resource-manager` New Features + +- Allow shared libraries of ARM types and operations +- Allow override of arm provider namespace +- Add descriptions for `ArmResourceCreateOrUpdate` responses to indicate that an `OK` response indicates and update ans a `Created` response indicates a newly created resource. +- Add new template `ArmResourceCreateOrReplaceSync` that returns `OK` and `Accepted` responses for synchronous PUT requests. +- Add template alias `ArmResourceCreateOrReplaceAsync` for consistent naming of recommended templates for `PUT` operations. + +### `@azure-tools/typespec-autorest` Bug Fixes + +- Fix: Apply `@minItems` and `@maxItems` decorators on model arrays. + +### `@azure-tools/typespec-azure-core` Bug Fixes + +- Fix LRO status header property detection for `Location` headers + +### `@azure-tools/typespec-azure-resource-manager` Bug Fixes + +- Fix `ArmTagsPatchAsync` with a default value for the second (unused) parameter. + +### `@azure-tools/typespec-client-generator-core` Bug Fixes + +- add transitivity support for `@include` +- "Fix the `getEmitterTargetName` function to use the real name of the emitter + +## Breaking Changes + +- There are breaking changes in the TypeSpec core compiler, see [the release notes](https://microsoft.github.io/typespec/release-notes/release-2023-08-08) for details. diff --git a/docs/release-notes/release-2023-09-12.md b/docs/release-notes/release-2023-09-12.md new file mode 100644 index 0000000000..b84effce63 --- /dev/null +++ b/docs/release-notes/release-2023-09-12.md @@ -0,0 +1,106 @@ +--- +title: September 2023 +--- + +# Release Notes September 2023 (2023-09-12) + +:::danger +This release contains **breaking changes** +::: + +See TypeSpec Core [release notes](https://microsoft.github.io/typespec/release-notes/release-2023-09-12) + +## New Features + +### `@azure-tools/typespec-autorest` New Features + +- Handle general encodings for `utcDateTime`. +- Support Http operations that set custom visibility. + +### `@azure-tools/typespec-azure-core` New Features + +- Migrate linter rules into a new ruleset. Linter rules will NOT be automatically enabled. Add the following to your `tspconfig.yaml` to execute all typespec-azure-core linter rules: + + ```yaml + linter: + extends: ["@azure-tools/typespec-azure-core/all"] + ``` + +- Trait properties can now specify a `@traitContext`, which overrides the value supplied in the trait envelope model. This enables finer granularity for applying specific properties through traits. +- Add new decorators for customizing status monitor types in long-running operations. + - `@lroResult` decorates the property containing the final operation result when an operation completes successfully. This is only necessary if the property has a name other than `result`. + - `@lroErrorResult` decorates the property containing errors when an operation fails. This is only necessary if the property has a name other than `error`. + - `@pollingOperationParameter` decorates request parameters or response properties that correspond to request parameters in the linked operation. This allows emitters and libraries to call the polling operation using the result of the original operation. +- Add new properties to OperationLinkMetadata returned from `getOperationLink`: + - `link` contains the mechanism for retrieving the status monitor + - `result` contains type information returned from the linked operation. + - `parameterMap` contains a map from parameters and response properties of the original operation to parameters of the linked operation. +- Add new validation to `@pollingOperation` to ensure the referenced operation is a valid status monitor, and the decorated (original) operation has a valid link to the operation, or contains response headers that link to the status monitor. +- Allow multiple terminal status values for successful, failed, and canceled long-running operations. +- Add new properties to `LroMetadata` returned from `getLroMetadata` + - `envelopeResult` contains the status monitor type + - `logicalPath` contains a path to the field containing lro results (if any). +- `@pollingOperation` and `@finalOperation` determine the status monitor type and final result type for long-running operations +- Add [conceptual documentation and samples for long-running operations](https://azure.github.io/typespec-azure/docs/howtos/Azure%20Core/long-running-operations). + +### `@azure-tools/typespec-azure-resource-manager` New Features + +- Migrate linter rules into a new ruleset. Linter rules will NOT be automatically enabled. Add the following to your `tspconfig.yaml` to execute all typespec-azure-resource-manager linter rules: + + ```yaml + linter: + extends: ["@azure-tools/typespec-azure-resource-manager/all"] + ``` + +- Add common types and sample for `privateLinks` and `privateEndpoints` + +### `@azure-tools/typespec-client-generator-core` New Features + +- Add new calls to determine if a service is an ARM service. +- Add documentation for SDK types. +- handle both `@friendlyName` and `@projectedName` in function `getLibraryName()`. +- Deduplicate models in the map. +- Fix enum discriminator type for base class. +- Add `getAllModels` function. +- Make `__raw` optional. +- Add tuple type support. +- Add `@usage` and `@access` decorators. + +## Bug Fixes + +### `@azure-tools/typespec-autorest` Bug Fixes + +- Fix handling of `model extends Record` and `model is Record`. +- Resolve the correct `nextLinkName` if property name has `.`. +- Fix handling of header with encode `rfc7231` +- Fix sorting the properties in known OpenAPI extensions. + +### `@azure-tools/typespec-azure-core` Bug Fixes + +- Apply conditional request headers to all appropriate operations. +- Fixes to allow traits to work with `RpcOperation` and `LongRunningRpcOperation` + +### `@azure-tools/typespec-azure-resource-manager` Bug Fixes + +- Change `ArmResourceActionNoContentAsync` to indicate it should not be used for new operations. `ArmResourceActionNoResponseContentAsync` should be used instead. + +### `@azure-tools/typespec-client-generator-core` Bug Fixes + +- Fix enum discriminator type for base class. + +## Deprecations + +### `@azure-tools/typespec-azure-core` Deprecations + +- Paging metadata provides a new segments array to resolve `items` and `nextLink` path. The old `itemsPath` and `nextLinkPath` are deprecated as they cannot be used when a property name contains a `.`. + +## Breaking Changes + +- There are breaking changes in the TypeSpec core compiler, see [the release notes](https://microsoft.github.io/typespec/release-notes/release-2023-09-12) for details. + +### `@azure-tools/typespec-azure-core` Breaking Changes + +- `@pollingOperation` now overrides the value provided in `@pollingLocation` in operation responses. +- `@finalOperation` now overrides the value provided in `@finalLocation` in operation responses. +- `CreateOrUpdate` and `LongRunningCreateOrUpdate` now include create-only properties in the request body. +- `getLongRunningStates` and `extractLroStates` now return an array of strings for `succeededState`, `failedState` and `canceledState` properties. diff --git a/docs/release-notes/release-2023-10-11.md b/docs/release-notes/release-2023-10-11.md new file mode 100644 index 0000000000..603baf4e1c --- /dev/null +++ b/docs/release-notes/release-2023-10-11.md @@ -0,0 +1,59 @@ +--- +title: October 2023 +--- + +# Release Notes October 2023 (2023-10-11) + +:::danger +This release contains **breaking changes** +::: + +See TypeSpec Core [release notes](https://microsoft.github.io/typespec/release-notes/release-2023-10-11) + +## New Features + +### `@azure-tools/typespec-autorest` New Features + +- Add support for status code ranges. + +### `@azure-tools/typespec-azure-core` New Features + +- Migrate 'friendly-name' rule from typespec-code-generator-core to typespec-azure-core. + +### `@azure-tools/typespec-client-generator-core` New Features + +- Migrate 'friendly-name' rule from typespec-code-generator-core to typespec-azure-core. +- Add support for cross language definition id. +- Add ARM to sdk context. +- Return TypeSpec Union type for string literal union. +- Refine `getAllModels` implementation including: + - Add deprecation info + - Add known values + - Change discriminator type in base model + +### `@azure-tools/typespec-autorest` Bug Fixes + +- Fix: A diagnostic will now be emitted for any HTTP authentication scheme not supported by OpenAPI 2. + +### `@azure-tools/typespec-azure-core` Bug Fixes + +- Fix: Compiler crash when `createLroMetadata`` was called with an incomplete LRO specification.` + +### `@azure-tools/typespec-client-generator-core` Bug Fixes + +- Fix: Correct type for the values of SdkTupleType. +- Fix: Handle models with duplicate names. +- Fix: Correct union type handling logic in common interface. + +### `@azure-tools/typespec-msbuild-target` Bug Fixes + +- Fix: Remove dependency on `Language==C#`. + +## Breaking Changes + +- There are breaking changes in the TypeSpec core libraries, see [the release notes](https://microsoft.github.io/typespec/release-notes/release-2023-10-11) for details. + +### `@azure-tools/typespec-azure-core` Breaking Changes + +- Fix parameter order of `Azure.Core.Foundations.GetOperationStatus`. +- When an interface based on `ResourceOperations` is created, a unique diagnostic will now be raised for each missing required trait. This may require new suppressions to be added to existing specifications. diff --git a/docs/release-notes/release-2023-11-07.md b/docs/release-notes/release-2023-11-07.md new file mode 100644 index 0000000000..787e9cf02c --- /dev/null +++ b/docs/release-notes/release-2023-11-07.md @@ -0,0 +1,96 @@ +--- +title: November 2023 +--- + +# Release Notes November 2023 (2023-11-07) + +:::danger +This release contains **breaking changes** +::: + +See TypeSpec Core [release notes](https://microsoft.github.io/typespec/release-notes/release-2023-11-07) + +## New Features + +### `@azure-tools/typespec-autorest` New Features + +- Add support for ARM common definitions versioning. +- Add better support for `@sharedRoutes` by automatically disambiguating x-ms-paths when operation signatures don't differ by query params. + +### `@azure-tools/typespec-azure-core` New Features + +- Add new linter rules discouraging misuse of inheritance and composition. Warn when extending a model without a discriminator or alternatively when composing a model with a discriminator. + +### `@azure-tools/typespec-azure-resource-manager` New Features + +- ARM `common-types` versions can now be selected for each service specification version using the `Azure.ResourceManager.CommonTypes.Versions` enum with the new `@armCommonTypesVersion` decorator. +- Add support for Private Links `v5` common types. +- Add support for Customer Managed Keys `v5` common-types. + +### `@azure-tools/typespec-client-generator-core` New Features + +- Add parent enum as type on `SdkEnumValueType`. +- Add `emitterName` and `emitterContext` to `SdkContext`. + +### `@azure-tools/typespec-providerhub-controller` New Features + +- Add extensibility point to generated enum struct - marked generated struct as `readonly partial`. +- Added common base class for `ResourceControllerBase` classes. + +## Bug Fixes + +### `@azure-tools/typespec-autorest` Bug Fixes + +- Fix: Stops emitting an error when using `@body _: void` in operation parameters and treat it as no body. + +### `@azure-tools/typespec-azure-core` Bug Fixes + +- Fix: `getLroMetadata` did not return the correct `logicalResult` when the `@finalLocation` was a `ResourceLocation`. +- Fix: Correct property validation for `@lroResult` and `@lroErrorResult`. + +### `@azure-tools/typespec-client-generator-core` Bug Fixes + +- Fix: `@access` does not propagate. +- Fix: usage override for orphan enum. + +### `@azure-tools/typespec-msbuild-target` Bug Fixes + +- Fix: Removed condition `Language==C#`. + +### `@azure-tools/typespec-providerhub-controller` Bug Fixes + +- Fix: Ensure models referenced only in derived types are generated. + +## Deprecations + +### `@azure-tools/typespec-client-generator-core` Deprecations + +- Deprecate `@include`, `@exclude`, `@internal`, `@clientFormat`. + +## Breaking Changes + +- There are breaking changes in the TypeSpec core libraries, see [the release notes](https://microsoft.github.io/typespec/release-notes/release-2023-11-07) for details. + +### Typescript types breaking change + +The `package.json` files for all packages have been changed to use the standard `types` field instead of the legacy `typesVersions` field to specify types for subpath exports. This means that packages consuming TypeSpec must use the `moduleResolution` setting with `node16` or `nodenext` in their `tsconfig.json`. +You might see the following error: + +```bash +Cannot find module '@typespec/compiler/testing'. Did you mean to set the 'moduleResolution' option to 'nodenext' +``` + +This can be resolved by changing the following in `tsconfig.json`: + +```diff +-"moduleResolution": "ESNext", ++"moduleResolution": "node16", +``` + +### Dropped Support for Node version 16 + +- All typespec packages now specify node 18 as the minimum version. Consuming packages should no longer use node 16 and update the node specification in the `engines` section of their package.json file appropriately. + +### `@azure-tools/typespec-azure-core` Breaking Changes + +- Removed `Inprogress` from `OperationState` enum. Added `Running`, `NotStarted` states. All APIs that use this enumeration for operation status values will now include these states. diff --git a/docs/release-notes/release-2023-12-06.md b/docs/release-notes/release-2023-12-06.md new file mode 100644 index 0000000000..7cd5622e46 --- /dev/null +++ b/docs/release-notes/release-2023-12-06.md @@ -0,0 +1,68 @@ +--- +title: December 2023 +--- + +# Release Notes December 2023 (2023-12-06) + +:::danger +This release contains **breaking changes** +::: + +See TypeSpec Core [release notes](https://microsoft.github.io/typespec/release-notes/release-2023-12-06) + +## New Features + +### `@azure-tools/typespec-autorest` New Features + +- Add validation of formats emitted by the `@format` decorator - emit a warning and do not emit formats that are not understood by autorest. +- Support `EmbeddingVector` types from Azure.Core by emitting `x-ms-embedding-vector` extension. +- Add support for representing unions of literals as fixed and open enumerations, using `enum []` and `x-ms-enum`. +- Support string interpolation through new `StringTemplate` types. + +### `@azure-tools/typespec-azure-core` New Features + +- Add `no-enum` linting rule to discourage the use of enumerations in favor of unions, but do not add to the default ruleset. +- Add model template and supporting decorator to implement `EmbeddingVector` types. +- Add new helper `getUnionAsEnum` to try to convert a union of literals to a fixed or extensible enum. +- Add additional fields to `LroMetadata` to support long-running operations with no logical response (void): + - `finalResult: Model | "void"`: The intended result of the logical operation on successful completion. + - `finalEnvelopeResult: Model | "void"`: The Http response body returned in the last request in the logical operation on successful completion. + - `finalResultPath: string`: The path to the final result in the final envelope result. + +### `@azure-tools/typespec-azure-resource-manager` New Features + +- Add support for `SubscriptionLifecycleNotification` endpoint in generated RP code. + +### `@azure-tools/typespec-client-generator-core` New Features + +- Generate names for anonymous models and unions +- Support `scope` parameter for `@client`, `@operationGroup`, `@convenientApi` and `@protocolApi` decorators. +- Support core `decimal` types. +- Support unbranded client and operation group detection + +### `@azure-tools/typespec-providerhub-controller` New Features + +- Add generated endpoints for SubscriptionLifecycleNotification extension for subscription-based resources. +- Generate versioning classes regardless the number of API versions defined in the spec. +- Add `CancellationToken` parameter to generated controller methods for resource operations. +- Allow enums as discriminator values for polymorphic classes. + +### `@azure-tools/typespec-providerhub-templates` New Features + +- Enable new features for `SubscriptionLifecycleNotification`, `CancellationToken`, and always generating versioning classes. +- Use Operation templates instead of interface templates to define resource operations. + +## Bug Fixes + +### `@azure-tools/typespec-azure-core` Bug Fixes + +- Fix inconsistent `logicalPath` in `getLroMetadata` results (#3725). +- Fix incorrect `final-state-via` in `getLroMetadata` results for custom PUT operations (#3724). + +### `@azure-tools/typespec-client-generator-core` Bug Fixes + +- Fix corner cases for anonymous models. + +## Breaking Changes + +- There are breaking changes in the TypeSpec core libraries, see [the release notes](https://microsoft.github.io/typespec/release-notes/release-2023-12-06) for details. diff --git a/docs/troubleshoot/arm-proxy-operations-error.md b/docs/troubleshoot/arm-proxy-operations-error.md new file mode 100644 index 0000000000..25e7097988 --- /dev/null +++ b/docs/troubleshoot/arm-proxy-operations-error.md @@ -0,0 +1,37 @@ +# Duplicate Body Error When Instantiating `ProxyResourceOperations` + +When instantiating the `ProxyResourceOperations` template with an incorrect second parameter, a "duplicate body" error like the following may result: + +```javascript +error @typespec/http/duplicate-body +Operation has a @body and an unannotated parameter. There can only be one representing the body +``` + +## Symptoms + +When instantiating the `ProxyResourceOperations` template, it is easy to assume that the second parameter should contain the RP-specific properties of the resource, as with the `TrackedResourceOperations` template. + +```typespec +// INCORRECT USAGE OF THE TEMPLATE +interface MyResourceOperations extends ProxyResourceOperations {} +``` + +However, this usage is **incorrect**, the second parameter to `ProxyResourceOperations` is optional and, if provided, is expecting an entirely different TypeSpec type. If the resource properties are supplied instead, a "duplicate body" error like the following will result: + +```javascript +error @typespec/http/duplicate-body +Operation has a @body and an unannotated parameter. There can only be one representing the body +``` + +## Cause + +This error occurs because the second parameter is an optional override for the shared request parameters for the `read`, `createOrUpdate`, and `delete` operations for the proxy resource. When the rp-specific properties are provided instead, the operation request parameters clash with the request body parameter for `createOrUpdate`. + +## Workaround + +To fix this error, provide only one parameter to ProxyResourceOperations, the type of the resource that the operations apply to. + +```typespec +// CORRECT +interface MyResourceOperations extends ProxyResourceOperations {} +``` diff --git a/docs/troubleshoot/sdl.md b/docs/troubleshoot/sdl.md new file mode 100644 index 0000000000..d4f282c7a5 --- /dev/null +++ b/docs/troubleshoot/sdl.md @@ -0,0 +1,15 @@ +# OneBranch SDL + +SDL violations for [Nuget Multifeed Config](https://docs.opensource.microsoft.com/tools/cg/how-to/nuget-multifeed-configuration/) + +## Symptoms + +If you get S360 violations for SDL or your OneBranch builds are breaking + +## Cause + +The Template project creates Nuget Config files with artifact feeds for azure-sdk-for-net and nuget.org. Having multiple feeds is a security vulnerability and violates the SDL. + +## Workaround + +Create your own ADO Artifact Feed, and add `https://api.nuget.org/v3/index.json` and `azure-feed://azure-sdk/public/azure-sdk-for-net@Local` as upstream feeds. This enables you to only specify your package feed, and then have your feed pull from the upstream feeds. diff --git a/docs/troubleshoot/suppresswarnings.md b/docs/troubleshoot/suppresswarnings.md new file mode 100644 index 0000000000..31caad41cd --- /dev/null +++ b/docs/troubleshoot/suppresswarnings.md @@ -0,0 +1,23 @@ +# How to suppress warnings + +This article helps you to suppress warning messages generated by TypeSpec and libraries. + +## Symptoms + +TypeSpec core and libraries could generate and output warning messages based on linting rules. + +## Cause + +These linting rules are introduced to ensure high-quality specs being generated. Sometimes they are used to call out areas needs developer attention to meet library or organization guidelines. + +## Workaround + +Some of the rules after review can be suppressed to get clean compile outputs using `#suppress ErrCode ReasonMsg` statement. The error code is the string reported in compiler output. + +For example: + +``` +#suppress "@azure-tools/typespec-providerhub/no-identifier-property-in-array-item" "Error items have no unique identifier." +@doc("An array of details about specific errors that led to this reported error.") +details: Error[]; +``` diff --git a/docs/troubleshoot/troubleshoot_template b/docs/troubleshoot/troubleshoot_template new file mode 100644 index 0000000000..734f0a37c6 --- /dev/null +++ b/docs/troubleshoot/troubleshoot_template @@ -0,0 +1,9 @@ +# {Issue titles} + +This article helps you... + +## Symptoms + +## Cause + +## Workaround diff --git a/docs/typespec-getting-started.md b/docs/typespec-getting-started.md new file mode 100644 index 0000000000..22f3fd0f3b --- /dev/null +++ b/docs/typespec-getting-started.md @@ -0,0 +1,82 @@ +## What is TypeSpec? + +TypeSpec (Compact API Definition Language) is a typescript-like language for defining APIs. TypeSpec is designed for code reuse, +and for Azure services, there are Azure service extensions for TypeSpec that provide high level building blocks you should use to build +your service. These libraries also contain rules that encourage following established patterns for Azure APIs. Using these building blocks +and guard rails, your service API will be easier to build, will have an easier time passing API reviews, will be consistent with other Azure +services, and will produce good API documentation, good SDKs, and good CLIs. +TypeSpec can emit the following artifacts for your service: + +- OpenAPI3 specs +- OpenAPI2 specs, suitable for check-in in to the azure-rest-api-specs repo +- Azure ProviderHub User RP controller projects. This project also contains related registration manifests and scripts for easy local testing and debugging. + +For more information on the TypeSpec language and core libraries, see [Getting started with TypeSpec](https://microsoft.github.io/typespec) + +## Setting up TypeSpec and compile first project + +### Install TypeSpec + +There are two simple options for getting TypeSpec up and running in your environment: + +- [Install directly from npm](https://github.com/microsoft/typespec#using-node--npm) + +- Use the [TypeSpec docker images](https://github.com/microsoft/typespec/blob/main/docs/docker.md) + +### Create a new TypeSpec Azure project + +- Run `tsp init` command with Azure template URL `https://aka.ms/typespec/azure-init` to create a new TypeSpec Azure project for ARM or Data-plane service APIs. This will initialize an empty TypeSpec project with correct npm package references and emitter settings for Azure services. + +- Run `tsp compile` in the project folder will compile the TypeSpec project and emit output in `tsp-output` folder. + +Once TypeSpec project has been create, the [TypeSpec language tutorial](https://microsoft.github.io/typespec) provides a good overview of the basics of the language. + +## Getting Started for Azure Management Plane Services + +Use the resources in this section for creating Azure ARM rest API specs. For ProviderHub User RP specs and service implementation, please follow the steps in the next section. + +- Documentation + - [TypeSpec Azure ARM library](https://github.com/Azure/typespec-azure/tree/main/packages/typespec-azure-resource-manager/README.md) + +## Getting Started for Azure Data Plane Services + +- Documentation + - [Getting started with TypeSpec for REST APIs](https://github.com/microsoft/typespec/blob/main/README.md#getting-started) + - [TypeSpec language tutorial](https://microsoft.github.io/typespec) + - [TypeSpec Swagger Cheat Sheet](https://github.com/microsoft/typespec/blob/main/docs/typespec-for-openapi-dev.md) +- Samples + - [Petstore Sample using Low-level Http APIs](https://github.com/microsoft/typespec/tree/main/packages/samples/petstore) + - [Petstore Sample using High-level Resource APis](https://github.com/microsoft/typespec/tree/main/packages/samples/rest/petstore) + - You can also browse the [Samples package](https://github.com/microsoft/typespec/tree/main/packages/samples) +- Video Walkthroughs + - [Getting Started with TypeSpec](https://microsoft.sharepoint.com/:v:/t/AzureDeveloperExperience/Ee5JOjqLOFFDstWe6yB0r20BXozakjHy7w2adGxQi5ztJg?e=QgqqhQ) + +## How to Get Help + +- Ask questions in the [TypeSpec Discussions Channel](https://teams.microsoft.com/l/channel/19%3a906c1efbbec54dc8949ac736633e6bdf%40thread.skype/TypeSpec%2520Discussion%2520%25F0%259F%2590%25AE?groupId=3e17dcb0-4257-4a30-b843-77f47f1d4121&tenantId=72f988bf-86f1-41af-91ab-2d7cd011db47) +- File issues in the [typespec-azure github repo](https://github.com/azure/typespec-azure/issues) + - For bugs, please include: + - A high-level description of the bug + - Expected and Actual Results + - Repro steps, including any TypeSpec code that you used + - Any error messages you saw, including stack traces. For issues with VS or VS Code tooling see [Troubleshooting VSCode Tooling and Filing Issues](#troubleshooting-vscode-tooling-and-filing-issues) + +### Troubleshooting VSCode Tooling and Filing Issues + +If you run into a problem with the TypeSpec-specific tooling in VS Code, please try to capture the issue, and include any log information. If IntelliSense, syntax highlighting or other language features don't appear to be working: + +- Ensure that 'TypeSpec' is the selected language format for your document (this should happen automatically if your file uses the .tsp suffix) + ![image](https://user-images.githubusercontent.com/1054056/144310539-4e9bfbb9-1366-4b6f-a490-875e9bd68669.png) +- Choose Output from the View menu to see the output of the language server (View -> Output) + ![image](https://user-images.githubusercontent.com/1054056/144310719-4bca242f-f11c-484c-91c7-6914fcf7fe3a.png) +- Capture any output, including stack traces, and include in your [github issue](https://github.com/azure/typespec-azure/issues). + ![image](https://user-images.githubusercontent.com/1054056/144310907-ec945f54-0fd8-40a4-936c-60669f4a052f.png) +- Restart VS Code to restart the language server + +## More Information About TypeSpec + +Some additional sources: + +- Recordings + - [TypeSpec lunch-and-learn for ARM in Stream Channel](https://msit.microsoftstream.com/channel/97c90840-98dc-b478-19e5-f1ecdab7312b) + - [TypeSpec lunch-and-learn for Azure SDK](https://microsoft-my.sharepoint.com/:v:/r/personal/scotk_microsoft_com/Documents/Recordings/Lunch%20Learning%20Series%20_%20Mark%20Cowlishaw%20-%20TypeSpec%20Walkthrough-20211117_120334-Meeting%20Recording.mp4?csf=1&web=1&e=27IgaX) diff --git a/eng/MSSharedLibKey.snk b/eng/MSSharedLibKey.snk new file mode 100644 index 0000000000000000000000000000000000000000..695f1b38774e839e5b90059bfb7f32df1dff4223 GIT binary patch literal 160 zcmV;R0AK$ABme*efB*oL000060ssI2Bme+XQ$aBR1ONa50098C{E+7Ye`kjtcRG*W zi8#m|)B?I?xgZ^2Sw5D;l4TxtPwG;3)3^j?qDHjEteSTF{rM+4WI`v zCD?tsZ^;k+S&r1&HRMb=j738S=;J$tCKNrc$@P|lZ { + @doc("Name of employee") + @pattern("^[a-zA-Z0-9-]{3,24}$") + @key("employeeName") + @path + @segment("employees") + name: string; +} + +@doc("Employee properties") +model EmployeeProperties { + @doc("Age of employee") + age?: int32; + + @doc("City of employee") + city?: string; + + @doc("Profile of employee") + @encode("base64url") + profile?: bytes; + + @visibility("read") + @doc("The status of the last operation.") + provisioningState?: ProvisioningState; +} + +@lroStatus +enum ProvisioningState { + ...ResourceProvisioningState, + Provisioning, + Updating, + Deleting, + Accepted, +} + +interface Operations extends Azure.ResourceManager.Operations {} + +@armResourceOperations +interface Employees { + get is ArmResourceRead; + createOrUpdate is ArmResourceCreateOrUpdateAsync; + update is ArmResourcePatchSync; + delete is ArmResourceDeleteSync; + listByResourceGroup is ArmResourceListByParent; + listBySubscription is ArmListBySubscription; +} diff --git a/eng/feeds/arm/tspconfig.yaml b/eng/feeds/arm/tspconfig.yaml new file mode 100644 index 0000000000..e1f088fdac --- /dev/null +++ b/eng/feeds/arm/tspconfig.yaml @@ -0,0 +1,9 @@ +emit: + - '@azure-tools/typespec-autorest' +options: + '@azure-tools/typespec-autorest': + use-read-only-status-schema: true + emitter-output-dir: "{project-root}/.." + azure-resource-provider-folder: "resource-manager" + output-file: "{azure-resource-provider-folder}/{service-name}/{version-status}/{version}/openapi.json" + examples-directory: "examples" diff --git a/eng/feeds/azure-scaffolding.json b/eng/feeds/azure-scaffolding.json new file mode 100644 index 0000000000..56d6f79c40 --- /dev/null +++ b/eng/feeds/azure-scaffolding.json @@ -0,0 +1,104 @@ +{ + "azure-core": { + "title": "(rest-api-spec repo) Azure Data Plane Service Project", + "description": "Create a project representing an Azure service Data Plane API", + "libraries": [], + "skipCompilerPackage": true, + "config": {}, + "files": [ + { + "path": "./data-plane/main.tsp", + "destination": "main.tsp" + }, + { + "path": "./data-plane/client.tsp", + "destination": "client.tsp" + }, + { + "path": "./data-plane/tspconfig.yaml", + "destination": "tspconfig.yaml" + }, + { + "path": "./data-plane/examples/2022-11-01-preview/Widgets_CreateOrUpdateWidgetSample.json", + "destination": "examples/2022-11-01-preview/Widgets_CreateOrUpdateWidgetSample.json" + }, + { + "path": "./data-plane/examples/2022-11-01-preview/Widgets_DeleteWidgetSample.json", + "destination": "examples/2022-11-01-preview/Widgets_DeleteWidgetSample.json" + }, + { + "path": "./data-plane/examples/2022-11-01-preview/Widgets_GetWidgetOperationStatusSample.json", + "destination": "examples/2022-11-01-preview/Widgets_GetWidgetOperationStatusSample.json" + }, + { + "path": "./data-plane/examples/2022-11-01-preview/Widgets_GetWidgetSample.json", + "destination": "examples/2022-11-01-preview/Widgets_GetWidgetSample.json" + }, + { + "path": "./data-plane/examples/2022-11-01-preview/Widgets_ListWidgetsSample.json", + "destination": "examples/2022-11-01-preview/Widgets_ListWidgetsSample.json" + } + ], + "inputs": { + "ServiceNamespace": { + "description": "Please provide service namespace in Pascal case:", + "type": "text", + "initialValue": "Azure.Contoso" + } + } + }, + "azure-arm": { + "title": "(rest-api-spec repo) Azure Resource Manager Service Project", + "description": "Create a project in rest-api-spec repo, representing an Azure service ARM API", + "libraries": [], + "skipCompilerPackage": true, + "config": { + "emit": ["@azure-tools/typespec-autorest"] + }, + "files": [ + { + "path": "./arm/main.tsp", + "destination": "main.tsp" + }, + { + "path": "./arm/tspconfig.yaml", + "destination": "tspconfig.yaml" + }, + { + "path": "./arm/examples/Employees_CreateOrUpdate.json", + "destination": "examples/Employees_CreateOrUpdate.json" + }, + { + "path": "./arm/examples/Employees_Delete.json", + "destination": "examples/Employees_Delete.json" + }, + { + "path": "./arm/examples/Employees_ListByResourceGroup.json", + "destination": "examples/Employees_ListByResourceGroup.json" + }, + { + "path": "./arm/examples/Employees_ListBySubscription.json", + "destination": "examples/Employees_ListBySubscription.json" + }, + { + "path": "./arm/examples/Employees_Update.json", + "destination": "examples/Employees_Update.json" + }, + { + "path": "./arm/examples/Employees_Get.json", + "destination": "examples/Employees_Get.json" + }, + { + "path": "./arm/examples/Operations_List.json", + "destination": "examples/Operations_List.json" + } + ], + "inputs": { + "ServiceNamespace": { + "description": "Please provide ARM Resource Provider Name in Pascal case:", + "type": "text", + "initialValue": "Microsoft.Contoso" + } + } + } +} diff --git a/eng/feeds/data-plane/client.tsp b/eng/feeds/data-plane/client.tsp new file mode 100644 index 0000000000..164fc28c83 --- /dev/null +++ b/eng/feeds/data-plane/client.tsp @@ -0,0 +1,5 @@ +/** + * PLACEHOLDER + * Add readme and sample + */ +import "./main.tsp"; diff --git a/eng/feeds/data-plane/examples/2022-11-01-preview/Widgets_CreateOrUpdateWidgetSample.json b/eng/feeds/data-plane/examples/2022-11-01-preview/Widgets_CreateOrUpdateWidgetSample.json new file mode 100644 index 0000000000..9adc3398bc --- /dev/null +++ b/eng/feeds/data-plane/examples/2022-11-01-preview/Widgets_CreateOrUpdateWidgetSample.json @@ -0,0 +1,37 @@ +{ + "title": "Widgets_CreateOrUpdateWidget", + "operationId": "Widgets_CreateOrUpdateWidget", + "parameters": { + "widgetName": "name1", + "api-version": "2022-11-01-preview", + "body": { + "manufacturerId": "manufacturer id1", + "sharedModel": { + "tag": "tag1", + "createdDate": "2023-01-09T02:12:25.689Z" + } + } + }, + "responses": { + "200": { + "body": { + "name": "name1", + "manufacturerId": "manufacturer id1", + "sharedModel": { + "tag": "tag1", + "createdDate": "2023-01-09T02:12:25.689Z" + } + } + }, + "201": { + "body": { + "name": "name1", + "manufacturerId": "manufacturer id1", + "sharedModel": { + "tag": "tag1", + "createdDate": "2023-01-09T02:12:25.689Z" + } + } + } + } +} diff --git a/eng/feeds/data-plane/examples/2022-11-01-preview/Widgets_DeleteWidgetSample.json b/eng/feeds/data-plane/examples/2022-11-01-preview/Widgets_DeleteWidgetSample.json new file mode 100644 index 0000000000..8a6b117b5c --- /dev/null +++ b/eng/feeds/data-plane/examples/2022-11-01-preview/Widgets_DeleteWidgetSample.json @@ -0,0 +1,29 @@ +{ + "operationId": "Widgets_DeleteWidget", + "title": "Delete widget by widget name using long-running operation.", + "parameters": { + "api-version": "2022-11-01-preview", + "widgetName": "searchbox" + }, + "responses": { + "202": { + "headers": { + "location": "https://contosowidgetmanager.azure.com/operations/00000000-0000-0000-0000-000000000123/result?api-version=2022-11-01-preview", + "operation-location": "https://contosowidgetmanager.azure.com/operations/00000000-0000-0000-0000-000000000123?api-version=2022-11-01-preview" + }, + "body": { + "id": "id1", + "status": "deleted" + } + }, + "default": { + "body": { + "error": { + "code": "Error code", + "message": "Error message", + "details": [] + } + } + } + } +} diff --git a/eng/feeds/data-plane/examples/2022-11-01-preview/Widgets_GetWidgetOperationStatusSample.json b/eng/feeds/data-plane/examples/2022-11-01-preview/Widgets_GetWidgetOperationStatusSample.json new file mode 100644 index 0000000000..c88b6155b0 --- /dev/null +++ b/eng/feeds/data-plane/examples/2022-11-01-preview/Widgets_GetWidgetOperationStatusSample.json @@ -0,0 +1,45 @@ +{ + "title": "Widgets_GetWidgetOperationStatus", + "operationId": "Widgets_GetWidgetOperationStatus", + "parameters": { + "widgetName": "name1", + "operationId": "opreation id1", + "api-version": "2022-11-01-preview" + }, + "responses": { + "200": { + "body": { + "id": "opreation id1", + "status": "InProgress", + "error": { + "code": "Error code", + "message": "Error message", + "target": "op1", + "details": [ + { + "code": "code1", + "message": "message1", + "target": "op1", + "details": [], + "innererror": { + "code": "code1" + } + } + ], + "innererror": { + "code": "code1" + } + }, + "result": { + "name": "bingsearch", + "manufacturerId": "manufacturer Id1", + "sharedModel": { + "tag": "tag1", + "createdDate": "2023-01-09T02:12:25.689Z" + } + }, + "widgetName": "rfazvwnfwwomiwrh" + } + } + } +} diff --git a/eng/feeds/data-plane/examples/2022-11-01-preview/Widgets_GetWidgetSample.json b/eng/feeds/data-plane/examples/2022-11-01-preview/Widgets_GetWidgetSample.json new file mode 100644 index 0000000000..9c07ed9743 --- /dev/null +++ b/eng/feeds/data-plane/examples/2022-11-01-preview/Widgets_GetWidgetSample.json @@ -0,0 +1,25 @@ +{ + "operationId": "Widgets_GetWidget", + "title": "Get widget by widget name.", + "parameters": { + "api-version": "2022-11-01-preview", + "widgetName": "searchbox" + }, + "responses": { + "200": { + "body": { + "name": "bingsearch", + "manufacturerId": "a-22-01" + } + }, + "default": { + "body": { + "error": { + "code": "Error code", + "message": "Error message", + "details": [] + } + } + } + } +} diff --git a/eng/feeds/data-plane/examples/2022-11-01-preview/Widgets_ListWidgetsSample.json b/eng/feeds/data-plane/examples/2022-11-01-preview/Widgets_ListWidgetsSample.json new file mode 100644 index 0000000000..60cfc8902f --- /dev/null +++ b/eng/feeds/data-plane/examples/2022-11-01-preview/Widgets_ListWidgetsSample.json @@ -0,0 +1,27 @@ +{ + "title": "Widgets_ListWidgets", + "operationId": "Widgets_ListWidgets", + "parameters": { + "top": 8, + "skip": 15, + "maxpagesize": 27, + "api-version": "2022-11-01-preview" + }, + "responses": { + "200": { + "body": { + "value": [ + { + "name": "bingsearch", + "manufacturerId": "manufacturer Id1", + "sharedModel": { + "tag": "tag1", + "createdDate": "2023-01-09T02:12:25.689Z" + } + } + ], + "nextLink": "https://microsoft.com/a" + } + } + } +} diff --git a/eng/feeds/data-plane/main.tsp b/eng/feeds/data-plane/main.tsp new file mode 100644 index 0000000000..881c01681f --- /dev/null +++ b/eng/feeds/data-plane/main.tsp @@ -0,0 +1,67 @@ +import "@typespec/rest"; +import "@typespec/versioning"; +import "@azure-tools/typespec-azure-core"; + +using TypeSpec.Http; +using TypeSpec.Rest; +using TypeSpec.Versioning; +using Azure.Core; + +@service({ + title: "{{parameters.ServiceNamespace}} service", +}) +@versioned({{parameters.ServiceNamespace}}.Versions) +namespace {{parameters.ServiceNamespace}}; + +enum Versions { + @useDependency(Azure.Core.Versions.v1_0_Preview_1) + `2022-11-01-preview`, +} + +@doc("A widget.") +@resource("widgets") +model Widget { + @key("widgetName") + @doc("The widget name.") + @visibility("read") + name: string; + + @doc("The ID of the manufacturer.") + manufacturerId: string; + + @doc("The faked shared model.") + sharedModel?: FakedSharedModel; +} + +@doc("Faked shared model") +model FakedSharedModel { + @doc("The tag.") + tag: string; + + @doc("The created date.") + createdDate: utcDateTime; +} + +interface Widgets { + @doc("Fetch a Widget by name.") + getWidget is ResourceRead; + + @doc("Gets status of a Widget operation.") + getWidgetOperationStatus is GetResourceOperationStatus; + + @doc("Creates or updates a Widget asynchronously.") + @pollingOperation(Widgets.getWidgetOperationStatus) + createOrUpdateWidget is LongRunningResourceCreateOrUpdate; + + @doc("Delete a Widget asynchronously.") + @pollingOperation(Widgets.getWidgetOperationStatus) + deleteWidget is LongRunningResourceDelete; + + @doc("List Widget resources") + listWidgets is ResourceList< + Widget, + { + parameters: StandardListQueryParameters; + } + >; +} diff --git a/eng/feeds/data-plane/tspconfig.yaml b/eng/feeds/data-plane/tspconfig.yaml new file mode 100644 index 0000000000..564807c66f --- /dev/null +++ b/eng/feeds/data-plane/tspconfig.yaml @@ -0,0 +1,33 @@ +parameters: + "service-dir": + default: "sdk/{{#toLowerCase}}{{folderName}}{{/toLowerCase}}" + "dependencies": + "additionalDirectories": [] + default: "" +emit: + - "@azure-tools/typespec-autorest" +options: + "@azure-tools/typespec-autorest": + azure-resource-provider-folder: "data-plane" + emitter-output-dir: "{project-root}/.." + examples-directory: "examples" + output-file: "{azure-resource-provider-folder}/{service-name}/{version-status}/{version}/openapi.json" + "@azure-tools/typespec-python": + package-dir: "{{#normalizePackageName}}{{parameters.ServiceNamespace}}{{/normalizePackageName}}" + package-name: "{package-dir}" + package-mode: dataplane + "@azure-tools/typespec-csharp": + package-dir: "{{parameters.ServiceNamespace}}" + namespace: "{package-dir}" + clear-output-folder: true + model-namespace: false + "@azure-tools/typespec-ts": + package-dir: "{{#normalizePackageName}}{{parameters.ServiceNamespace}}{{/normalizePackageName}}-rest" + generateMetadata: true + generateTest: true + packageDetails: + name: "@azure-rest/{{#normalizePackageName}}{{parameters.ServiceNamespace}}{{/normalizePackageName}}-rest" + description: "{{parameters.ServiceNamespace}} Service" + "@azure-tools/typespec-java": + package-dir: "{{#normalizePackageName}}{{parameters.ServiceNamespace}}{{/normalizePackageName}}" + namespace: com.{{#toLowerCase}}{{parameters.ServiceNamespace}}{{/toLowerCase}} diff --git a/eng/feeds/scratch/.gitignore b/eng/feeds/scratch/.gitignore new file mode 100644 index 0000000000..ae140cafe7 --- /dev/null +++ b/eng/feeds/scratch/.gitignore @@ -0,0 +1,3 @@ +# This directory reserved for creating scratch *.tsp for testing/experimentation +**/* +!.gitignore diff --git a/eng/pipelines/ci.yml b/eng/pipelines/ci.yml new file mode 100644 index 0000000000..7e7499fe6e --- /dev/null +++ b/eng/pipelines/ci.yml @@ -0,0 +1,95 @@ +# Continuous Integration + +trigger: + branches: + include: + - main + - release/* + paths: + exclude: + - docs/release-notes/*.md + - packages/website/versioned_docs/version-latest/release-notes/*.md + +pr: none + +variables: + - template: templates/variables/globals.yml + +jobs: + - job: npm_stable + timeoutInMinutes: 90 + displayName: Npm publish + pool: + name: azsdk-pool-mms-win-2022-general + vmImage: windows-2022 + + variables: + TYPESPEC_SKIP_DOCUSAURUS_BUILD: true # Disable docusaurus build + + steps: + - checkout: self + submodules: true + + - template: ./templates/install.yml + parameters: + nodeVersion: "20.x" + - template: ./templates/build.yml + + - script: node common/scripts/install-run-rush.js test-official --parallelism max --verbose + displayName: Test + + - template: ./templates/upload-coverage.yml + + - script: | + set NPM_AUTH_TOKEN=$(azure-sdk-npm-token) + node common/scripts/install-run-rush.js publish --publish --include-all --version-policy typespec-azure --set-access-level public + displayName: Release + + - task: AzureCLI@1 + displayName: "Publish bundled packages to package storage" + inputs: + azureSubscription: "Azure SDK Engineering System" + scriptLocation: inlineScript + inlineScript: node ./eng/scripts/upload-bundler-packages.js + + - task: AzureCLI@1 + displayName: "Publish Azure playground" + inputs: + azureSubscription: "Azure SDK Engineering System" + scriptLocation: inlineScript + inlineScript: | + az storage blob upload-batch ^ + --destination $web ^ + --account-name "cadlplayground" ^ + --destination-path cadl-azure/ ^ + --source "./packages/typespec-azure-playground-website/dist/" ^ + --overwrite + + - job: npm_preview + timeoutInMinutes: 90 + dependsOn: npm_stable + displayName: Npm publish dev version + condition: eq(variables['Build.SourceBranch'], 'refs/heads/main') # Only publish -dev on main branch. + pool: + name: azsdk-pool-mms-win-2022-general + vmImage: windows-2022 + + variables: + TYPESPEC_SKIP_DOCUSAURUS_BUILD: true # Disable docusaurus build + + steps: + - checkout: self + submodules: true + + - template: ./templates/install.yml + parameters: + nodeVersion: "20.x" + - template: ./templates/build.yml + + - script: node ./core/packages/internal-build-utils/cmd/cli.js bump-version-preview . ./core + displayName: Bump version to prerelease targets + + - script: | + set NPM_AUTH_TOKEN=$(azure-sdk-npm-token) + node common/scripts/install-run-rush.js publish --publish --include-all --version-policy typespec-azure --set-access-level public --tag next + displayName: Release diff --git a/eng/pipelines/e2e-job.yml b/eng/pipelines/e2e-job.yml new file mode 100644 index 0000000000..e33a80ef9c --- /dev/null +++ b/eng/pipelines/e2e-job.yml @@ -0,0 +1,22 @@ +jobs: + - job: e2e + pool: + name: azsdk-pool-mms-ubuntu-2004-general + vmImage: ubuntu-20.04 + + variables: + TYPESPEC_VS_CI_BUILD: true # Enable official Visual Studio extension build + TYPESPEC_SKIP_DOCUSAURUS_BUILD: true # Disable docusaurus build + + steps: + - checkout: self + submodules: true + + - template: ./templates/install.yml + + - template: ./templates/build.yml + parameters: + nodeVersion: "20.x" + + - script: node packages/e2e-tests/e2e-tests.mjs + displayName: Run E2E tests diff --git a/eng/pipelines/jobs/build-and-test.yml b/eng/pipelines/jobs/build-and-test.yml new file mode 100644 index 0000000000..c56f554631 --- /dev/null +++ b/eng/pipelines/jobs/build-and-test.yml @@ -0,0 +1,80 @@ +parameters: + - name: nodeVersion + type: string + - name: dotnetVersion + type: string + - name: poolName + type: string + +steps: + - checkout: self + submodules: true + + - template: ../templates/install.yml + parameters: + nodeVersion: ${{ parameters.nodeVersion }} + + # Only running UI test on linux + - ${{ if ne(variables['Agent.OS'], 'Windows_NT') }}: + - template: ../templates/install-browsers.yml + + - template: ../templates/build.yml + + - script: node common/scripts/install-run-rush.js test-official --parallelism max --verbose + displayName: Test + + - template: ../templates/upload-coverage.yml + + - script: node common/scripts/install-run-rush.js check-format + displayName: Check Formatting + condition: ne(variables['Agent.OS'], 'Windows_NT') + + - script: node common/scripts/install-run-rush.js lint --parallelism max --verbose + displayName: Lint + condition: ne(variables['Agent.OS'], 'Windows_NT') + + - script: node eng/scripts/download-common-types.js v3 + displayName: Swagger - Fetch common-types v3 + condition: ne(variables['Agent.OS'], 'Windows_NT') + + - script: node eng/scripts/check-for-changed-files.js + displayName: Check Git Status For Changed Files + + - script: node common/scripts/install-run-rush.js cspell + displayName: Spell check + condition: ne(variables['Agent.OS'], 'Windows_NT') + + # Unlink node_modules folders to significantly improve performance of subsequent tasks + # which need to walk the directory tree (and are hardcoded to follow symlinks). + - script: node common/scripts/install-run-rush.js purge + displayName: "Purge dependencies" + condition: always() + + # It's important for performance to pass "packages" as "searchFolder" to avoid looking under root "node_modules". + # PublishTestResults.searchFolder only supports absolute paths, not relative. + - task: PublishTestResults@2 + inputs: + testResultsFormat: "JUnit" + searchFolder: "$(System.DefaultWorkingDirectory)/core/packages" + testResultsFiles: "*/test-results.xml" + mergeTestResults: true + failTaskOnFailedTests: true + testRunTitle: "[CORE] Test os: ${{ parameters.poolName }}, node: ${{ parameters.nodeVersion }}" + displayName: Publish core test results + condition: always() + + - task: PublishTestResults@2 + inputs: + testResultsFormat: "JUnit" + searchFolder: "$(System.DefaultWorkingDirectory)/packages" + testResultsFiles: "*/test-results.xml" + mergeTestResults: true + failTaskOnFailedTests: true + testRunTitle: "[NON-CORE] Test os: ${{ parameters.poolName }}, node: ${{ parameters.nodeVersion }}" + displayName: Publish non-core test results + condition: always() + + - publish: ./core/packages/playground-website/test-results + artifact: "uitestresults-${{ parameters.poolName }}-node-${{ parameters.nodeVersion }}" + displayName: Publish UI tests artifacts + condition: ne(variables['Agent.OS'], 'Windows_NT') diff --git a/eng/pipelines/jobs/publish-artifacts.yml b/eng/pipelines/jobs/publish-artifacts.yml new file mode 100644 index 0000000000..46070a1837 --- /dev/null +++ b/eng/pipelines/jobs/publish-artifacts.yml @@ -0,0 +1,34 @@ +jobs: + - job: publish_artifacts + displayName: Publish Artifacts + + variables: + TYPESPEC_VS_CI_BUILD: true # Enable official Visual Studio extension build + TYPESPEC_SKIP_DOCUSAURUS_BUILD: true # Disable docusaurus build + + pool: + name: azsdk-pool-mms-ubuntu-2004-general + vmImage: ubuntu-20.04 + + steps: + - checkout: self + submodules: true + + - template: ../templates/install.yml + parameters: + nodeVersion: "20.x" + - template: ../templates/build.yml + + - script: node ./core/packages/internal-build-utils/cmd/cli.js bump-version-pr . --pr $(System.PullRequest.PullRequestNumber) --buildNumber $(Build.BuildNumber) + displayName: Bump version to prerelease targets + + - script: npm run gen-manifest + displayName: Regen manifest for compiler + workingDirectory: ./core/packages/compiler + + - script: node common/scripts/install-run-rush.js publish --publish --pack --include-all + displayName: Pack packages + + - publish: $(Build.SourcesDirectory)/common/temp/artifacts/packages + artifact: packages + displayName: Publish packages(.tgz) as pipeline artifacts diff --git a/eng/pipelines/jobs/pull-request-consistency.yml b/eng/pipelines/jobs/pull-request-consistency.yml new file mode 100644 index 0000000000..58567dd8ba --- /dev/null +++ b/eng/pipelines/jobs/pull-request-consistency.yml @@ -0,0 +1,16 @@ +steps: + - checkout: self + submodules: true + + - template: ../templates/install.yml + + - script: node eng/scripts/validate-core-submodule.js + displayName: Check that core submodule is merged to core repo + + - script: node common/scripts/install-run-rush.js change -v --target-branch "origin/$SYSTEM_PULLREQUEST_TARGETBRANCHNAME" + condition: and(succeeded(), not(or(startsWith(variables['System.PullRequest.SourceBranch'], 'publish/'), startsWith(variables['System.PullRequest.SourceBranch'], 'backmerge/')))) + displayName: Check that changelog has been provided + + - script: node common/scripts/install-run-rush.js publish --apply && node eng/scripts/check-for-changed-files.js publish + condition: and(succeeded(), eq(startsWith(variables['System.PullRequest.SourceBranch'], 'publish/'), true), eq(startsWith(variables['System.PullRequest.SourceBranch'], 'publish/dpg/'), false)) + displayName: Check that publish PR isn't missing changes diff --git a/eng/pipelines/nuget-release.yml b/eng/pipelines/nuget-release.yml new file mode 100644 index 0000000000..0c1abe4c0a --- /dev/null +++ b/eng/pipelines/nuget-release.yml @@ -0,0 +1,90 @@ +# ASP.NET Core +# Build and test ASP.NET Core projects targeting .NET Core. +# Add steps that run tests, create a NuGet package, deploy, and more: +# https://docs.microsoft.com/azure/devops/pipelines/languages/dotnet-core + +resources: + repositories: + - repository: azure-sdk-build-tools + type: git + name: internal/azure-sdk-build-tools + ref: refs/tags/azure-sdk-build-tools_20230613.1 + +trigger: + - main + - release/* + +pr: none + +variables: + - template: templates/variables/globals.yml + - name: Artifacts + value: $(System.DefaultWorkingDirectory)/_artifacts/packages + - name: TYPESPEC_VS_CI_BUILD + value: true # Enable official Visual Studio extension build + - name: TYPESPEC_SKIP_DOCUSAURUS_BUILD + value: true # Disable docusaurus build + +stages: + - stage: "Build" + jobs: + - job: Build + pool: + name: azsdk-pool-mms-ubuntu-2004-general + vmImage: ubuntu-20.04 + steps: + - checkout: self + submodules: true + + - template: ./templates/install.yml + + - script: node common/scripts/install-run-rush.js rebuild --parallelism max --verbose + displayName: Build + + - publish: $(Build.ArtifactStagingDirectory) + displayName: "Publish Artifacts" + artifact: packages + condition: succeededOrFailed() + + # Sign packages + - stage: Sign + jobs: + - job: Sign + pool: + name: azsdk-pool-mms-win-2022-general + vmImage: MMS2022 + steps: + - checkout: azure-sdk-build-tools + + # Download artifacts + - task: DownloadPipelineArtifact@2 + displayName: Download Packages + inputs: + artifact: packages + path: $(Artifacts) + + # Sign packages + - template: pipelines/steps/net-signing.yml@azure-sdk-build-tools + parameters: + PackagesPath: $(Artifacts) + BuildToolsPath: $(Build.SourcesDirectory) + + # Republish artifacts + - publish: $(Artifacts) + displayName: "Publish processed files" + artifact: processed-files + condition: always() + + # Release Nuget packages to nuget.org + - stage: Publish + jobs: + - job: + steps: + - task: DownloadPipelineArtifact@2 + displayName: Download Packages + inputs: + artifact: processed-files + path: $(Artifacts) + + - script: dotnet nuget push "$(Artifacts)/*.nupkg" --api-key "$(azure-sdk-nuget-pat)" --source https://api.nuget.org/v3/index.json --skip-duplicate --no-symbols + displayName: Push to NuGet.org diff --git a/eng/pipelines/pr-tryit.yml b/eng/pipelines/pr-tryit.yml new file mode 100644 index 0000000000..5b043d085b --- /dev/null +++ b/eng/pipelines/pr-tryit.yml @@ -0,0 +1,54 @@ +trigger: none +pr: + - main + +variables: + - template: templates/variables/globals.yml + +jobs: + - job: publish_playground + displayName: Publish playground & website + variables: + TYPESPEC_WEBSITE_BASE_PATH: "cadl-azure/prs/$(System.PullRequest.PullRequestNumber)/" + pool: + name: azsdk-pool-mms-ubuntu-2004-general + vmImage: ubuntu-20.04 + + steps: + - checkout: self + submodules: true + persistCredentials: true + + - template: ./templates/install.yml + + - script: node common/scripts/install-run-rush.js rebuild --parallelism max --verbose + displayName: Build + + - task: AzureCLI@1 + displayName: "Publish playground to PR endpoint" + inputs: + azureSubscription: "Azure SDK Engineering System" + scriptLocation: inlineScript + inlineScript: | + az storage blob upload-batch \ + --destination \$web \ + --account-name "cadlplayground" \ + --destination-path $(TYPESPEC_WEBSITE_BASE_PATH) \ + --source "./packages/typespec-azure-playground-website/dist/" \ + --overwrite + + - task: AzureCLI@1 + displayName: "Publish website to PR endpoint" + inputs: + azureSubscription: "Azure SDK Engineering System" + scriptLocation: inlineScript + inlineScript: | + az storage blob upload-batch \ + --destination \$web \ + --account-name "tspwebsitepr" \ + --destination-path $(TYPESPEC_WEBSITE_BASE_PATH) \ + --source "./packages/website/build/" \ + --overwrite + + - script: node core/eng/scripts/create-tryit-comment.js "cadl-azure" + displayName: Check already commented diff --git a/eng/pipelines/pr.yml b/eng/pipelines/pr.yml new file mode 100644 index 0000000000..f0ea8edbed --- /dev/null +++ b/eng/pipelines/pr.yml @@ -0,0 +1,67 @@ +trigger: none +pr: + - main + - release/* + +variables: + - template: templates/variables/globals.yml + +jobs: + - job: Build_And_Test + variables: + TYPESPEC_VS_CI_BUILD: true # Enable official Visual Studio extension build + TYPESPEC_SKIP_DOCUSAURUS_BUILD: true # Disable docusaurus build + + strategy: + matrix: + # Node 18 + "Linux - Node 18.x - Dotnet 6": + pool: azsdk-pool-mms-ubuntu-2004-general + imageName: ubuntu-20.04 + nodeVersion: "18.x" + dotnetVersion: 6.0.x + + "Windows - Node 18.x - Dotnet 6": + pool: azsdk-pool-mms-win-2022-general + imageName: windows-2022 + nodeVersion: "18.x" + dotnetVersion: 6.0.x + + # Node 20 + "Linux - Node 20.x": + pool: azsdk-pool-mms-ubuntu-2004-general + imageName: ubuntu-20.04 + nodeVersion: "20.x" + dotnetVersion: 6.0.x + + "Windows - Node 20.x": + pool: azsdk-pool-mms-win-2022-general + imageName: windows-2022 + nodeVersion: "20.x" + dotnetVersion: 6.0.x + + pool: + name: $(pool) + vmImage: $(imageName) + + steps: + - template: ./jobs/build-and-test.yml + parameters: + nodeVersion: $(nodeVersion) + dotnetVersion: $(dotnetVersion) + poolName: $(pool) + + - template: ./templates/swagger-checks.yml + parameters: + nodeVersion: $(nodeVersion) + + - job: Consistency_Check + pool: + name: azsdk-pool-mms-ubuntu-2004-general + vmImage: ubuntu-20.04 + + steps: + - template: ./jobs/pull-request-consistency.yml + + - template: e2e-job.yml + - template: jobs/publish-artifacts.yml diff --git a/eng/pipelines/templates/build.yml b/eng/pipelines/templates/build.yml new file mode 100644 index 0000000000..b4b632ec03 --- /dev/null +++ b/eng/pipelines/templates/build.yml @@ -0,0 +1,5 @@ +# Template building all packages with parallelism. + +steps: + - script: node common/scripts/install-run-rush.js rebuild --parallelism max --verbose + displayName: Build diff --git a/eng/pipelines/templates/install-browsers.yml b/eng/pipelines/templates/install-browsers.yml new file mode 100644 index 0000000000..939660fad8 --- /dev/null +++ b/eng/pipelines/templates/install-browsers.yml @@ -0,0 +1,5 @@ +# Template installing browsers +steps: + - script: npx playwright install --with-deps + displayName: Install playwright browsers + workingDirectory: packages/typespec-azure-playground-website diff --git a/eng/pipelines/templates/install.yml b/eng/pipelines/templates/install.yml new file mode 100644 index 0000000000..e709581be9 --- /dev/null +++ b/eng/pipelines/templates/install.yml @@ -0,0 +1,31 @@ +# Template installing all dependencies. +parameters: + - name: nodeVersion + type: string + default: 20.x + +steps: + - task: UseDotNet@2 + inputs: + version: 6.0.x + + - task: NodeTool@0 + inputs: + versionSpec: ${{ parameters.nodeVersion }} + displayName: Install Node.js + retryCountOnTaskFailure: 3 + + - script: | + echo "Node:" + node -v + echo "Npm:" + npm -v + displayName: "Log tool versions used" + + # purge before install to ensure a clean state between retries + - script: node common/scripts/install-run-rush.js install --purge + displayName: Install JavaScript Dependencies + retryCountOnTaskFailure: 3 + + - script: dotnet restore core/packages/typespec-vs + displayName: Restore .NET Dependencies diff --git a/eng/pipelines/templates/swagger-checks.yml b/eng/pipelines/templates/swagger-checks.yml new file mode 100644 index 0000000000..5a96d6d3f5 --- /dev/null +++ b/eng/pipelines/templates/swagger-checks.yml @@ -0,0 +1,23 @@ +parameters: + - name: nodeVersion + type: string + +steps: + - bash: | + NodeVer=$(node -v) + echo "##vso[task.setvariable variable=nodeBase]${NodeVer}" + displayName: Swagger - Set execution variable + - script: | + npm install -g autorest && cd eng/scripts && npm install + echo "nodeBase:" $NODEBASE + displayName: Swagger - Install Dependencies + condition: and(succeeded(), contains(variables.nodeBase, 'v18'), ne(variables['Agent.OS'], 'Windows_NT')) + - script: node eng/scripts/lint-resourcemanager.js "packages/samples/test/output/azure/resource-manager" + displayName: Swagger - Resource Manager Linting + condition: and(succeeded(), contains(variables.nodeBase, 'v18'), ne(variables['Agent.OS'], 'Windows_NT')) + - script: node eng/scripts/gen-sdk.js python "packages/samples/test/output/azure/resource-manager" + displayName: Swagger - Generate Python SDK + condition: and(succeeded(), contains(variables.nodeBase, 'v18'), ne(variables['Agent.OS'], 'Windows_NT')) + - script: node eng/scripts/gen-sdk.js javascript "packages/samples/test/output/azure/resource-manager" + displayName: Swagger - Generate JavaScript SDK + condition: and(succeeded(), contains(variables.nodeBase, 'v18'), ne(variables['Agent.OS'], 'Windows_NT')) diff --git a/eng/pipelines/templates/upload-coverage.yml b/eng/pipelines/templates/upload-coverage.yml new file mode 100644 index 0000000000..2826531140 --- /dev/null +++ b/eng/pipelines/templates/upload-coverage.yml @@ -0,0 +1,9 @@ +steps: + - script: node common/scripts/install-run-rush.js merge-coverage + displayName: Merge code coverage + + - task: PublishCodeCoverageResults@1 + inputs: + codeCoverageTool: "Cobertura" + summaryFileLocation: $(Build.SourcesDirectory)/coverage/cobertura-coverage.xml + displayName: Publish code coverage diff --git a/eng/pipelines/templates/variables/globals.yml b/eng/pipelines/templates/variables/globals.yml new file mode 100644 index 0000000000..71f402531c --- /dev/null +++ b/eng/pipelines/templates/variables/globals.yml @@ -0,0 +1,3 @@ +variables: + # Disable CodeQL by default to prevent build timeouts + Codeql.SkipTaskAutoInjection: true diff --git a/eng/scripts/check-for-changed-files.js b/eng/scripts/check-for-changed-files.js new file mode 100644 index 0000000000..d9f7ced0f2 --- /dev/null +++ b/eng/scripts/check-for-changed-files.js @@ -0,0 +1,22 @@ +import { checkForChangedFiles, coreRepoRoot, repoRoot, run } from "./helpers.js"; + +if ( + checkForChangedFiles(coreRepoRoot, "## typespec ##") || + checkForChangedFiles(repoRoot, "## typespec-azure ##") +) { + if (process.argv[2] !== "publish") { + console.error( + `ERROR: Files above were changed during PR validation, but not included in the PR. +Include any automated changes such as sample output, spec.html, and ThirdPartyNotices.txt in your PR.` + ); + } else { + console.error( + `ERROR: Changes have been made since this publish PR was prepared. +In the future, remember to alert coworkers to avoid merging additional changes while publish PRs are in progress. +Close this PR, run prepare-publish again.` + ); + } + run("git", ["diff"], { cwd: coreRepoRoot }); + run("git", ["diff"], { cwd: repoRoot }); + process.exit(1); +} diff --git a/eng/scripts/check-format.js b/eng/scripts/check-format.js new file mode 100644 index 0000000000..eba21ce2e4 --- /dev/null +++ b/eng/scripts/check-format.js @@ -0,0 +1,16 @@ +// @ts-check +import { runDotnetFormat } from "../../core/packages/internal-build-utils/dist/src/index.js"; +import { CommandFailedError, runPrettier } from "./helpers.js"; + +try { + runPrettier("--list-different"); + runDotnetFormat("--verify-no-changes"); +} catch (err) { + if (err instanceof CommandFailedError) { + console.error( + "\nERROR: Files above are not formatted correctly. Run `rush format` and commit the changes." + ); + process.exit(err.proc?.status ?? 1); + } + throw err; +} diff --git a/eng/scripts/compare_swagger.py b/eng/scripts/compare_swagger.py new file mode 100644 index 0000000000..7da111f8e5 --- /dev/null +++ b/eng/scripts/compare_swagger.py @@ -0,0 +1,33 @@ +import yaml +import json +import sys + +class SwaggerCompare: + + def __init__(self): + self._models = [] + + args = sys.argv[1:] + if len(args) != 2: + print("usage: swagger_compare.py FILE1 FILE2") + sys.exit(1) + + file1 = args[0] + file2 = args[1] + + with open(file1, "r") as infile: + self._file1 = json.loads(infile.read()) + + with open(file2, "r") as infile: + self._file2 = json.loads(infile.read()) + + def save(self): + with open("file1.yml", "w") as outfile: + yaml.dump(self._file1, outfile) + + with open("file2.yml", "w") as outfile: + yaml.dump(self._file2, outfile) + + +model = SwaggerCompare() +model.save() diff --git a/eng/scripts/cspell.js b/eng/scripts/cspell.js new file mode 100644 index 0000000000..16bbe2525e --- /dev/null +++ b/eng/scripts/cspell.js @@ -0,0 +1,22 @@ +// @ts-check +import { resolve } from "path"; +import { run, xplatCmd } from "../../core/packages/internal-build-utils/dist/src/index.js"; +import { repoRoot } from "./helpers.js"; +export const cspell = xplatCmd( + resolve(repoRoot, "core/packages/internal-build-utils/node_modules/.bin/cspell") +); + +await run( + cspell, + [ + "--no-progress", + "**/*.md", + "**/*.ts", + "**/*.js", + "**/changelog.json", + "common/changes/**/*.json", + ], + { + cwd: repoRoot, + } +); diff --git a/eng/scripts/dogfood.js b/eng/scripts/dogfood.js new file mode 100644 index 0000000000..adf89f539e --- /dev/null +++ b/eng/scripts/dogfood.js @@ -0,0 +1,4 @@ +import { npmForEach, run } from "./helpers.js"; +run("rush", ["update"]); +run("rush", ["build"]); +npmForEach("dogfood"); diff --git a/eng/scripts/download-common-types.js b/eng/scripts/download-common-types.js new file mode 100644 index 0000000000..294ff5000e --- /dev/null +++ b/eng/scripts/download-common-types.js @@ -0,0 +1,27 @@ +// @ts-check +import { createWriteStream, existsSync, mkdirSync } from "fs"; +import { get } from "https"; +import { dirname } from "path"; + +const version = process.argv[2]; +const remoteSwaggerPath = `https://raw.githubusercontent.com/Azure/azure-rest-api-specs/main/specification/common-types/resource-management/${version}/types.json`; +const localSwaggerPath = `packages/samples/specs/resource-manager/common-types/${version}/types.json`; +console.log("Downloading common types:", { + version, + remoteSwaggerPath, + localSwaggerPath, +}); + +const dir = dirname(localSwaggerPath); +if (!existsSync(dir)) { + mkdirSync(dir, { recursive: true }); +} + +const file = createWriteStream(localSwaggerPath); +get(remoteSwaggerPath, (res) => { + if (res.statusCode === 200) { + res.pipe(file); + } else { + throw new Error(res.statusMessage ?? ""); + } +}); diff --git a/eng/scripts/format.js b/eng/scripts/format.js new file mode 100644 index 0000000000..5cd8ca616c --- /dev/null +++ b/eng/scripts/format.js @@ -0,0 +1,5 @@ +// @ts-check +import { runDotnetFormat } from "../../core/packages/internal-build-utils/dist/src/index.js"; +import { runPrettier } from "./helpers.js"; +runPrettier("--write"); +await runDotnetFormat(); diff --git a/eng/scripts/gen-sdk.js b/eng/scripts/gen-sdk.js new file mode 100644 index 0000000000..8270e289a4 --- /dev/null +++ b/eng/scripts/gen-sdk.js @@ -0,0 +1,77 @@ +import { autorest, run, scanSwaggers } from "./helpers.js"; + +const AUTOREST_CORE_VERSION = "3.7.2"; + +function generateSDK(lang, swagger) { + try { + switch (lang) { + case "python": + run(autorest, [ + "--debug", + "--verbose", + `--version=${AUTOREST_CORE_VERSION}`, + "--python", + "--track2", + "--use=@autorest/python@5.16.0", + "--python-sdks-folder=sdk/python", + "--python-mode=update", + "--input-file=" + swagger, + ]); + + break; + case "javascript": + run(autorest, [ + `--version=${AUTOREST_CORE_VERSION}`, + "--typescript", + "--use=@autorest/typescript@6.0.0-rc.1", + "--azure-arm", + "--generate-metadata", + "--output-folder=sdk/javascript", + "--modelerfour.lenient-model-deduplication", + "--head-as-boolean=true", + "--license-header=MICROSOFT_MIT_NO_VERSION", + "--input-file=" + swagger, + ]); + break; + default: + throw new Error("Not supported SDK language: " + lang); + } + return true; + } catch (error) { + console.error(error); + return false; + } +} + +const ignoreSwagger = [ + // BUG https://github.com/Azure/typespec-azure/issues/1750 + "resource-manager/dynatrace/2021-06-13-preview/openapi.json", + "resource-manager/dynatrace/2022-04-30-preview/openapi.json", +]; +async function main() { + const lang = process.argv[2]; // python/javascript + const roots = process.argv[3].split(";"); + const paths = roots + .flatMap((root) => scanSwaggers(root)) + .filter((x) => !ignoreSwagger.some((y) => x.endsWith(y))); + console.log("Scanned following swaggers:", paths); + const errorPaths = []; + for (const p of paths) { + console.log("Generate SDK for", p); + const success = await generateSDK(lang, p); + if (!success) { + errorPaths.push(p); + } + console.log("\n\n\n"); + } + if (errorPaths.length > 0) { + console.error("SDK generation errors for following swagger files:"); + console.error(errorPaths); + process.exit(1); + } +} + +main().catch((error) => { + console.error("Error", error); + process.exit(1); +}); diff --git a/eng/scripts/generate-third-party-notices.js b/eng/scripts/generate-third-party-notices.js new file mode 100644 index 0000000000..cec0936bf7 --- /dev/null +++ b/eng/scripts/generate-third-party-notices.js @@ -0,0 +1,136 @@ +import { readdir, readFile, stat, writeFile } from "fs/promises"; +import { basename, dirname, join, resolve } from "path"; + +const skipDirs = new Set(["node_modules", "dist-dev"]); +main().catch((e) => console.error(e.stack)); + +async function main() { + const root = resolve("./"); + const rootName = basename(root); + const packages = await findThirdPartyPackages(); + const packageRoots = [...packages.keys()].sort((a, b) => + packages.get(a).name.localeCompare(packages.get(b).name) + ); + let text = `${rootName} + +THIRD-PARTY SOFTWARE NOTICES AND INFORMATION +Do Not Translate or Localize + +This project incorporates components from the projects listed below. The +original copyright notices and the licenses under which Microsoft received such +components are set forth below. Microsoft reserves all rights not expressly +granted herein, whether by implication, estoppel or otherwise. +`; + + let i = 1; + for (const packageRoot of packageRoots) { + const pkg = packages.get(packageRoot); + const url = getUrl(pkg); + text += `\n${i++}. ${pkg.name} version ${pkg.version} (${url})`; + } + + for (const packageRoot of packageRoots) { + const pkg = packages.get(packageRoot); + const license = await getLicense(packageRoot); + text += `\n\n +%% ${pkg.name} NOTICES AND INFORMATION BEGIN HERE +===================================================== +${license} +====================================================="); +END OF ${pkg.name} NOTICES AND INFORMATION`; + } + + await writeFile("ThirdPartyNotices.txt", text); +} + +async function findThirdPartyPackages() { + const root = resolve("./"); + const rootName = basename(root); + const packages = new Map(); + + for await (const map of projectSourcemaps(root)) { + const contents = JSON.parse(await readFile(map, "utf-8")); + const sources = contents.sources; + for (const source of sources) { + const sourcePath = join(dirname(map), source); + const packageRoot = await getPackageRoot(sourcePath); + const pkg = JSON.parse(await readFile(join(packageRoot, "package.json"), "utf-8")); + + if (pkg.name === rootName || /microsoft/i.test(JSON.stringify(pkg.author))) { + continue; + } + + if (!packages.has(packageRoot)) { + packages.set(packageRoot, pkg); + } + } + } + + return packages; +} + +async function* projectSourcemaps(rootPath) { + const files = await readdir(rootPath, { withFileTypes: true }); + for (const file of files) { + const filepath = join(rootPath, file.name); + + if (file.isDirectory()) { + if (skipDirs.has(file.name)) { + continue; + } + + yield* projectSourcemaps(filepath); + } else { + if (file.name.endsWith(".js.map")) { + yield filepath; + } + } + } +} + +async function getPackageRoot(filename) { + const dir = dirname(filename); + try { + const pkgPath = join(dir, "package.json"); + await stat(pkgPath); + return dir; + } catch (e) { + if (e.code === "ENOENT") { + return getPackageRoot(dir); + } + throw e; + } +} + +function getUrl(pkg) { + let url = pkg.repository; + if (typeof url !== "string") { + url = pkg.repository?.url; + } + if (!url) { + throw new Error(`Cannot find URL for ${pkg}`); + } + url = url.replace(/^git\+/, ""); + url = url.replace(/\.git$/, ""); + url = url.replace(/^git:\/\//, "https://"); + return url; +} + +async function getLicense(packageRoot) { + for (const licenseName of ["LICENSE", "LICENSE.txt", "LICENSE.md", "LICENSE-MIT"]) { + const licensePath = join(packageRoot, licenseName); + try { + let text = (await readFile(licensePath)).toString("utf-8"); + text = text.replace("<", "<"); + text = text.replace(">", ">"); + return text; + } catch (err) { + if (err.code === "ENOENT") { + continue; + } + throw err; + } + } + + throw new Error(`Cannot get license for ${packageRoot}, license file not found.`); +} diff --git a/eng/scripts/helpers.js b/eng/scripts/helpers.js new file mode 100644 index 0000000000..968e930fef --- /dev/null +++ b/eng/scripts/helpers.js @@ -0,0 +1,279 @@ +import { spawn, spawnSync } from "child_process"; +import { lstatSync, readFileSync, readdirSync, statSync } from "fs"; +import { dirname, join, resolve } from "path"; +import { fileURLToPath } from "url"; + +function read(filename) { + const txt = readFileSync(filename, "utf-8") + .replace(/\r/gm, "") + .replace(/\n/gm, "«") + .replace(/\/\*.*?\*\//gm, "") + .replace(/«/gm, "\n") + .replace(/\s+\/\/.*/g, ""); + return JSON.parse(txt); +} + +export const repoRoot = resolve(dirname(fileURLToPath(import.meta.url)), "../.."); +export const coreRepoRoot = resolve(repoRoot, "core"); +export const prettier = resolve(repoRoot, "core/packages/compiler/node_modules/.bin/prettier"); +export const tsc = resolve(repoRoot, "core/packages/compiler/node_modules/.bin/tsc"); +export const autorest = resolve(repoRoot, "eng/scripts/node_modules/.bin/autorest"); + +const minimumDotnetVersion = { + major: 5, + minor: 0, +}; + +const rush = read(`${repoRoot}/rush.json`); + +export function forEachProject(onEach, filter) { + // load all the projects + for (const each of rush.projects) { + const packageName = each.packageName; + if (filter !== undefined && !filter.includes(packageName)) continue; + const projectFolder = resolve(`${repoRoot}/${each.projectFolder}`); + const project = JSON.parse(readFileSync(`${projectFolder}/package.json`, "utf-8")); + onEach(packageName, projectFolder, project, each); + } +} + +export function npmForEachDependency(cmd, projectDir, options) { + const project = JSON.parse(readFileSync(`${projectDir}/package.json`, "utf-8")); + const deps = [ + Object.keys(project.dependencies || {}), + Object.keys(project.devDependencies || {}), + Object.keys(project.peerDependencies || {}), + ].flat(); + + forEachProject((name, location, project) => { + if (project.scripts[cmd] || cmd === "pack") { + const args = cmd === "pack" ? [cmd] : ["run", cmd]; + run("npm", args, { cwd: location, ...options }); + } + }, deps); +} + +export function getProjectVersion(projectName) { + const projectFolder = resolve( + `${repoRoot}/${rush.projects.find((each) => each.packageName === projectName).projectFolder}` + ); + const packageJson = JSON.parse(readFileSync(`${projectFolder}/package.json`, "utf-8")); + return packageJson.version; +} + +export function npmForEach(cmd, options) { + forEachProject((name, location, project) => { + if (cmd === "test-official" && !project.scripts[cmd] && project.scripts["test"]) { + const pj = join(location, "package.json"); + throw new Error(`${pj} has a 'test' script, but no 'test-official' script for CI.`); + } + + if (project.scripts[cmd] || cmd === "pack") { + const args = cmd === "pack" ? [cmd] : ["run", cmd]; + run("npm", args, { cwd: location, ...options }); + } + }); +} + +// We could use { shell: true } to let Windows find .cmd, but that causes other issues. +// It breaks ENOENT checking for command-not-found and also handles command/args with spaces +// poorly. +const isCmdOnWindows = [ + "rush", + "npm", + "code", + "code-insiders", + "docusaurus", + tsc, + prettier, + autorest, +]; + +export class CommandFailedError extends Error { + constructor(msg, proc) { + super(msg); + this.proc = proc; + } +} + +export function run(command, args, options) { + if (!options?.silent) { + console.log(); + console.log(`> ${command} ${args.join(" ")}`); + } + + options = { + stdio: "inherit", + sync: true, + throwOnNonZeroExit: true, + ...options, + }; + + if (process.platform === "win32" && isCmdOnWindows.includes(command)) { + command += ".cmd"; + } + + const proc = (options.sync ? spawnSync : spawn)(command, args, options); + if (proc.error) { + if (options.ignoreCommandNotFound && proc.error.code === "ENOENT") { + console.log(`Skipped: Command \`${command}\` not found.`); + } else { + throw proc.error; + } + } else if (options.throwOnNonZeroExit && proc.status !== undefined && proc.status !== 0) { + throw new CommandFailedError( + `Command \`${command} ${args.join(" ")}\` failed with exit code ${proc.status}`, + proc + ); + } + + return proc; +} + +export function runPrettier(...args) { + run( + prettier, + [ + ...args, + "--config", + ".prettierrc.json", + "--ignore-path", + ".prettierignore", + "**/*.{ts,js,tsx,jsx,cjs,mjs,css,json,yml,yaml,tsp,cadl,md}", + ], + { + cwd: repoRoot, + } + ); +} + +export function clearScreen() { + process.stdout.write("\x1bc"); +} + +export function runWatch(watch, dir, build, options) { + let lastBuildTime; + dir = resolve(dir); + + // We need to wait for directory to be created before watching it. This deals + // with races between watchers where one watcher must create a directory + // before another can watch it. + // + // For example, we can't watch for tmlanguage.js changes if the source watcher + // hasn't even created the directory in which tmlanguage.js will be written. + try { + statSync(dir); + } catch (err) { + if (err.code === "ENOENT") { + waitForDirectoryCreation(); + return; + } + throw err; + } + + // Directory already exists: we can start watching right away. + start(); + + function waitForDirectoryCreation() { + let dirCreated = false; + let parentDir = dirname(dir); + logWithTime(`Waiting for ${dir} to be created.`); + + watch.createMonitor(parentDir, "created", (monitor) => { + monitor.on("created", (file) => { + if (!dirCreated && file === dir) { + dirCreated = true; // defend against duplicate events. + monitor.stop(); + start(); + } + }); + }); + } + + function start() { + // build once up-front + runBuild(); + + // then build again on any change + watch.createMonitor(dir, { interval: 0.2, ...options }, (monitor) => { + monitor.on("created", (file) => runBuild(`${file} created`)); + monitor.on("removed", (file) => runBuild(`${file} removed`)); + monitor.on("changed", (file) => runBuild(`${file} changed`, monitor.files[file]?.mtime)); + }); + } + + function runBuild(changeDescription, changeTime) { + runBuildAsync(changeDescription, changeTime).catch((err) => { + console.error(err.stack); + process.exit(1); + }); + } + + async function runBuildAsync(changeDescription, changeTime) { + if (changeTime && lastBuildTime && changeTime < lastBuildTime) { + // Don't rebuild if a change happened before the last build kicked off. + // Defends against duplicate events and building more than once when a + // bunch of files are changed at the same time. + return; + } + + lastBuildTime = new Date(); + if (changeDescription) { + clearScreen(); + logWithTime(`File change detected: ${changeDescription}. Running build.`); + } else { + logWithTime("Starting build in watch mode."); + } + + try { + await build(); + logWithTime("Build succeeded. Waiting for file changes."); + } catch (err) { + console.error(err.stack); + logWithTime(`Build failed. Waiting for file changes.`); + } + } +} + +export function logWithTime(msg) { + const time = new Date().toLocaleTimeString(); + console.log(`[${time}] ${msg}`); +} + +export function scanSwaggers(root) { + const files = []; + for (const file of readdirSync(root)) { + const fullPath = root + "/" + file; + if (lstatSync(fullPath).isDirectory()) { + scanSwaggers(fullPath).forEach((x) => files.push(x)); + } + if (file === "openapi.json") { + files.push(fullPath); + } + } + return files; +} + +export function checkForChangedFiles(cwd, comment = undefined, options = {}) { + if (comment && !options.silent) { + console.log(); + console.log(comment); + } + + const proc = run("git", ["status", "--porcelain"], { + encoding: "utf-8", + stdio: [null, "pipe", "pipe"], + cwd, + ...options, + }); + + if (proc.stdout && !options.silent) { + console.log(proc.stdout); + } + + if (proc.stderr && !options.silent) { + console.error(proc.stderr); + } + + return proc.stdout || proc.stderr; +} diff --git a/eng/scripts/lint-resourcemanager.js b/eng/scripts/lint-resourcemanager.js new file mode 100644 index 0000000000..e09e64b6ae --- /dev/null +++ b/eng/scripts/lint-resourcemanager.js @@ -0,0 +1,135 @@ +import { exec } from "child_process"; +import * as yaml from "js-yaml"; +import { scanSwaggers } from "./helpers.js"; +class LintErrorParser { + results; + AutoRestErrors = [ + '{\n "Channel": "warning"', + '{\n "Channel": "error"', + '{\n "Channel": "fatal"', + "Process() cancelled due to exception", + ]; + constructor(output) { + this.results = this.cleanUp(output); + } + + cleanUp(s) { + let resultString = s.replace(/}\nProcessing batch task - {\"package-(.*).\n{/g, "},{"); + resultString = resultString.replace(/{"package-(.*)} .\n/, ""); + resultString = resultString.replace(/\nProcessing batch task(.*)./g, ""); + return s; + } + + getLintResult() { + const regexLintResult = /\{\n "type": "[\s\S]*?\n\}/gi; + let results = []; + let matches; + while ((matches = regexLintResult.exec(this.results))) { + const oneMessage = yaml.load(matches[0]); + if (oneMessage) { + results.push(oneMessage); + } else { + console.log("The linter output message has invalid format:", matches[0]); + } + } + return JSON.stringify(results); + } + + isAutorestFailed() { + return this.AutoRestErrors.some((error) => this.results.indexOf(error) !== -1); + } + + getAutoRestError() { + if (this.isAutorestFailed()) { + const regexLintResult = /\{\n "type": "[\s\S]*?\n\}/gi; + return this.results.replace(regexLintResult, ""); + } + return ""; + } +} + +const suppressedErrors = [ + { + id: "D5001", + code: "XmsExamplesRequired", + }, +]; + +async function lintInternal(swagger) { + const cmd = [ + "npx", + "autorest", + "--validation", + "--azure-validator", + "--message-format=json", + "--openapi-type=arm", + "--use=@microsoft.azure/classic-openapi-validator@latest", + "--use=@microsoft.azure/openapi-validator@latest", + "--openapi-subtype=providerHub", + "--input-file=" + swagger, + ].join(" "); + const { err, stdout, stderr } = await new Promise((res) => + exec(cmd, { encoding: "utf-8", maxBuffer: 1024 * 1024 * 64 }, (err, stdout, stderr) => + res({ err, stdout, stderr }) + ) + ); + let resultString = stderr + stdout; + if (resultString.indexOf("{") !== -1) { + resultString = resultString.replace(/Processing batch task - {.*} \.\n/g, ""); + } + const parser = new LintErrorParser(resultString); + return parser; +} + +function filterSuppressed(results) { + const isSuppressed = (x) => suppressedErrors.some((y) => x.id === y.id && x.code === y.code); + return results.filter((x) => !isSuppressed(x)); +} + +async function lintSwagger(swagger) { + const r = await lintInternal(swagger); + let success = true; + if (r.isAutorestFailed()) { + console.log("autorest errors:"); + console.log(r.getAutoRestError()); + success = false; + } else { + const lintResults = JSON.parse(r.getLintResult()); + const res = filterSuppressed(lintResults); + const errors = res.filter((x) => x.type === "Error"); + const warnings = res.filter((x) => x.type === "Warning"); + if (errors.length > 0) { + console.error(errors.length, " errors detected as below:"); + console.log(errors); + success = false; + } + console.log("\n\n"); + if (warnings.length > 0) { + console.warn(warnings.length, " warnings detected as below:"); + console.warn(warnings); + } + } + return success; +} + +async function main() { + const roots = process.argv[2].split(";"); + const paths = roots.flatMap((root) => scanSwaggers(root)); + console.log("Scanned following swaggers:", paths); + const errorPaths = []; + for (const p of paths) { + console.log("Run LintProviderHub for", p); + const success = await lintSwagger(p); + if (!success) { + errorPaths.push(p); + } + console.log("\n\n\n"); + } + if (errorPaths.length > 0) { + console.error("Please fix errors for following files:"); + console.error(errorPaths); + process.exit(1); + } +} + +main(); diff --git a/eng/scripts/new_service_adoption.py b/eng/scripts/new_service_adoption.py new file mode 100755 index 0000000000..31fcd45303 --- /dev/null +++ b/eng/scripts/new_service_adoption.py @@ -0,0 +1,178 @@ +#!/usr/bin/env python3 + +""" +Count the number of PRs in a 1 month period for services that do not have a GA +version and do not have a TypeSpec. +""" + +import glob +import os +import re +import requests + +token = os.environ.get('GITHUB_TOKEN') +auth_header = {'Authorization': 'Bearer ' + token} if token else None + +total = 0 +closed = 0 +new_version = 0 +new_service = 0 +typespec = [] +non_typespec = [] + +def get_pr_files(pr) -> list[dict]: + r = requests.get(pr['pull_request']['url'] + '/files', headers = auth_header) + if r.status_code != 200: + print(f'Error: {r.status_code} {r.text}') + exit(1) + files = r.json() + while 'next' in r.links: + r = requests.get(r.links['next']['url'], headers = auth_header) + if r.status_code != 200: + print(f'Error: {r.status_code} {r.text}') + exit(1) + files.extend(r.json()) + return files + + +private_rps = [ + 'testbase', # Has stable versions in private repo but not public + ] + +def non_public(namespace) -> bool: + rp = namespace.split('/')[0] + if rp in private_rps: + return True + return False + +# Return true if PR is for a service that does not have a GA version +def pr_for_new_service(pr, files: list[dict]): + # To find the namespace, look for files matching the pattern + # 'specification/[a-z-]+/(data-plane|resource-manager)/*' + # and exclude files with 'common' in the path + # Make sure there are at least 4 path segments + pattern = r'specification/[a-z-]+/(data-plane|resource-manager)/.*/.*' + filenames = [x['filename'] for x in files] + xfiles = [x for x in filenames if re.match(pattern, x) and 'common' not in x] + # The namespace is the combined 3 path segments after "specification" + namespaces = list({'/'.join(x.split('/')[1:4]) for x in xfiles}) + for namespace in namespaces: + if non_public(namespace): + continue + stable = glob.glob(f'azure-rest-api-specs/specification/{namespace}/**/stable', recursive=True) + if not stable: + return namespace + return False + + +def pr_has_typespec(pr, files: list[dict]) -> bool: + if any({label['name'] in ['TypeSpec','Cadl'] for label in pr['labels']}): + return True + filenames = [x['filename'] for x in files] + if any({filename == 'tspconfig.yaml' for filename in filenames}): + return True + if any({filename == 'cadl-project.yaml' for filename in filenames}): + return True + if any({filename.endswith('.tsp') for filename in filenames}): + return True + if any({filename.endswith('.cadl') for filename in filenames}): + return True + return False + + +def getVersion(path) -> str | None: + """ + Returns the version segment in a file path or None. + """ + parts = path.split('/') + # Get the index of the "stable" or "preview" part of the path + if "preview" in parts: + indx = parts.index("preview") + elif "stable" in parts: + indx = parts.index("stable") + else: + return None + if indx < len(parts) - 1: + return parts[indx+1] + return None + + +def newAPIVersion(pr, files) -> bool: + versionInfo = dict() + + if any({label['name'] == 'new-api-version' for label in pr['labels']}): + return True + for e in files: + version = getVersion(e['filename']) + if version is not None: + if version not in versionInfo: + versionInfo[version] = True + if e['status'] != "added": + versionInfo[version] = False + + for key in versionInfo: + if versionInfo[key] is True: + return True + return False + + +# Find PRs that do not have TypeSpec and are for "greenfield" RPs (no GA version) +def analyze_prs(prs): + global total, closed, new_service, new_version, typespec, non_typespec + # Count PRs with the Cadl or TypeSpec label and add that to typespec + for pr in prs: + total += 1 + if pr['state'] == 'closed' and not pr['pull_request']['merged_at']: + closed += 1 + continue + files = get_pr_files(pr) + labels = {label['name'] for label in pr['labels']} & {'data-plane', 'resource-manager', 'RPaaS'} + if newAPIVersion(pr, files) is False: + continue + new_version += 1 + # if pr is for a service that already has a GA version, skip it + if namespace := pr_for_new_service(pr, files): + new_service += 1 + if pr_has_typespec(pr, files): + typespec.append((namespace, labels, pr['pull_request']['html_url'])) + else: + # Get only the data-plane, resource-manager, and RPaaS labels from the PR + non_typespec.append((namespace, labels, pr['pull_request']['html_url'])) + +date_range = '2023-07-01..2023-07-31' + +#query = "repo:azure/azure-rest-api-specs-pr+is:pr+base:RPSaaSMaster+label:new-api-version+created:2023-08-01..2023-08-31" +query = f"repo:azure/azure-rest-api-specs+is:pr+base:main+created:{date_range}" +url = f'https://api.github.com/search/issues?q={query}' + +# Pull in the latest version of the Azure API docs (NO shallow clone) +os.system('rm -rf azure-rest-api-specs') +os.system('git clone https://github.com/Azure/azure-rest-api-specs.git') + +r = requests.get(url, headers = auth_header) +if r.status_code != 200: + print(f'Error: {r.status_code} {r.text}') + exit(1) +analyze_prs(r.json()['items']) +while 'next' in r.links: + r = requests.get(r.links['next']['url'], headers = auth_header) + if r.status_code != 200: + print(f'Error: {r.status_code} {r.text}') + exit(1) + analyze_prs(r.json()['items']) + +print(f'Date range: {date_range}') +print(f'Total PRs: {total}') +print(f'Closed PRs: {closed}') +print(f'PRs for new API versions: {new_version}') +print(f'PRs for new services: {new_service}') +print(f'PRs for new services with TypeSpec: {len(typespec)}') +print(f'PRs for new services without TypeSpec: {len(non_typespec)}') +print('\nTypeSpec PRs:') +# sort by namespace +for item in sorted(typespec, key=lambda x: x[0]): + print(f'{item[0]}: {item[1]}: {item[2]}') +print('\nNon-TypeSpec PRs:') +# sort by namespace +for item in sorted(non_typespec, key=lambda x: x[0]): + print(f'{item[0]}: {item[1]}: {item[2]}') diff --git a/eng/scripts/npm-run-for-deps.js b/eng/scripts/npm-run-for-deps.js new file mode 100644 index 0000000000..4cf8596f9c --- /dev/null +++ b/eng/scripts/npm-run-for-deps.js @@ -0,0 +1,5 @@ +// @ts-check +// Runs the npm run command on each project that has it. +import { npmForEachDependency } from "./helpers.js"; + +npmForEachDependency(process.argv[2], process.cwd()); diff --git a/eng/scripts/npm-run.js b/eng/scripts/npm-run.js new file mode 100644 index 0000000000..46b63cc778 --- /dev/null +++ b/eng/scripts/npm-run.js @@ -0,0 +1,4 @@ +// Runs the npm run command on each project that has it. +import { npmForEach } from "./helpers.js"; + +npmForEach(process.argv[2]); diff --git a/eng/scripts/package.json b/eng/scripts/package.json new file mode 100644 index 0000000000..5f22b85801 --- /dev/null +++ b/eng/scripts/package.json @@ -0,0 +1,7 @@ +{ + "type": "module", + "dependencies": { + "autorest": "^3.4.2", + "js-yaml": "^4.1.0" + } +} diff --git a/eng/scripts/prepare-publish.js b/eng/scripts/prepare-publish.js new file mode 100644 index 0000000000..2a0b7f1e5a --- /dev/null +++ b/eng/scripts/prepare-publish.js @@ -0,0 +1,286 @@ +// @ts-check +import { mkdirSync, writeFileSync } from "fs"; +import { join } from "path"; +import { + CommandFailedError, + checkForChangedFiles, + coreRepoRoot, + forEachProject, + repoRoot, + run, +} from "./helpers.js"; + +const NoChange = 0; +const Patch = 1; +const Minor = 2; +const Major = 3; + +/** + * Set this to false to test this script without creating a new branch, checking for changes etc. + * DO NOT LEAVE TO FALSE + */ +const production = true; +let branch; +if (production) { + // Create and checkout branches + branch = `publish/${Date.now().toString(36)}`; + doubleRun("git", "checkout", "-b", branch); +} + +// Check that we have a clean slate before starting +if (production) { + checkPrePublishState(); +} + +// Update the typespec core submodule +typespecRun("git", "fetch", "https://github.com/microsoft/typespec", "main"); +if (production) { + typespecRun("git", "merge", "--ff-only", "FETCH_HEAD"); +} +// Stage the typespec core publish +typespecRun("rush", "version", "--bump"); +typespecRun("rush", "update-latest-docs"); +typespecRunWithRetries(3, "rush", "update"); +if (production) { + typespecRun("git", "add", "-A"); +} +if (checkForChangedFiles(coreRepoRoot, undefined, { silent: true })) { + if (production) { + typespecRun("git", "commit", "-m", "Prepare typespec publish"); + } +} else { + console.log("INFO: No changes to typespec."); +} + +if (production && checkForChangedFiles(repoRoot, undefined, { silent: true })) { + typespecAzureRun("git", "commit", "-a", "-m", "Update core submodule"); +} + +// Determine project versions including any bumps from typespec publish above +const versions = getProjectVersions(); + +// Bump typespec-azure -> typespec dependencies. +bumpCrossSubmoduleDependencies(); + +// Stage typespec-azure publish +typespecAzureRun("rush", "version", "--bump"); +typespecAzureRun("rush", "update-latest-docs"); +if (production) { + typespecAzureRun("git", "add", "-A"); +} +if (checkForChangedFiles(repoRoot, undefined, { silent: true })) { + if (production) { + typespecAzureRun("git", "commit", "-m", "Prepare typespec-azure publish"); + } +} else { + console.log("INFO: No changes to typespec-azure."); +} + +rebuildAndRegenSamplesToBumpTemplateVersions(); + +// And we're done +console.log(); +if (production) { + console.log(`Success! Push ${branch} branches and send PRs.`); +} else { + console.log(`Success! All the files have been updated.`); + console.log("**DEVELOPMENT** The production flag is set to false"); +} + +function checkPrePublishState() { + if (checkForChangedFiles()) { + console.error("ERROR: Cannot prepare publish because files above were modified."); + process.exit(1); + } + + try { + if (production) { + doubleRun("rush", "change", "--verify"); + } + } catch (e) { + if (e instanceof CommandFailedError) { + console.error("ERROR: Cannot prepare publish because changelogs are missing."); + process.exit(1); + } + throw e; + } +} + +function doubleRun(command, ...args) { + typespecRun(command, ...args); + typespecAzureRun(command, ...args); +} + +function typespecRun(command, ...args) { + console.log(); + console.log("## typespec ##"); + run(command, args, { cwd: coreRepoRoot }); +} + +function typespecAzureRun(command, ...args) { + console.log(); + console.log("## typespec-azure ##"); + run(command, args, { cwd: repoRoot }); +} + +function typespecRunWithRetries(tries, command, ...args) { + try { + console.log(); + console.log("## typespec ##"); + console.log(`remaining tries: ${tries}`); + run(command, args, { cwd: coreRepoRoot }); + } catch (err) { + if (tries-- > 0) { + typespecRunWithRetries(tries, command, ...args); + } else throw err; + } +} + +function typespecAzureRunWithRetries(tries, command, ...args) { + try { + console.log(); + console.log("## typespec-azure ##"); + console.log(`remaining tries: ${tries}`); + run(command, args, { cwd: repoRoot }); + } catch (err) { + if (tries-- > 0) { + typespecAzureRunWithRetries(tries, command, ...args); + } else throw err; + } +} + +function getProjectVersions() { + const map = new Map(); + forEachProject((packageName, _, project) => { + map.set(packageName, project.version); + }); + return map; +} + +function bumpCrossSubmoduleDependencies() { + let changed = false; + + forEachProject((_, projectFolder, project, rushProject) => { + if (projectFolder.startsWith(coreRepoRoot)) { + return; + } + + const change = bumpDependencies(project); + if (change == NoChange) { + return; + } + + writeFileSync( + join(projectFolder, "package.json"), + JSON.stringify(project, undefined, 2) + "\n" + ); + + if (rushProject.shouldPublish === false) { + return; + } + + const changelog = { + changes: [ + { + comment: "Update dependencies.", + type: change === Major ? "major" : change === Minor ? "minor" : "patch", + packageName: project.name, + }, + ], + packageName: project.name, + email: "microsoftopensource@users.noreply.github.com", + }; + + const changelogDir = join(repoRoot, "common/changes", project.name); + mkdirSync(changelogDir, { recursive: true }); + + if (production) { + writeFileSync( + join(changelogDir, branch.replace("/", "-") + ".json"), + JSON.stringify(changelog, undefined, 2) + "\n" + ); + } + + changed = true; + }); + + if (changed && production) { + typespecAzureRun("git", "add", "-A"); + typespecAzureRun("git", "commit", "-m", "Bump cross-submodule dependencies"); + } +} + +async function rebuildAndRegenSamplesToBumpTemplateVersions() { + typespecAzureRunWithRetries(3, "rush", "update"); + typespecAzureRun("rush", "rebuild"); + typespecAzureRun("rush", "regen-samples"); + if (checkForChangedFiles(repoRoot, undefined, { silent: true }) && production) { + typespecAzureRun("git", "add", "-A"); + typespecAzureRun("git", "commit", "-m", "Rebuild and regen samples to bump template versions"); + } +} + +function bumpDependencies(project) { + const dependencyGroups = [ + [project.dependencies, true], + [project.peerDependencies, true], + [project.devDependencies, true], + ]; + let change = NoChange; + for (const [dependencies, includeWorkspace] of dependencyGroups.filter( + ([x]) => x !== undefined + )) { + for (const [dependency, oldVersion] of Object.entries(dependencies)) { + const newVersion = versions.get(dependency); + if (newVersion && `~${newVersion}` !== oldVersion) { + if (includeWorkspace) { + dependencies[dependency] = `workspace:~${newVersion}`; + } else { + dependencies[dependency] = `~${newVersion}`; + } + change = Math.max(change, getChangeType(oldVersion, newVersion)); + } + } + } + return change; +} + +function getChangeType(oldVersion, newVersion) { + if (oldVersion.includes("*") || newVersion.includes("*")) { + return Patch; + } + const oldParts = getVersionParts(oldVersion); + const newParts = getVersionParts(newVersion); + + if (newParts.major > oldParts.major) { + return Major; + } + if (newParts.major < oldParts.major) { + throw new Error("version downgrade"); + } + if (newParts.minor > oldParts.minor) { + return Minor; + } + if (newParts.minor < oldParts.minor) { + throw new Error("version downgrade"); + } + if (newParts.patch > oldParts.patch) { + return Patch; + } + if (newParts.patch < oldParts.patch) { + throw new Error("version downgrade"); + } + return NoChange; +} + +function getVersionParts(version) { + const parts = version.match(/(\d+)\.(\d+)\.(\d+)/); + if (!parts) { + throw new Error(`Invalid version: ${version}`); + } + return { + major: Number(parts[1]), + minor: Number(parts[2]), + patch: Number(parts[3]), + }; +} diff --git a/eng/scripts/upload-bundler-packages.js b/eng/scripts/upload-bundler-packages.js new file mode 100644 index 0000000000..ce37d7cc1b --- /dev/null +++ b/eng/scripts/upload-bundler-packages.js @@ -0,0 +1,26 @@ +// @ts-check +import { + bundleAndUploadPackages, + getPackageVersion, +} from "../../core/packages/bundle-uploader/dist/src/index.js"; +import { repoRoot } from "./helpers.js"; + +await bundleAndUploadPackages({ + repoRoot: repoRoot, + indexName: "azure", + indexVersion: await getPackageVersion(repoRoot, "@azure-tools/typespec-azure-core"), + packages: [ + "@typespec/compiler", + "@typespec/http", + "@typespec/rest", + "@typespec/openapi", + "@typespec/versioning", + "@typespec/openapi3", + "@typespec/json-schema", + "@typespec/protobuf", + "@azure-tools/typespec-autorest", + "@azure-tools/typespec-azure-core", + "@azure-tools/typespec-client-generator-core", + "@azure-tools/typespec-azure-resource-manager", + ], +}); diff --git a/eng/scripts/validate-core-submodule.js b/eng/scripts/validate-core-submodule.js new file mode 100644 index 0000000000..e9b5807ee2 --- /dev/null +++ b/eng/scripts/validate-core-submodule.js @@ -0,0 +1,16 @@ +import { coreRepoRoot, run } from "./helpers.js"; + +const cwd = coreRepoRoot; +run("git", ["fetch", "https://github.com/microsoft/typespec", "main"], { cwd }); + +const proc = run("git", ["merge-base", "--is-ancestor", "HEAD", "FETCH_HEAD"], { + cwd, + throwOnNonZeroExit: false, +}); + +if (proc.status !== 0) { + console.error( + "ERROR: Core submodule does not point to a commit merged to https://github.com/microsoft/typespec main." + ); + process.exit(1); +} diff --git a/eng/scripts/watch.js b/eng/scripts/watch.js new file mode 100644 index 0000000000..9405bbcbb5 --- /dev/null +++ b/eng/scripts/watch.js @@ -0,0 +1,2 @@ +import { repoRoot, run, tsc } from "./helpers.js"; +run(tsc, ["--build", "--watch"], { cwd: repoRoot, sync: false }); diff --git a/packages/Directory.Build.props b/packages/Directory.Build.props new file mode 100644 index 0000000000..56ce7e7a4b --- /dev/null +++ b/packages/Directory.Build.props @@ -0,0 +1,8 @@ + + + + + **\node_modules\**;$(DefaultItemExcludesInProjectFolder) + + + diff --git a/packages/e2e-tests/cadl-ranch-specs/package.json b/packages/e2e-tests/cadl-ranch-specs/package.json new file mode 100644 index 0000000000..c8d808ecf6 --- /dev/null +++ b/packages/e2e-tests/cadl-ranch-specs/package.json @@ -0,0 +1,8 @@ +{ + "name": "@azure-tools/typespec-e2e-cadl-ranch-specs", + "dependencies": { + "@azure-tools/cadl-ranch-specs": "0.28.0" + }, + "type": "module", + "private": true +} diff --git a/packages/e2e-tests/e2e-tests.mjs b/packages/e2e-tests/e2e-tests.mjs new file mode 100644 index 0000000000..a6e125a7ac --- /dev/null +++ b/packages/e2e-tests/e2e-tests.mjs @@ -0,0 +1,193 @@ +// @ts-check +import { execSync } from "child_process"; +import dotenv from "dotenv"; +import { cpSync, mkdirSync, readFileSync, readdirSync, rmSync, statSync, writeFileSync } from "fs"; +import path, { dirname, join, resolve } from "path"; +import { fileURLToPath, pathToFileURL } from "url"; +import { parseArgs } from "util"; +import { repoRoot, run } from "../../eng/scripts/helpers.js"; + +const e2eTestDir = join(repoRoot, "packages/e2e-tests"); +const npmCmd = process.platform === "win32" ? "npm.cmd" : "npm"; + +loadDotenv(); + +function main() { + printInfo(); + const args = parseArgs({ + args: process.argv.slice(2), + options: { + "local-cadl-ranch": { + type: "string", + }, + }, + }); + args.values["local-cadl-ranch"] = args.values["local-cadl-ranch"] ?? process.env.LOCAL_CADL_RANCH; + const packages = getPackagesPath(); + + console.log("Check cli is working"); + runTypeSpec(["--help"], { cwd: e2eTestDir }); + console.log("Cli is working"); + + testCadlRanch(packages, args); +} +main(); + +function printInfo() { + console.log("-".repeat(100)); + console.log("Npm Version: "); + run("npm", ["-v"]); + console.log("-".repeat(100)); +} + +function getPackagesPath() { + function resolveLocalPackage(path) { + return `file://${repoRoot}/${path}`; + } + + return { + "@typespec/compiler": resolveLocalPackage("core/packages/compiler"), + "@typespec/openapi": resolveLocalPackage("core/packages/openapi"), + "@typespec/http": resolveLocalPackage("core/packages/http"), + "@typespec/rest": resolveLocalPackage("core/packages/rest"), + "@typespec/versioning": resolveLocalPackage("core/packages/versioning"), + "@azure-tools/typespec-azure-core": resolveLocalPackage("packages/typespec-azure-core"), + "@azure-tools/typespec-client-generator-core": resolveLocalPackage( + "packages/typespec-client-generator-core" + ), + }; +} + +function runTypeSpec(args, options) { + const cmd = `node ${repoRoot}/core/packages/compiler/entrypoints/cli.js ${args.join(" ")}`; + try { + const result = execSync(cmd, options).toString(); + console.log(result); + } catch (err) { + console.error(err.output.toString()); + console.error(`Compile failed in directory: ${options.cwd}`); + console.error(`Cadl Ranch Repository: https://github.com/Azure/cadl-ranch`); + process.exit(1); + } +} + +function readPackageJson(dir) { + const content = readFileSync(join(dir, "package.json")).toString(); + return JSON.parse(content); +} + +function updatePackageJson(wsDir, value) { + writeFileSync(join(wsDir, "package.json"), JSON.stringify(value, null, 2)); + console.log("Generated package.json for basic-current"); + + console.log("Installing dependencies"); + run(npmCmd, ["install", "--force", "--no-package-lock"], { cwd: wsDir }); + console.log("Installed dependencies"); +} + +function getCadlRanchDependencies(originalPackageJson, localCadlRanch) { + if (localCadlRanch) { + console.log(`Using local cadl ranch "${localCadlRanch}`); + return { + "@azure-tools/cadl-ranch-specs": pathToFileURL( + resolve(localCadlRanch, "packages/cadl-ranch-specs") + ).href, + "@azure-tools/cadl-ranch-expect": pathToFileURL( + resolve(repoRoot, localCadlRanch, "packages/cadl-ranch-expect") + ).href, + }; + } else { + const version = originalPackageJson.dependencies["@azure-tools/cadl-ranch-specs"]; + console.log(`Using configured cadl ranch version "${version}`); + return { + "@azure-tools/cadl-ranch-specs": version, + }; + } +} + +function testCadlRanch(packages, args) { + const localCadlRanch = args.values["local-cadl-ranch"]; + if (!localCadlRanch) { + console.log("Running e2e tests in CI mode."); + } else { + console.log(`Running e2e tests with local cadl-ranch at: ${localCadlRanch}`); + } + const testDir = join(e2eTestDir, "cadl-ranch-specs"); + const wsDir = join(testDir, "temp"); + + rmSync(wsDir, { recursive: true, force: true }); + mkdirSync(wsDir); + + const outputDir = join(wsDir, "tsp-output"); + console.log("Clearing basic-current"); + rmSync(outputDir, { recursive: true, force: true }); + console.log("Cleared basic-current"); + + console.log("Generating package.json for basic-current"); + const originalPackageJson = readPackageJson(testDir); + const cadlRanchSpecsVersion = originalPackageJson.dependencies["@azure-tools/cadl-ranch-specs"]; + console.log(`Version of cadl ranch specs used: ${cadlRanchSpecsVersion}`); + + const packageJson = { + ...originalPackageJson, + dependencies: { + "@typespec/compiler": packages["@typespec/compiler"], + "@typespec/http": packages["@typespec/http"], + "@typespec/rest": packages["@typespec/rest"], + "@typespec/openapi": packages["@typespec/openapi"], + "@typespec/openapi3": packages["@typespec/openapi3"], + "@typespec/versioning": packages["@typespec/versioning"], + "@azure-tools/typespec-azure-core": packages["@azure-tools/typespec-azure-core"], + "@azure-tools/typespec-client-generator-core": + packages["@azure-tools/typespec-client-generator-core"], + }, + }; + + updatePackageJson(wsDir, packageJson); + // Have to do 2 steps because of bug in npm when installing mixed file:// and regular versions https://github.com/npm/cli/issues/4367 + const updatedPackageJson = { + ...packageJson, + dependencies: { + ...packageJson.dependencies, + ...getCadlRanchDependencies(originalPackageJson, localCadlRanch), + }, + }; + updatePackageJson(wsDir, updatedPackageJson); + + const specsFolder = join(wsDir, "node_modules", "@azure-tools", "cadl-ranch-specs", "http"); + const wsSpecsFolder = join(wsDir, "specs"); + cpSync(specsFolder, wsSpecsFolder, { recursive: true }); + const specs = getMainTspFiles(wsSpecsFolder); + console.log("Found specs: ", specs); + + for (const file of specs) { + console.log(`Running tsp compile . in "${dirname(file)}"`); + runTypeSpec(["compile", ".", "--warn-as-error"], { + cwd: dirname(file), + }); + console.log(" Completed tsp compile ."); + } +} + +function getMainTspFiles(dir) { + const subdirs = readdirSync(dir); + const files = subdirs + .map((subdir) => { + const res = resolve(dir, subdir); + return statSync(res).isDirectory() + ? getMainTspFiles(res) + : subdir === "main.tsp" + ? res + : undefined; + }) + .filter((x) => x !== undefined); + return files.reduce((a, f) => a.concat(f), []); +} + +function loadDotenv() { + const dirname = path.dirname(fileURLToPath(import.meta.url)); + const dotenvPath = path.resolve(dirname, "../../.env"); + dotenv.config({ + path: dotenvPath, + }); +} diff --git a/packages/e2e-tests/package.json b/packages/e2e-tests/package.json new file mode 100644 index 0000000000..3386bace48 --- /dev/null +++ b/packages/e2e-tests/package.json @@ -0,0 +1,32 @@ +{ + "name": "@azure-tools/e2e-tests", + "private": true, + "author": "Microsoft Corporation", + "version": "0.1.0", + "description": "TypeSpec E2E Tests", + "homepage": "https://azure.github.io/typespec-azure", + "readme": "https://github.com/Azure/typespec-azure/blob/main/README.md", + "license": "MIT", + "repository": { + "type": "git", + "url": "git+https://github.com/Azure/typespec-azure.git" + }, + "bugs": { + "url": "https://github.com/Azure/typespec-azure/issues" + }, + "keywords": [ + "typespec" + ], + "type": "module", + "engines": { + "node": ">=18.0.0" + }, + "scripts": { + "build": "" + }, + "devDependencies": { + "@typespec/compiler": "workspace:~0.51.0", + "typescript": "~5.2.2", + "dotenv": "~16.3.1" + } +} diff --git a/packages/microsoft.typespec.providerhub.controller/src/SubscriptionLifecycle/AccountOwner.cs b/packages/microsoft.typespec.providerhub.controller/src/SubscriptionLifecycle/AccountOwner.cs new file mode 100644 index 0000000000..4bf8b444f5 --- /dev/null +++ b/packages/microsoft.typespec.providerhub.controller/src/SubscriptionLifecycle/AccountOwner.cs @@ -0,0 +1,37 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +namespace Microsoft.TypeSpec.ProviderHub.Controller.SubscriptionLifeCycle +{ + using Newtonsoft.Json; + using Newtonsoft.Json.Serialization; + + /// + /// Represents the Account Owner. + /// + public class AccountOwner + { + /// + /// Initializes a new instance of the class. + /// + /// The PUID of the account owner. + /// The email address of the account owner. + public AccountOwner(string puid, string email) + { + Puid = puid; + Email = email; + } + + /// + /// Gets or sets the account owner PUID. + /// + [JsonProperty("puid")] + public string Puid { get; set; } + + /// + /// Gets or sets the account owner email, e.g. user@microsoft.com. + /// + [JsonProperty("email")] + public string Email { get; set; } + } +} diff --git a/packages/microsoft.typespec.providerhub.controller/src/SubscriptionLifecycle/AdditionalProperties.cs b/packages/microsoft.typespec.providerhub.controller/src/SubscriptionLifecycle/AdditionalProperties.cs new file mode 100644 index 0000000000..7220c50349 --- /dev/null +++ b/packages/microsoft.typespec.providerhub.controller/src/SubscriptionLifecycle/AdditionalProperties.cs @@ -0,0 +1,37 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +namespace Microsoft.TypeSpec.ProviderHub.Controller.SubscriptionLifeCycle +{ + using Newtonsoft.Json; + using Newtonsoft.Json.Serialization; + + /// + /// Represents additional properties of the Subscription LifeCycle request. + /// + public class AdditionalProperties + { + /// + /// Initializes a new instance of the class. + /// + /// The resource provider properties. + /// The billing properties. + public AdditionalProperties(string resourceProviderProperties, BillingProperties billingProperties) + { + ResourceProviderProperties = resourceProviderProperties; + BillingProperties = billingProperties; + } + + /// + /// Gets or sets additional resource provider properties. + /// + [JsonProperty("resourceProviderProperties")] + public string ResourceProviderProperties { get; set; } + + /// + /// Gets or sets billing properties. + /// + [JsonProperty("billingProperties")] + public BillingProperties BillingProperties { get; set; } + } +} diff --git a/packages/microsoft.typespec.providerhub.controller/src/SubscriptionLifecycle/AdditionalStateInformation.cs b/packages/microsoft.typespec.providerhub.controller/src/SubscriptionLifecycle/AdditionalStateInformation.cs new file mode 100644 index 0000000000..7f794ab77b --- /dev/null +++ b/packages/microsoft.typespec.providerhub.controller/src/SubscriptionLifecycle/AdditionalStateInformation.cs @@ -0,0 +1,37 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +namespace Microsoft.TypeSpec.ProviderHub.Controller.SubscriptionLifeCycle +{ + using Newtonsoft.Json; + using Newtonsoft.Json.Serialization; + + /// + /// Represents additional state information, including release and block resource status. + /// + public class AdditionalStateInformation + { + /// + /// Initializes a new instance of the class. + /// + /// The release non-data retention resource status. + /// The block new resource creation status. + public AdditionalStateInformation(ResourceStatus releaseNonDataRetentionResource, ResourceStatus blockNewResourceCreation) + { + ReleaseNonDataRetentionResource = releaseNonDataRetentionResource; + BlockNewResourceCreation = blockNewResourceCreation; + } + + /// + /// Gets or sets the release non-data retention resource status. + /// + [JsonProperty("releaseNonDataRetentionResource")] + public ResourceStatus ReleaseNonDataRetentionResource { get; set; } + + /// + /// Gets or sets the block new resource creation status. + /// + [JsonProperty("blockNewResourceCreation")] + public ResourceStatus BlockNewResourceCreation { get; set; } + } +} diff --git a/packages/microsoft.typespec.providerhub.controller/src/SubscriptionLifecycle/AvailabilityZones.cs b/packages/microsoft.typespec.providerhub.controller/src/SubscriptionLifecycle/AvailabilityZones.cs new file mode 100644 index 0000000000..20539dbfa9 --- /dev/null +++ b/packages/microsoft.typespec.providerhub.controller/src/SubscriptionLifecycle/AvailabilityZones.cs @@ -0,0 +1,38 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +namespace Microsoft.TypeSpec.ProviderHub.Controller.SubscriptionLifeCycle +{ + using Newtonsoft.Json; + using Newtonsoft.Json.Serialization; + using System.Collections.Generic; + + /// + /// Represents availability zone information, including location and zone mappings. + /// + public class AvailabilityZones + { + /// + /// Initializes a new instance of the class. + /// + /// The location name. + /// The list of zone mappings. + public AvailabilityZones(string location, List zoneMappings) + { + Location = location; + ZoneMappings = zoneMappings; + } + + /// + /// Gets or sets the availability zone location. + /// + [JsonProperty("location")] + public string Location { get; set; } + + /// + /// Gets or sets the zone mappings. + /// + [JsonProperty("zoneMappings")] + public List ZoneMappings { get; set; } + } +} diff --git a/packages/microsoft.typespec.providerhub.controller/src/SubscriptionLifecycle/BillingAccount.cs b/packages/microsoft.typespec.providerhub.controller/src/SubscriptionLifecycle/BillingAccount.cs new file mode 100644 index 0000000000..ca1d1386a4 --- /dev/null +++ b/packages/microsoft.typespec.providerhub.controller/src/SubscriptionLifecycle/BillingAccount.cs @@ -0,0 +1,29 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +namespace Microsoft.TypeSpec.ProviderHub.Controller.SubscriptionLifeCycle +{ + using Newtonsoft.Json; + using Newtonsoft.Json.Serialization; + + /// + /// Represents billing account information including an ID. + /// + public class BillingAccount + { + /// + /// Initializes a new instance of the class. + /// + /// The ID of the billing account. + public BillingAccount(string id) + { + Id = id; + } + + /// + /// Gets or sets the Billing Account Id. + /// + [JsonProperty("id")] + public string Id { get; set; } + } +} diff --git a/packages/microsoft.typespec.providerhub.controller/src/SubscriptionLifecycle/BillingProperties.cs b/packages/microsoft.typespec.providerhub.controller/src/SubscriptionLifecycle/BillingProperties.cs new file mode 100644 index 0000000000..4cbb33e0c2 --- /dev/null +++ b/packages/microsoft.typespec.providerhub.controller/src/SubscriptionLifecycle/BillingProperties.cs @@ -0,0 +1,85 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +namespace Microsoft.TypeSpec.ProviderHub.Controller.SubscriptionLifeCycle +{ + using Microsoft.TypeSpec.ProviderHub.Controller.SubscriptionLifeCycle.Enums; + using Newtonsoft.Json; + using Newtonsoft.Json.Serialization; + + /// + /// Represents the billing properties on the subscription. + /// + public class BillingProperties + { + /// + /// Initializes a new instance of the class. + /// + /// The channel type. + /// The payment type. + /// The workload type. + /// The billing type. + /// The cost category code. + /// The billing tier. + /// The billing account information. + /// The additional state information. + public BillingProperties(ChannelType channelType, PaymentType paymentType, WorkloadType workloadType, BillingType billingType, CostCategory costCategory, Tier tier, BillingAccount billingAccount, AdditionalStateInformation additionalStateInformation) + { + ChannelType = channelType; + PaymentType = paymentType; + WorkloadType = workloadType; + BillingType = billingType; + CostCategory = costCategory; + Tier = tier; + BillingAccount = billingAccount; + AdditionalStateInformation = additionalStateInformation; + } + + /// + /// Gets or sets the channel type. + /// + [JsonProperty("channelType")] + public ChannelType? ChannelType { get; set; } + + /// + /// Gets or sets the payment type. + /// + [JsonProperty("paymentType")] + public PaymentType? PaymentType { get; set; } + + /// + /// Gets or sets the workload type. + /// + [JsonProperty("workloadType")] + public WorkloadType? WorkloadType { get; set; } + + /// + /// Gets or sets the billing type. + /// + [JsonProperty("billingType")] + public BillingType? BillingType { get; set; } + + /// + /// Gets or sets the cost category. + /// + public CostCategory CostCategory { get; set; } + + /// + /// Gets or sets the tier. + /// + [JsonProperty("tier")] + public Tier? Tier { get; set; } + + /// + /// Gets or sets the billing account information. + /// + [JsonProperty("billingAccount")] + public BillingAccount BillingAccount { get; set; } + + /// + /// Gets or sets additional state information. + /// + [JsonProperty("additionalStateInformation")] + public AdditionalStateInformation AdditionalStateInformation { get; set; } + } +} diff --git a/packages/microsoft.typespec.providerhub.controller/src/SubscriptionLifecycle/Enums/BillingType.cs b/packages/microsoft.typespec.providerhub.controller/src/SubscriptionLifecycle/Enums/BillingType.cs new file mode 100644 index 0000000000..008ce78d0f --- /dev/null +++ b/packages/microsoft.typespec.providerhub.controller/src/SubscriptionLifecycle/Enums/BillingType.cs @@ -0,0 +1,27 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using Newtonsoft.Json; + +namespace Microsoft.TypeSpec.ProviderHub.Controller.SubscriptionLifeCycle.Enums +{ + [JsonConverter(typeof(EnumJsonConverter))] + public readonly partial struct BillingType + { + public static readonly BillingType Legacy = "Legacy", Modern = "Modern"; + + private readonly string _value; + + public BillingType(string value) => + _value = value; + + public override string ToString() => + _value; + + public static implicit operator string(BillingType obj) => + obj.ToString(); + + public static implicit operator BillingType(string str) => + new BillingType(str); + } +} diff --git a/packages/microsoft.typespec.providerhub.controller/src/SubscriptionLifecycle/Enums/ChannelType.cs b/packages/microsoft.typespec.providerhub.controller/src/SubscriptionLifecycle/Enums/ChannelType.cs new file mode 100644 index 0000000000..eb215d679a --- /dev/null +++ b/packages/microsoft.typespec.providerhub.controller/src/SubscriptionLifecycle/Enums/ChannelType.cs @@ -0,0 +1,27 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using Newtonsoft.Json; + +namespace Microsoft.TypeSpec.ProviderHub.Controller.SubscriptionLifeCycle.Enums +{ + [JsonConverter(typeof(EnumJsonConverter))] + public readonly partial struct ChannelType + { + public static readonly ChannelType Internal = "Internal", FieldLed = "FieldLed", CustomerLed = "CustomerLed", PartnerLed = "PartnerLed", None = "None"; + + private readonly string _value; + + public ChannelType(string value) => + _value = value; + + public override string ToString() => + _value; + + public static implicit operator string(ChannelType obj) => + obj.ToString(); + + public static implicit operator ChannelType(string str) => + new ChannelType(str); + } +} diff --git a/packages/microsoft.typespec.providerhub.controller/src/SubscriptionLifecycle/Enums/CostCategory.cs b/packages/microsoft.typespec.providerhub.controller/src/SubscriptionLifecycle/Enums/CostCategory.cs new file mode 100644 index 0000000000..64d10c4592 --- /dev/null +++ b/packages/microsoft.typespec.providerhub.controller/src/SubscriptionLifecycle/Enums/CostCategory.cs @@ -0,0 +1,27 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using Newtonsoft.Json; + +namespace Microsoft.TypeSpec.ProviderHub.Controller.SubscriptionLifeCycle.Enums +{ + [JsonConverter(typeof(EnumJsonConverter))] + public readonly partial struct CostCategory + { + public static readonly CostCategory ResearchAndDevelopment = "FR", GeneralAndAdministrative = "FG", SalesAndMarketing = "FS", CostOfGoodsSold = "FX", BroadReach = "FB", None = "None"; + + private readonly string _value; + + public CostCategory(string value) => + _value = value; + + public override string ToString() => + _value; + + public static implicit operator string(CostCategory obj) => + obj.ToString(); + + public static implicit operator CostCategory(string str) => + new CostCategory(str); + } +} diff --git a/packages/microsoft.typespec.providerhub.controller/src/SubscriptionLifecycle/Enums/PaymentType.cs b/packages/microsoft.typespec.providerhub.controller/src/SubscriptionLifecycle/Enums/PaymentType.cs new file mode 100644 index 0000000000..bf6a20967a --- /dev/null +++ b/packages/microsoft.typespec.providerhub.controller/src/SubscriptionLifecycle/Enums/PaymentType.cs @@ -0,0 +1,27 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using Newtonsoft.Json; + +namespace Microsoft.TypeSpec.ProviderHub.Controller.SubscriptionLifeCycle.Enums +{ + [JsonConverter(typeof(EnumJsonConverter))] + public readonly partial struct PaymentType + { + public static readonly PaymentType Paid = "Paid", Free = "Free", Entitlement = "Entitlement", SponsoredPlus = "SponsoredPlus", Sponsored = "Sponsored", Benefit = "Benefit", None = "None"; + + private readonly string _value; + + public PaymentType(string value) => + _value = value; + + public override string ToString() => + _value; + + public static implicit operator string(PaymentType obj) => + obj.ToString(); + + public static implicit operator PaymentType(string str) => + new PaymentType(str); + } +} diff --git a/packages/microsoft.typespec.providerhub.controller/src/SubscriptionLifecycle/Enums/RegistrationState.cs b/packages/microsoft.typespec.providerhub.controller/src/SubscriptionLifecycle/Enums/RegistrationState.cs new file mode 100644 index 0000000000..757a48798d --- /dev/null +++ b/packages/microsoft.typespec.providerhub.controller/src/SubscriptionLifecycle/Enums/RegistrationState.cs @@ -0,0 +1,27 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using Newtonsoft.Json; + +namespace Microsoft.TypeSpec.ProviderHub.Controller.SubscriptionLifeCycle.Enums +{ + [JsonConverter(typeof(EnumJsonConverter))] + public readonly partial struct RegistrationState + { + public static readonly RegistrationState Registered = "Registered", Unregistered = "Unregistered", Warned = "Warned", Suspended = "Suspended", Deleted = "Deleted"; + + private readonly string _value; + + public RegistrationState(string value) => + _value = value; + + public override string ToString() => + _value; + + public static implicit operator string(RegistrationState obj) => + obj.ToString(); + + public static implicit operator RegistrationState(string str) => + new RegistrationState(str); + } +} diff --git a/packages/microsoft.typespec.providerhub.controller/src/SubscriptionLifecycle/Enums/SpendingLimit.cs b/packages/microsoft.typespec.providerhub.controller/src/SubscriptionLifecycle/Enums/SpendingLimit.cs new file mode 100644 index 0000000000..51406974aa --- /dev/null +++ b/packages/microsoft.typespec.providerhub.controller/src/SubscriptionLifecycle/Enums/SpendingLimit.cs @@ -0,0 +1,27 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using Newtonsoft.Json; + +namespace Microsoft.TypeSpec.ProviderHub.Controller.SubscriptionLifeCycle.Enums +{ + [JsonConverter(typeof(EnumJsonConverter))] + public readonly partial struct SpendingLimit + { + public static readonly SpendingLimit On = "On", Off = "Off", CurrentPeriodOff = "CurrentPeriodOff"; + + private readonly string _value; + + public SpendingLimit(string value) => + _value = value; + + public override string ToString() => + _value; + + public static implicit operator string(SpendingLimit obj) => + obj.ToString(); + + public static implicit operator SpendingLimit(string str) => + new SpendingLimit(str); + } +} diff --git a/packages/microsoft.typespec.providerhub.controller/src/SubscriptionLifecycle/Enums/Tier.cs b/packages/microsoft.typespec.providerhub.controller/src/SubscriptionLifecycle/Enums/Tier.cs new file mode 100644 index 0000000000..4f19b55fc3 --- /dev/null +++ b/packages/microsoft.typespec.providerhub.controller/src/SubscriptionLifecycle/Enums/Tier.cs @@ -0,0 +1,27 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using Newtonsoft.Json; + +namespace Microsoft.TypeSpec.ProviderHub.Controller.SubscriptionLifeCycle.Enums +{ + [JsonConverter(typeof(EnumJsonConverter))] + public readonly partial struct Tier + { + public static readonly Tier Standard = "Standard", Premium = "Premium", Priority = "Priority", Unknown = "Unknown"; + + private readonly string _value; + + public Tier(string value) => + _value = value; + + public override string ToString() => + _value; + + public static implicit operator string(Tier obj) => + obj.ToString(); + + public static implicit operator Tier(string str) => + new Tier(str); + } +} diff --git a/packages/microsoft.typespec.providerhub.controller/src/SubscriptionLifecycle/Enums/WorkloadType.cs b/packages/microsoft.typespec.providerhub.controller/src/SubscriptionLifecycle/Enums/WorkloadType.cs new file mode 100644 index 0000000000..e3256e17aa --- /dev/null +++ b/packages/microsoft.typespec.providerhub.controller/src/SubscriptionLifecycle/Enums/WorkloadType.cs @@ -0,0 +1,27 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using Newtonsoft.Json; + +namespace Microsoft.TypeSpec.ProviderHub.Controller.SubscriptionLifeCycle.Enums +{ + [JsonConverter(typeof(EnumJsonConverter))] + public readonly partial struct WorkloadType + { + public static readonly WorkloadType Production = "Production", DevTest = "DevTest", None = "None"; + + private readonly string _value; + + public WorkloadType(string value) => + _value = value; + + public override string ToString() => + _value; + + public static implicit operator string(WorkloadType obj) => + obj.ToString(); + + public static implicit operator WorkloadType(string str) => + new WorkloadType(str); + } +} diff --git a/packages/microsoft.typespec.providerhub.controller/src/SubscriptionLifecycle/ManagedByTenant.cs b/packages/microsoft.typespec.providerhub.controller/src/SubscriptionLifecycle/ManagedByTenant.cs new file mode 100644 index 0000000000..d48ce76eac --- /dev/null +++ b/packages/microsoft.typespec.providerhub.controller/src/SubscriptionLifecycle/ManagedByTenant.cs @@ -0,0 +1,29 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +namespace Microsoft.TypeSpec.ProviderHub.Controller.SubscriptionLifeCycle +{ + using Newtonsoft.Json; + using Newtonsoft.Json.Serialization; + + /// + /// Represents the tenant managing a customer subscription. + /// + public class ManagedByTenant + { + /// + /// Initializes a new instance of the class. + /// + /// The tenant ID. + public ManagedByTenant(string tenantId) + { + TenantId = tenantId; + } + + /// + /// Gets or sets the tenant ID of the managing tenant. + /// + [JsonProperty("tenantId")] + public string TenantId { get; set; } + } +} diff --git a/packages/microsoft.typespec.providerhub.controller/src/SubscriptionLifecycle/RegisteredFeature.cs b/packages/microsoft.typespec.providerhub.controller/src/SubscriptionLifecycle/RegisteredFeature.cs new file mode 100644 index 0000000000..d4144a2224 --- /dev/null +++ b/packages/microsoft.typespec.providerhub.controller/src/SubscriptionLifecycle/RegisteredFeature.cs @@ -0,0 +1,37 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +namespace Microsoft.TypeSpec.ProviderHub.Controller.SubscriptionLifeCycle +{ + using Newtonsoft.Json; + using Newtonsoft.Json.Serialization; + + /// + /// Represents a registered feature on a subscription. + /// + public class RegisteredFeature + { + /// + /// Initializes a new instance of the class. + /// + /// The feature name. + /// The feature state. + public RegisteredFeature(string name, string state) + { + Name = name; + State = state; + } + + /// + /// Gets or sets name of the feature registered on the subscription, e.g. "Microsoft.Contoso/PrivatePreview". + /// + [JsonProperty("name")] + public string Name { get; set; } + + /// + /// Gets or sets the feature registration state, e.g. "registered". + /// + [JsonProperty("state")] + public string State { get; set; } + } +} diff --git a/packages/microsoft.typespec.providerhub.controller/src/SubscriptionLifecycle/RegistrationStatePayload.cs b/packages/microsoft.typespec.providerhub.controller/src/SubscriptionLifecycle/RegistrationStatePayload.cs new file mode 100644 index 0000000000..ca91879ec0 --- /dev/null +++ b/packages/microsoft.typespec.providerhub.controller/src/SubscriptionLifecycle/RegistrationStatePayload.cs @@ -0,0 +1,47 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +namespace Microsoft.TypeSpec.ProviderHub.Controller.SubscriptionLifeCycle +{ + using Microsoft.TypeSpec.ProviderHub.Controller.SubscriptionLifeCycle.Enums; + using Newtonsoft.Json; + using Newtonsoft.Json.Serialization; + using System; + + /// + /// This model is used to describe the body of the Subscription Lifecycle Notification from ARM. + /// For the ARM RPC reference, see https://github.com/Azure/azure-resource-manager-rpc/blob/master/v1.0/subscription-lifecycle-api-reference.md + /// + public class RegistrationStatePayload + { + /// + /// Initializes a new instance of the class. + /// + /// The state of the registration. + /// The date of the registration. + /// The payload properties. + public RegistrationStatePayload(string state, DateTime registrationDate, RegistrationStateProperties properties) + { + RegistrationState = state; + RegistrationDate = registrationDate; + Properties = properties; + } + + /// + /// Gets or sets the registration state. + /// + [JsonProperty("state")] + public RegistrationState? RegistrationState { get; } + + /// + /// Gets or sets the date of the registration. + /// + [JsonProperty("registrationDate")] + public DateTime RegistrationDate { get; set; } + + /// + /// Gets or sets the registration payload properties. + /// + [JsonProperty("properties")] + public RegistrationStateProperties Properties { get; set; } + } +} diff --git a/packages/microsoft.typespec.providerhub.controller/src/SubscriptionLifecycle/RegistrationStateProperties.cs b/packages/microsoft.typespec.providerhub.controller/src/SubscriptionLifecycle/RegistrationStateProperties.cs new file mode 100644 index 0000000000..6ebdd49d4c --- /dev/null +++ b/packages/microsoft.typespec.providerhub.controller/src/SubscriptionLifecycle/RegistrationStateProperties.cs @@ -0,0 +1,98 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +namespace Microsoft.TypeSpec.ProviderHub.Controller.SubscriptionLifeCycle +{ + using Microsoft.TypeSpec.ProviderHub.Controller.SubscriptionLifeCycle.Enums; + using Newtonsoft.Json; + using Newtonsoft.Json.Serialization; + using System.Collections.Generic; + + /// + /// This model is used to describe the properties of the request sent to us by RPaaS during subscription lifecycle notifications. + /// + public class RegistrationStateProperties + { + /// + /// Initializes a new instance of the class. + /// + /// The tenant ID. + /// The location placement ID. + /// The quota ID. + /// The list of registered features. + /// The subscription account owner. + /// The list of managedBy tenants. + /// The additional properties. + public RegistrationStateProperties( + string tenantId, + string locationPlacementId, + string quotaId, + List registeredFeatures, + AccountOwner accountOwner, + List managedByTenants, + AdditionalProperties additionalProperties) + { + TenantId = tenantId; + LocationPlacementId = locationPlacementId; + QuotaId = quotaId; + RegisteredFeatures = registeredFeatures; + AccountOwner = accountOwner; + ManagedByTenants = managedByTenants; + AdditionalProperties = additionalProperties; + } + + /// + /// Gets or sets the tenant ID. + /// + [JsonProperty("tenantId")] + public string TenantId { get; set; } + + /// + /// Gets or sets the location placement ID. + /// + [JsonProperty("locationPlacementId")] + public string LocationPlacementId { get; set; } + + /// + /// Gets or sets the quota ID. + /// + [JsonProperty("quotaId")] + public string QuotaId { get; set; } + + /// + /// Gets or sets the list of registered features. + /// + [JsonProperty("registeredFeatures")] + public List RegisteredFeatures { get; set; } + + /// + /// Gets or sets the availability zones. + /// + [JsonProperty("availabilityZones")] + public AvailabilityZones AvailabilityZones { get; set; } + + /// + /// Gets or sets the spending limit. + /// + [JsonProperty("spendingLimit")] + public SpendingLimit SpendingLimit { get; set; } + + /// + /// Gets or sets the account owner, e.g. "account@company.com". + /// + [JsonProperty("accountOwner")] + public AccountOwner AccountOwner { get; set; } + + /// + /// Gets or sets the list of managedBy tenants. + /// + [JsonProperty("managedByTenants")] + public List ManagedByTenants { get; set; } + + /// + /// Gets or sets the additional properties. + /// + [JsonProperty("additionalProperties")] + public AdditionalProperties AdditionalProperties { get; set; } + } +} diff --git a/packages/microsoft.typespec.providerhub.controller/src/SubscriptionLifecycle/ResourceStatus.cs b/packages/microsoft.typespec.providerhub.controller/src/SubscriptionLifecycle/ResourceStatus.cs new file mode 100644 index 0000000000..6f95769b5c --- /dev/null +++ b/packages/microsoft.typespec.providerhub.controller/src/SubscriptionLifecycle/ResourceStatus.cs @@ -0,0 +1,38 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +namespace Microsoft.TypeSpec.ProviderHub.Controller.SubscriptionLifeCycle +{ + using Newtonsoft.Json; + using Newtonsoft.Json.Serialization; + using System; + + /// + /// Represents resource status, including a boolean value and an effective date. + /// + public class ResourceStatus + { + /// + /// Initializes a new instance of the class. + /// + /// The boolean value representing the resource status. + /// The effective date for the resource status. + public ResourceStatus(bool value, DateTime effectiveDate) + { + Value = value; + EffectiveDate = effectiveDate; + } + + /// + /// Gets or sets a value indicating whether the policy is effective. + /// + [JsonProperty("value")] + public bool? Value { get; set; } + + /// + /// Gets or sets the effective date for the resource status. + /// + [JsonProperty("effectiveDate")] + public DateTime? EffectiveDate { get; set; } + } +} diff --git a/packages/microsoft.typespec.providerhub.controller/src/SubscriptionLifecycle/ZoneMapping.cs b/packages/microsoft.typespec.providerhub.controller/src/SubscriptionLifecycle/ZoneMapping.cs new file mode 100644 index 0000000000..7aabc825fb --- /dev/null +++ b/packages/microsoft.typespec.providerhub.controller/src/SubscriptionLifecycle/ZoneMapping.cs @@ -0,0 +1,37 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +namespace Microsoft.TypeSpec.ProviderHub.Controller.SubscriptionLifeCycle +{ + using Newtonsoft.Json; + using Newtonsoft.Json.Serialization; + + /// + /// Represents a mapping between logical and physical zones. + /// + public class ZoneMapping + { + /// + /// Initializes a new instance of the class. + /// + /// The logical zone. + /// The physical zone. + public ZoneMapping(string logicalZone, string physicalZone) + { + LogicalZone = logicalZone; + PhysicalZone = physicalZone; + } + + /// + /// Gets or sets the logical zone. + /// + [JsonProperty("logicalZone")] + public string LogicalZone { get; set; } + + /// + /// Gets or sets the physical zone. + /// + [JsonProperty("physicalZone")] + public string PhysicalZone { get; set; } + } +} diff --git a/packages/microsoft.typespec.providerhub.controller/test/SubscriptionLifecycleTests.cs b/packages/microsoft.typespec.providerhub.controller/test/SubscriptionLifecycleTests.cs new file mode 100644 index 0000000000..1cdf2c55a0 --- /dev/null +++ b/packages/microsoft.typespec.providerhub.controller/test/SubscriptionLifecycleTests.cs @@ -0,0 +1,293 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using Microsoft.TypeSpec.ProviderHub.Controller.SubscriptionLifeCycle; +using Microsoft.TypeSpec.ProviderHub.Controller.SubscriptionLifeCycle.Enums; +using Newtonsoft.Json; +using NUnit.Framework; +using System; + +namespace ProviderHubControllerTests +{ + public class SubscriptionLifecycleTests + { + const string optionalArgsMissingPayload = @"{ + ""state"": ""Registered"", + ""registrationDate"": ""Thu, 26 Oct 2023 10:21:33 GMT"", + ""properties"": { + ""tenantId"": ""72f988bf-86f1-41af-91ab-2d7cd011db47"", + ""locationPlacementId"": ""Internal_2014-09-01"", + ""quotaId"": ""Internal_2014-09-01"", + ""spendingLimit"": ""On"", + ""accountOwner"": { + ""puid"": ""1111111111111111"", + ""email"": ""user@company.com"" + }, + ""registeredFeatures"": [ + { + ""name"": """", + ""state"": ""Registered"" + } + ], + ""managedByTenants"": [ + { + ""tenantId"": """" + } + ], + ""additionalProperties"": { + ""resourceProviderProperties"": ""{\""resourceProviderNamespace\"":\""Microsoft.Contoso\""}"", + ""billingProperties"": { + ""channelType"": ""Internal"", + ""paymentType"": ""Paid"", + ""workloadType"": ""DevTest"", + ""billingType"": ""Legacy"", + ""costCategory"": ""FX"", + ""tier"": ""Standard"", + ""billingAccount"": { + ""id"": ""/providers/Microsoft.Billing/billingAccounts/ac430efe-1866-4124-9ed9-ee67f9cb75db"" + } + } + } + } +}"; + + const string noAdditionalPropsPayload = @"{ + ""state"": ""Warned"", + ""registrationDate"": ""Thu, 26 Oct 2023 10:21:33 GMT"", + ""properties"": { + ""tenantId"": ""72f988bf-86f1-41af-91ab-2d7cd011db47"", + ""locationPlacementId"": ""Internal_2014-09-01"", + ""quotaId"": ""Internal_2014-09-01"", + ""spendingLimit"": ""On"", + ""accountOwner"": { + ""puid"": ""1111111111111111"", + ""email"": ""user@company.com"" + }, + ""registeredFeatures"": [ + { + ""name"": """", + ""state"": ""Registered"" + } + ], + ""managedByTenants"": [ + { + ""tenantId"": """" + } + ], + ""additionalProperties"": {} + } +}"; + + const string fullPayload = @"{ + ""state"": ""Unregistered"", + ""registrationDate"": ""Tue, 15 Nov 1994 08:12:31 GMT"", + ""properties"": { + ""tenantId"": ""ac430efe-1866-4124-9ed9-ee67f9cb75db"", + ""locationPlacementId"": ""Internal_2014-09-01"", + ""quotaId"": ""Default_2014-09-01"", + ""registeredFeatures"": [ + { + ""name"": """", + ""state"": ""Registered"" + } + ], + ""availabilityZones"": { + ""location"": """", + ""zoneMappings"": [ + { + ""logicalZone"": ""1"", + ""physicalZone"": ""2"" + }, + { + ""logicalZone"": ""2"", + ""physicalZone"": ""1"" + } + ] + }, + ""spendingLimit"": ""On"", + ""accountOwner"": { + ""puid"": ""12445122"", + ""email"": ""account@company.com"" + }, + ""managedByTenants"": [ + { + ""tenantId"": """" + } + ], + ""additionalProperties"": { + ""billingProperties"": { + ""costCategory"": ""FR"", + ""channelType"": ""Internal"", + ""billingType"": ""Legacy"", + ""paymentType"": ""Paid"", + ""workloadType"": ""Production"", + ""tier"": ""Standard"", + ""billingAccount"": { + ""id"": ""/providers/Microsoft.Billing/billingAccounts/54731783"" + }, + ""additionalStateInformation"": { + ""releaseNonDataRetentionResource"": { + ""value"": true, + ""effectiveDate"": ""Tue, 15 Nov 1994 08:12:31 GMT"" + }, + ""blockNewResourceCreation"": { + ""value"": false, + ""effectiveDate"": ""Wed, 16 Nov 1994 08:12:31 GMT"" + } + } + }, + ""resourceProviderProperties"": ""{\""resourceProviderNamespace\"":\""Microsoft.Contoso\""}"", + } + } +}"; + + const string randomExtraProps = @"{ + ""state"": ""Unregistered"", + ""registrationDate"": ""Tue, 15 Nov 1994 08:12:31 GMT"", + ""properties"": { + ""additionalProperties"": { + ""someNewProperty"": ""ThatNoOneHasHeardOf"", + ""anotherRandomDateTime"": ""Thu, 16 Nov 2023 22:08:58 +0400"" + } + } +}"; + + [SetUp] + public void Init() + { + } + + /// + /// Tests that deserialization still works even if optional properties are missing from the payload. + /// + [Test] + public void DeserializePayloadOptionalArgsMissing() + { + RegistrationStatePayload? payload = null; + Assert.DoesNotThrow(() => payload = JsonConvert.DeserializeObject(optionalArgsMissingPayload)); + Assert.NotNull(payload); + Assert.AreEqual(RegistrationState.Registered, payload.RegistrationState); + Assert.AreEqual(DateTime.Parse("Thu, 26 Oct 2023 10:21:33 GMT").ToUniversalTime(), payload.RegistrationDate); + + // Properties + Assert.AreEqual("72f988bf-86f1-41af-91ab-2d7cd011db47", payload.Properties.TenantId); + Assert.AreEqual("Internal_2014-09-01", payload.Properties.LocationPlacementId); + Assert.AreEqual("Internal_2014-09-01", payload.Properties.QuotaId); + Assert.AreEqual(SpendingLimit.On, payload.Properties.SpendingLimit); + Assert.AreEqual("1111111111111111", payload.Properties.AccountOwner.Puid); + Assert.AreEqual("user@company.com", payload.Properties.AccountOwner.Email); + Assert.AreEqual("", payload.Properties.RegisteredFeatures[0].Name); + Assert.AreEqual("Registered", payload.Properties.RegisteredFeatures[0].State); + Assert.AreEqual("", payload.Properties.ManagedByTenants[0].TenantId); + + // Additional Properties + Assert.AreEqual("{\"resourceProviderNamespace\":\"Microsoft.Contoso\"}", payload.Properties.AdditionalProperties.ResourceProviderProperties); + Assert.AreEqual(ChannelType.Internal, payload.Properties.AdditionalProperties.BillingProperties.ChannelType); + Assert.AreEqual(PaymentType.Paid, payload.Properties.AdditionalProperties.BillingProperties.PaymentType); + Assert.AreEqual(WorkloadType.DevTest, payload.Properties.AdditionalProperties.BillingProperties.WorkloadType); + Assert.AreEqual(BillingType.Legacy, payload.Properties.AdditionalProperties.BillingProperties.BillingType); + Assert.AreEqual(CostCategory.CostOfGoodsSold, payload.Properties.AdditionalProperties.BillingProperties.CostCategory); + Assert.AreEqual(Tier.Standard, payload.Properties.AdditionalProperties.BillingProperties.Tier); + Assert.AreEqual("/providers/Microsoft.Billing/billingAccounts/ac430efe-1866-4124-9ed9-ee67f9cb75db", payload.Properties.AdditionalProperties.BillingProperties.BillingAccount.Id); + } + + /// + /// Tests that deserialization works when all properties are present in the payload. + /// + [Test] + public void DeserializeFullPayload() + { + RegistrationStatePayload? payload = null; + Assert.DoesNotThrow(() => payload = JsonConvert.DeserializeObject(fullPayload)); + Assert.NotNull(payload); + Assert.AreEqual(RegistrationState.Unregistered, payload.RegistrationState); + Assert.AreEqual(DateTime.Parse("Tue, 15 Nov 1994 08:12:31 GMT").ToUniversalTime(), payload.RegistrationDate); + + // Properties + Assert.AreEqual("ac430efe-1866-4124-9ed9-ee67f9cb75db", payload.Properties.TenantId); + Assert.AreEqual("Internal_2014-09-01", payload.Properties.LocationPlacementId); + Assert.AreEqual("Default_2014-09-01", payload.Properties.QuotaId); + Assert.AreEqual("", payload.Properties.RegisteredFeatures[0].Name); + Assert.AreEqual("Registered", payload.Properties.RegisteredFeatures[0].State); + Assert.AreEqual("", payload.Properties.AvailabilityZones.Location); + Assert.AreEqual("1", payload.Properties.AvailabilityZones.ZoneMappings[0].LogicalZone); + Assert.AreEqual("2", payload.Properties.AvailabilityZones.ZoneMappings[0].PhysicalZone); + Assert.AreEqual("2", payload.Properties.AvailabilityZones.ZoneMappings[1].LogicalZone); + Assert.AreEqual("1", payload.Properties.AvailabilityZones.ZoneMappings[1].PhysicalZone); + Assert.AreEqual(SpendingLimit.On, payload.Properties.SpendingLimit); + Assert.AreEqual("12445122", payload.Properties.AccountOwner.Puid); + Assert.AreEqual("account@company.com", payload.Properties.AccountOwner.Email); + Assert.AreEqual("", payload.Properties.ManagedByTenants[0].TenantId); + + // Additional Properties + Assert.AreEqual(CostCategory.ResearchAndDevelopment, payload.Properties.AdditionalProperties.BillingProperties.CostCategory); + Assert.AreEqual(ChannelType.Internal, payload.Properties.AdditionalProperties.BillingProperties.ChannelType); + Assert.AreEqual(BillingType.Legacy, payload.Properties.AdditionalProperties.BillingProperties.BillingType); + Assert.AreEqual(PaymentType.Paid, payload.Properties.AdditionalProperties.BillingProperties.PaymentType); + Assert.AreEqual(WorkloadType.Production, payload.Properties.AdditionalProperties.BillingProperties.WorkloadType); + Assert.AreEqual(Tier.Standard, payload.Properties.AdditionalProperties.BillingProperties.Tier); + Assert.AreEqual("/providers/Microsoft.Billing/billingAccounts/54731783", payload.Properties.AdditionalProperties.BillingProperties.BillingAccount.Id); + Assert.True(payload.Properties.AdditionalProperties.BillingProperties.AdditionalStateInformation.ReleaseNonDataRetentionResource.Value); + Assert.AreEqual(DateTime.Parse("Tue, 15 Nov 1994 08:12:31 GMT").ToUniversalTime(), payload.Properties.AdditionalProperties.BillingProperties.AdditionalStateInformation.ReleaseNonDataRetentionResource.EffectiveDate); + Assert.False(payload.Properties.AdditionalProperties.BillingProperties.AdditionalStateInformation.BlockNewResourceCreation.Value); + Assert.AreEqual(DateTime.Parse("Wed, 16 Nov 1994 08:12:31 GMT").ToUniversalTime(), payload.Properties.AdditionalProperties.BillingProperties.AdditionalStateInformation.BlockNewResourceCreation.EffectiveDate); + Assert.AreEqual("{\"resourceProviderNamespace\":\"Microsoft.Contoso\"}", payload.Properties.AdditionalProperties.ResourceProviderProperties); + } + + /// + /// Tests that deserialization works even when extra "additionalProperties" are passed. + /// + [Test] + public void DeserializePayloadWithExtras() + { + RegistrationStatePayload? payload = null; + Assert.DoesNotThrow(() => payload = JsonConvert.DeserializeObject(randomExtraProps)); + Assert.NotNull(payload); + Assert.AreEqual(RegistrationState.Unregistered, payload.RegistrationState); + Assert.AreEqual(DateTime.Parse("Tue, 15 Nov 1994 08:12:31 GMT").ToUniversalTime(), payload.RegistrationDate); + } + + /// + /// Tests that deserialization works when the "additionalProperties" bag is not passed. + /// + [Test] + public void DeserializePayloadWithNoAdditionalProperties() + { + RegistrationStatePayload? payload = null; + Assert.DoesNotThrow(() => payload = JsonConvert.DeserializeObject(noAdditionalPropsPayload)); + Assert.NotNull(payload); + Assert.AreEqual(RegistrationState.Warned, payload.RegistrationState); + Assert.AreEqual(DateTime.Parse("Thu, 26 Oct 2023 10:21:33 GMT").ToUniversalTime(), payload.RegistrationDate); + + // Properties + Assert.AreEqual("72f988bf-86f1-41af-91ab-2d7cd011db47", payload.Properties.TenantId); + Assert.AreEqual("Internal_2014-09-01", payload.Properties.LocationPlacementId); + Assert.AreEqual("Internal_2014-09-01", payload.Properties.QuotaId); + Assert.AreEqual(SpendingLimit.On, payload.Properties.SpendingLimit); + Assert.AreEqual("1111111111111111", payload.Properties.AccountOwner.Puid); + Assert.AreEqual("user@company.com", payload.Properties.AccountOwner.Email); + Assert.AreEqual("", payload.Properties.RegisteredFeatures[0].Name); + Assert.AreEqual("Registered", payload.Properties.RegisteredFeatures[0].State); + Assert.AreEqual("", payload.Properties.ManagedByTenants[0].TenantId); + } + + /// + /// Tests that valid registration states are accepted, while staying extensible for future values that may be added. + /// + /// + [TestCase("{'state':'Registered'}", "Registered")] + [TestCase("{'state':'Unregistered'}", "Unregistered")] + [TestCase("{'state':'Warned'}", "Warned")] + [TestCase("{'state':'Suspended'}", "Suspended")] + [TestCase("{'state':'Deleted'}", "Deleted")] + [TestCase("{'state':'reg'}", "reg")] + [TestCase("{'state':'someOtherRandom!!!value'}", "someOtherRandom!!!value")] + public void ValidRegistrationStateSucceeds(string jsonPayload, string expectedState) + { + RegistrationStatePayload? payload = null; + var registrationState = payload = JsonConvert.DeserializeObject(jsonPayload); + Assert.NotNull(payload); + Assert.AreEqual(new RegistrationState(expectedState), registrationState.RegistrationState); + } + } +} diff --git a/packages/samples/.eslintrc.cjs b/packages/samples/.eslintrc.cjs new file mode 100644 index 0000000000..c0b2a9d1a7 --- /dev/null +++ b/packages/samples/.eslintrc.cjs @@ -0,0 +1,7 @@ +require("@typespec/eslint-config-typespec/patch/modern-module-resolution"); + +module.exports = { + plugins: ["@typespec/eslint-plugin"], + extends: ["@typespec/eslint-config-typespec", "plugin:@typespec/eslint-plugin/recommended"], + parserOptions: { tsconfigRootDir: __dirname }, +}; diff --git a/packages/samples/.mocharc.yaml b/packages/samples/.mocharc.yaml new file mode 100644 index 0000000000..27f08a3b81 --- /dev/null +++ b/packages/samples/.mocharc.yaml @@ -0,0 +1,7 @@ +timeout: 10000 +require: source-map-support/register +spec: "dist/test/**/*.test.js" +ignore: "dist/test/manual/**/*.js" + +# Config for https://www.npmjs.com/package/mocha-multi-reporters +reporterOptions: "configFile=mocha.reporter.config.json" diff --git a/packages/samples/LICENSE b/packages/samples/LICENSE new file mode 100644 index 0000000000..21071075c2 --- /dev/null +++ b/packages/samples/LICENSE @@ -0,0 +1,21 @@ + MIT License + + Copyright (c) Microsoft Corporation. All rights reserved. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE diff --git a/packages/samples/README.md b/packages/samples/README.md new file mode 100644 index 0000000000..0840408dc0 --- /dev/null +++ b/packages/samples/README.md @@ -0,0 +1,11 @@ +# Typespec Azure Samples + +```bash +npm run test # Check Samples match snapshots +npm run test-official # run test same as CI + + +npm run test:regen -- -g "" # Regen of this name + +npm run test:regen # Regen all samples. +``` diff --git a/packages/samples/mocha.reporter.config.json b/packages/samples/mocha.reporter.config.json new file mode 100644 index 0000000000..fed0d70820 --- /dev/null +++ b/packages/samples/mocha.reporter.config.json @@ -0,0 +1,4 @@ +{ + "reporterEnabled": "spec, mocha-junit-reporter", + "maxDiffSize": 16384 +} diff --git a/packages/samples/package.json b/packages/samples/package.json new file mode 100644 index 0000000000..7df77fcfea --- /dev/null +++ b/packages/samples/package.json @@ -0,0 +1,64 @@ +{ + "name": "@azure-tools/typespec-samples", + "private": true, + "version": "1.0.0", + "author": "Microsoft Corporation", + "description": "Samples for TypeSpec", + "homepage": "https://azure.github.io/typespec-azure", + "readme": "https://github.com/Azure/typespec-azure/blob/main/readme.md", + "license": "MIT", + "repository": { + "type": "git", + "url": "git+https://github.com/Azure/typespec-azure.git" + }, + "bugs": { + "url": "https://github.com/Azure/typespec-azure/issues" + }, + "keywords": [ + "typespec", + "cli" + ], + "type": "module", + "engines": { + "node": ">=18.0.0" + }, + "scripts": { + "clean": "rimraf ./dist ./temp", + "build": "tsc -p .", + "watch": "tsc -p . --watch", + "test": "mocha", + "test-official": "mocha --forbid-only", + "test:regen": "cross-env RECORD=true mocha", + "regen-samples": "cross-env RECORD=true mocha" + }, + "files": [ + "lib/*.tsp", + "dist/**", + "!dist/test/**" + ], + "dependencies": { + "@typespec/versioning": "workspace:~0.51.0", + "@typespec/compiler": "workspace:~0.51.0", + "@typespec/openapi": "workspace:~0.51.0", + "@typespec/openapi3": "workspace:~0.51.0", + "@typespec/http": "workspace:~0.51.0", + "@typespec/rest": "workspace:~0.51.0", + "@azure-tools/typespec-azure-core": "workspace:~0.37.1", + "@azure-tools/typespec-autorest": "workspace:~0.37.1", + "@azure-tools/typespec-azure-resource-manager": "workspace:~0.37.0", + "@azure-tools/typespec-client-generator-core": "workspace:~0.37.0" + }, + "devDependencies": { + "@typespec/internal-build-utils": "workspace:~0.51.0", + "@typespec/eslint-config-typespec": "workspace:~0.51.0", + "@typespec/samples": "workspace:~1.0.0", + "@types/mocha": "~10.0.1", + "@types/node": "~18.11.9", + "cross-env": "~7.0.3", + "eslint": "^8.49.0", + "mocha": "~10.2.0", + "autorest": "~3.3.2", + "rimraf": "~5.0.1", + "typescript": "~5.2.2" + } +} diff --git a/packages/samples/scratch/.gitignore b/packages/samples/scratch/.gitignore new file mode 100644 index 0000000000..ae140cafe7 --- /dev/null +++ b/packages/samples/scratch/.gitignore @@ -0,0 +1,3 @@ +# This directory reserved for creating scratch *.tsp for testing/experimentation +**/* +!.gitignore diff --git a/packages/samples/specs/data-plane/api-path-parameter/main.tsp b/packages/samples/specs/data-plane/api-path-parameter/main.tsp new file mode 100644 index 0000000000..32a51c62f9 --- /dev/null +++ b/packages/samples/specs/data-plane/api-path-parameter/main.tsp @@ -0,0 +1,127 @@ +import "@typespec/http"; +import "@typespec/rest"; +import "@typespec/versioning"; +import "@azure-tools/typespec-azure-core"; + +using TypeSpec.Http; +using TypeSpec.Rest; +using TypeSpec.Versioning; +using Azure.Core; +using Azure.Core.Traits; + +@service({ + title: "Contoso Widget Manager", +}) +@versioned(Contoso.WidgetManager.Versions) +namespace Contoso.WidgetManager; + +@doc("The Contoso Widget Manager service version.") +enum Versions { + @doc("Version 2022-08-31") + @useDependency(Azure.Core.Versions.v1_0_Preview_1) + `2022-08-31`, +} + +// Models //////////////////// + +@doc("A widget.") +@resource("widgets") +model Widget { + @key("widgetName") + @doc("The widget name.") + @visibility("read") + name: string; + + @doc("The ID of the widget's manufacturer.") + manufacturerId: string; + + ...EtagProperty; +} + +@doc("A manufacturer of widgets.") +@resource("manufacturers") +model Manufacturer { + @key("manufacturerId") + @doc("The manufacturer's unique ID.") + @visibility("read") + id: string; + + @doc("The manufacturer's name.") + name: string; + + @doc("The manufacturer's full address.") + address: string; + + ...EtagProperty; +} + +// Operations //////////////////// + +@doc("The ApiVersion path parameter.") +model ApiVersionPathParameter { + @segment("api") + @path("api-version") + @doc("The API version to use for this operation.") + apiVersion: string; +} + +alias ServiceTraits = TraitOverride> & + SupportsRepeatableRequests & + SupportsConditionalRequests & + SupportsClientRequestId; + +alias Operations = Azure.Core.ResourceOperations; + +interface Widgets { + // Operation Status + @doc("Gets status of a Widget operation.") + getWidgetOperationStatus is Operations.GetResourceOperationStatus; + + // Widget Operations + @doc("Creates or updates a Widget asynchronously") + @pollingOperation(Widgets.getWidgetOperationStatus) + createOrUpdateWidget is Operations.LongRunningResourceCreateOrUpdate; + + @doc("Get a Widget") + getWidget is Operations.ResourceRead; + + @doc("Delete a Widget asynchronously.") + @pollingOperation(Widgets.getWidgetOperationStatus) + deleteWidget is Operations.LongRunningResourceDelete; + + @doc("List Widget resources") + listWidgets is Operations.ResourceList< + Widget, + ListQueryParametersTrait + >; +} + +interface Manufacturers { + @doc("Gets status of a Manufacturer operation.") + getManufacturerOperationStatus is Operations.GetResourceOperationStatus; + + @doc("Creates or replaces a Manufacturer") + createOrReplaceManufacturer is Operations.ResourceCreateOrReplace; + + @doc("Get a Manufacturer") + getManufacturer is Operations.ResourceRead; + + @doc("Delete a Manufacturer asynchronously.") + @pollingOperation(Manufacturers.getManufacturerOperationStatus) + deleteManufacturer is Operations.LongRunningResourceDelete; + + @doc("List Manufacturer resources") + listManufacturers is Operations.ResourceList; +} + +// A "global" RPC operation +#suppress "@azure-tools/typespec-azure-core/no-rpc-path-params" "The API version is part of the route path." +@route("/api/{apiVersion}/service-status") +@doc("Responds with status information about the overall service.") +op getServiceStatus is RpcOperation< + {}, + { + statusString: string; + }, + ServiceTraits +>; diff --git a/packages/samples/specs/data-plane/azure-core-scalars/main.tsp b/packages/samples/specs/data-plane/azure-core-scalars/main.tsp new file mode 100644 index 0000000000..f5c19c6dd7 --- /dev/null +++ b/packages/samples/specs/data-plane/azure-core-scalars/main.tsp @@ -0,0 +1,63 @@ +import "@typespec/http"; +import "@typespec/rest"; +import "@typespec/versioning"; +import "@azure-tools/typespec-azure-core"; + +using TypeSpec.Rest; +using TypeSpec.Versioning; +using Azure.Core; +using Azure.Core.Traits; + +@service +@versioned(Contoso.WidgetManager.Versions) +namespace Contoso.WidgetManager; + +@doc("The Contoso Widget Manager service version.") +enum Versions { + @doc("Version 2022-08-31") + @useDependency(Azure.Core.Versions.v1_0_Preview_1) + `2022-08-31`, +} + +// Models //////////////////// + +@doc("A widget.") +@resource("widgets") +model Widget { + @key("widgetName") + @doc("The widget name.") + @visibility("read") + name: string; + + /** Side id as a uuid */ + siteId: uuid; + + /** IpV6 of widget */ + ipV4: ipV4Address; + + /** IpV6 of widget */ + ipV6: ipV6Address; + + ...EtagProperty; +} + +@error +@doc("A custom error type for the Widget Manager service.") +model WidgetServiceErrorResponse { + @doc("The numeric error code.") + code: int32; + + @doc("The error message.") + errorMessage: string; +} + +// Operations //////////////////// + +alias ServiceTraits = SupportsRepeatableRequests & + SupportsConditionalRequests & + SupportsClientRequestId; + +alias Operations = Azure.Core.ResourceOperations; + +@doc("Get a Widget") +op getWidget is Operations.ResourceRead; diff --git a/packages/samples/specs/data-plane/confidentialledger/confidentialledger.tsp b/packages/samples/specs/data-plane/confidentialledger/confidentialledger.tsp new file mode 100644 index 0000000000..85ade02b5b --- /dev/null +++ b/packages/samples/specs/data-plane/confidentialledger/confidentialledger.tsp @@ -0,0 +1,269 @@ +import "@typespec/http"; +import "@typespec/rest"; +import "@typespec/versioning"; +import "@typespec/openapi"; +import "@azure-tools/typespec-azure-core"; +import "@azure-tools/typespec-autorest"; + +using TypeSpec.Http; +using TypeSpec.Rest; +using TypeSpec.Versioning; +using Azure.Core; +using Azure.Core.Traits; +using TypeSpec.OpenAPI; + +// +// ** Service description ** +// + +@useAuth( + ApiKeyAuth | OAuth2Auth<[ + { + type: OAuth2FlowType.implicit, + authorizationUrl: "https://login.contoso.com/common/oauth2/v2.0/authorize", + scopes: ["https://cognitiveservices.azure.com/.default"], + } + ]> +) +@service({ + title: "Confidential Ledger Service", + version: "2022-05-13", +}) +@useDependency(Azure.Core.Versions.v1_0_Preview_2) +@server( + "{ledgerUri}", + "Confidential Ledger Service", + { + ledgerUri: url, + } +) +namespace Azure.Security.ConfidentialLedger; + +alias ServiceTraits = NoRepeatableRequests & NoConditionalRequests & NoClientRequestId; + +alias Operations = Azure.Core.ResourceOperations; + +// +// ** Parameter descriptions ** +// + +@doc("A unique identifier for the state of the ledger. If returned as part of a LedgerEntry, it indicates the state from which the entry was read.") +scalar TransactionId extends string; + +@doc("The collectionId parameter definition.") +model CollectionIdParameter { + @query + @doc("The collection id.") + collectionId?: string; +} + +// +// ** Model descriptions ** +// + +@resource("collections") +@doc("Identifier for collections.") +model Collection { + @key + @doc("The collection id.") + @visibility("read") + collectionId: string; +} + +@doc("Details about a ledger entry.") +@resource("transactions") +model LedgerEntry { + @doc("Contents of the ledger entry.") + contents: string; + + @visibility("read") + @doc("The collection id.") + collectionId: string; + + @key + @visibility("read") + @doc("A unique identifier for the state of the ledger. If returned as part of a LedgerEntry, it indicates the state from which the entry was read.") + transactionId: TransactionId; +} + +// TODO: No way to set "x-ms-enum.name" right now +@doc("Represents an assignable role.") +enum LedgerUserRole { + @doc("The administrator role.") + Administrator, + + @doc("The contributor role.") + Contributor, + + @doc("The reader role.") + Reader, +} + +@resource("users") +@doc("Details about a Confidential ledger user.") +model LedgerUser { + @key + @doc("The user id, either an AAD object ID or certificate fingerprint.") + @extension("x-ms-skip-url-encoding", true) + @visibility("read") + userId: string; + + @doc("The user's assigned role.") + assignedRole: LedgerUserRole; +} + +@doc("The contents of a receipt.") +model ReceiptContents { + // Elided for now +} + +// TODO: No way to set "x-ms-enum.name" right now +@doc("State of a ledger query.") +enum LedgerQueryState { + @doc("The query is still loading.") + Loading, + + @doc("The query is ready.") + Ready, +} + +@doc("A receipt certifying the transaction at the specified id.") +model TransactionReceipt { + @doc("The receipt contents.") + receipt: ReceiptContents; + + @doc("The state of the ledger query.") + state: LedgerQueryState; + + @doc("The transaction ID.") + transactionId: TransactionId; +} + +// TODO: No way to set "x-ms-enum.name" right now +@doc("Represents the state of the transaction.") +enum TransactionState { + @doc("The transaction is committed.") + Committed, + + @doc("The transaction is pending.") + Pending, +} + +@doc("Response returned to a query for the transaction status.") +model TransactionStatus { + @doc("The transaction state.") + state: TransactionState; + + @doc("The transaction ID.") + transactionId: TransactionId; +} + +@doc("Paginated ledger entries returned in response to a query.") +@pagedResult +model PagedLedgerEntries { + @doc("Array of ledger entries.") + @items + entries: LedgerEntry[]; + + @doc("State of the ledger query.") + state: LedgerQueryState; + + @doc("Path from which to retrieve the next page of results.") + @nextLink + nextLink?: ResourceLocation; +} + +// +// ** Operations ** +// + +@route("/app") +namespace ConfidentialLedger { + #suppress "@azure-tools/typespec-azure-core/use-standard-operations" "This is an existing service, we have a non-conforming operation." + @summary("Retrieves a list of collection ids present in the Confidential Ledger") + @doc("Collection ids are user-created collections of ledger entries") + op listCollections is Azure.Core.Foundations.NonPagedResourceList; + + // TODO: add return model + #suppress "@azure-tools/typespec-azure-core/use-standard-operations" "This is an existing service, we have a non-conforming operation." + @route("/enclaveQuotes") + @summary("Gets quotes for all nodes of the Confidential Ledger.") + @doc("A quote is an SGX enclave measurement that can be used to verify the validity of a node and its enclave.") + @get + op getEnclaveQuotes is Azure.Core.Foundations.Operation<{}, OkResponse>; + + // TODO: add return model + #suppress "@azure-tools/typespec-azure-core/use-standard-operations" "This is an existing service, we have a non-conforming operation." + @route("/governance/constitution") + @summary("Gets the constitution used for governance.") + @doc("The constitution is a script that assesses and applies proposals from consortium members.") + @get + op getConstitution is Azure.Core.Foundations.Operation<{}, OkResponse>; + + // TODO: add return model + #suppress "@azure-tools/typespec-azure-core/use-standard-operations" "This is an existing service, we have a non-conforming operation." + @route("/governance/members") + @summary("Gets the consortium members.") + @doc("Consortium members can manage the Confidential Ledger.") + @get + op getConsortiumMembers is Azure.Core.Foundations.Operation<{}, OkResponse>; + + #suppress "@azure-tools/typespec-azure-core/use-standard-operations" "This is an existing service with a non-standard list operation." + @summary("Gets ledger entries from a collection corresponding to a range.") + @doc("A collection id may optionally be specified. Only entries in the specified (or default) collection will be returned.") + op listLedgerEntries is Azure.Core.Foundations.ResourceList; + + @summary("Writes a ledger entry.") + @doc("A collection id may optionally be specified.") + @post + op createLedgerEntry is Operations.ResourceCreateWithServiceProvidedName< + LedgerEntry, + QueryParametersTrait + >; + + @doc("Get a LedgerEntry") + @summary("Gets the ledger entry at the specified transaction id. A collection id may optionally be specified to indicate the collection from which to fetch the value.") + op getLedgerEntry is Operations.ResourceRead< + LedgerEntry, + QueryParametersTrait + >; + + #suppress "@azure-tools/typespec-azure-core/verb-conflict" "This is an existing service." + @get + @action("receipt") + @doc("Runs a custom action on LedgerEntry") + @summary("Gets a receipt certifying ledger contents at a particular transaction id.") + @actionSeparator("/") + op getReceipt is Operations.ResourceAction; + + #suppress "@azure-tools/typespec-azure-core/verb-conflict" "This is an existing service." + @get + @action("status") + @doc("Runs a custom action on LedgerEntry") + @summary("Gets a receipt certifying ledger contents at a particular transaction id.") + @actionSeparator("/") + op getTransactionStatus is Operations.ResourceAction; + + #suppress "@azure-tools/typespec-azure-core/verb-conflict" "This is an existing service." + @get + @doc("Runs a custom action on LedgerEntry") + @summary("Gets the current value available in the ledger.") + @actionSeparator("/") + op getCurrentLedgerEntry is Operations.ResourceCollectionAction< + LedgerEntry, + CollectionIdParameter, + LedgerEntry + >; + + @doc("Delete a LedgerUser") + @summary("Deletes a user from the Confidential Ledger.") + op deleteUser is Operations.ResourceDelete; + + @doc("Get a LedgerUser") + @summary("Gets a user.") + op getUser is Operations.ResourceRead; + + @doc("Creates or updates a LedgerUser") + @summary("Adds a user or updates a user's fields.") + op createOrUpdateUser is Operations.ResourceCreateOrUpdate; +} diff --git a/packages/samples/specs/data-plane/confidentialledger/identityservice.tsp b/packages/samples/specs/data-plane/confidentialledger/identityservice.tsp new file mode 100644 index 0000000000..d2974cdb5f --- /dev/null +++ b/packages/samples/specs/data-plane/confidentialledger/identityservice.tsp @@ -0,0 +1,38 @@ +import "@typespec/http"; +import "@typespec/rest"; +import "@typespec/versioning"; +import "@azure-tools/typespec-azure-core"; +import "@azure-tools/typespec-autorest"; + +using TypeSpec.Http; +using TypeSpec.Rest; +using TypeSpec.Versioning; +using Azure.Core; + +@useDependency(Azure.Core.Versions.v1_0_Preview_2) +@server( + "{identityServiceUri}", + "Confidential Ledger Service", + { + identityServiceUri: string, + } +) +namespace Azure.Security.ConfidentialLedgerIdentity; + +@resource("ledgerIdentity") +@doc("Contains the information about a Confidential Ledger.") +model LedgerIdentityInformation { + @key + @doc("Id for the ledger.") + @visibility("read") + ledgerId: string; + + @doc("PEM-encoded certificate used for TLS by the Confidential Ledger.") + ledgerTlsCertificate: string; +} + +#suppress "deprecated" "This is kept as an example that the old signatures are deprecated." +@get +@doc("Gets a LedgerIdentityInformation.") +@summary("Gets identity information for a Confidential Ledger instance.") +op getLedgerIdentity is Azure.Core.ResourceRead; diff --git a/packages/samples/specs/data-plane/confidentialledger/main.tsp b/packages/samples/specs/data-plane/confidentialledger/main.tsp new file mode 100644 index 0000000000..5de85c0d0a --- /dev/null +++ b/packages/samples/specs/data-plane/confidentialledger/main.tsp @@ -0,0 +1,2 @@ +import "./confidentialledger.tsp"; +import "./identityservice.tsp"; diff --git a/packages/samples/specs/data-plane/custom-error-type/main.tsp b/packages/samples/specs/data-plane/custom-error-type/main.tsp new file mode 100644 index 0000000000..3c0bcad7d9 --- /dev/null +++ b/packages/samples/specs/data-plane/custom-error-type/main.tsp @@ -0,0 +1,81 @@ +import "@typespec/http"; +import "@typespec/rest"; +import "@typespec/versioning"; +import "@azure-tools/typespec-azure-core"; + +using TypeSpec.Http; +using TypeSpec.Rest; +using TypeSpec.Versioning; +using Azure.Core; +using Azure.Core.Traits; + +@service({ + title: "Contoso Widget Manager", +}) +@versioned(Contoso.WidgetManager.Versions) +namespace Contoso.WidgetManager; + +@doc("The Contoso Widget Manager service version.") +enum Versions { + @doc("Version 2022-08-31") + @useDependency(Azure.Core.Versions.v1_0_Preview_1) + `2022-08-31`, +} + +// Models //////////////////// + +@doc("A widget.") +@resource("widgets") +model Widget { + @key("widgetName") + @doc("The widget name.") + @visibility("read") + name: string; + + @doc("The ID of the widget's manufacturer.") + manufacturerId: string; + + ...EtagProperty; +} + +@error +@doc("A custom error type for the Widget Manager service.") +model WidgetServiceErrorResponse { + @doc("The numeric error code.") + code: int32; + + @doc("The error message.") + errorMessage: string; +} + +// Operations //////////////////// + +alias ServiceTraits = SupportsRepeatableRequests & + SupportsConditionalRequests & + SupportsClientRequestId; + +alias Operations = Azure.Core.ResourceOperations; + +interface Widgets { + // Operation Status + @doc("Gets status of a Widget operation.") + getWidgetOperationStatus is Operations.GetResourceOperationStatus; + + // Widget Operations + @doc("Creates or updates a Widget asynchronously") + @pollingOperation(Widgets.getWidgetOperationStatus) + createOrUpdateWidget is Operations.LongRunningResourceCreateOrUpdate; + + @doc("Get a Widget") + getWidget is Operations.ResourceRead; + + @doc("Delete a Widget asynchronously.") + @pollingOperation(Widgets.getWidgetOperationStatus) + deleteWidget is Operations.LongRunningResourceDelete; + + @doc("List Widget resources") + listWidgets is Operations.ResourceList< + Widget, + ListQueryParametersTrait + >; +} diff --git a/packages/samples/specs/data-plane/formrecognizer/main.tsp b/packages/samples/specs/data-plane/formrecognizer/main.tsp new file mode 100644 index 0000000000..ee2e39457a --- /dev/null +++ b/packages/samples/specs/data-plane/formrecognizer/main.tsp @@ -0,0 +1,822 @@ +import "@typespec/http"; +import "@typespec/rest"; +import "@typespec/versioning"; +import "@azure-tools/typespec-azure-core"; + +using TypeSpec.Http; +using TypeSpec.Rest; +using TypeSpec.Versioning; +using Azure.Core; + +@useAuth(AadOauth2Auth<["https://cognitiveservices.azure.com/.default"]>) +@service({ + title: "Form Recognizer", + version: "2021-09-30-preview", +}) +@useDependency(Azure.Core.Versions.v1_0_Preview_1) +@doc("Extracts content, layout, and structured data from documents.") +namespace Azure.FormRecognizer; + +@tag("Management") +interface Management { + #suppress "@azure-tools/typespec-azure-core/use-standard-operations" "This is an existing service that cannot be changed." + @doc("Gets information about custom document models.") + @route("info") + getInfo is Azure.Core.Foundations.Operation<{}, GetInfoResponse>; +} + +alias ApiVersion = "2021-09-30-preview"; + +alias ServiceTraits = Azure.Core.Traits.NoRepeatableRequests & + Azure.Core.Traits.NoConditionalRequests & + Azure.Core.Traits.NoClientRequestId; + +alias ResourceOps = Azure.Core.ResourceOperations; + +alias AnalyzeContentType = + | "application/json" + | "application/octet-stream" + | "application/pdf" + | "image/jpeg" + | "image/png" + | "image/tiff" + | "image/bmp"; + +@doc("An Accepted response with an Operation-Location header.") +model AcceptedResponse { + @doc("The status code.") + @statusCode + statusCode: 202; + + @doc("Operation result URL.") + @header("Operation-Location") + operationLocation: string; +} + +@tag("Analysis") +interface Analysis { + #suppress "@azure-tools/typespec-azure-core/long-running-polling-operation-required" "This operation does not follow the standard long-running operation pattern." + #suppress "@azure-tools/typespec-azure-core/byos" "This operation does not follow the standard long-running operation pattern." + @action("analyze") + @doc("Runs a custom action on ModelSummary") + analyzeDocument is ResourceOps.ResourceAction< + ModelSummary, + { + @doc("The content type.") + @header + contentType: AnalyzeContentType; + + @doc("List of 1-based page numbers to analyze. Ex. \"1-3,5,7-9\"") + @query + pages: string; + + @doc("Locale hint for text recognition and document analysis. Value may contain only the language code (ex. \"en\", \"fr\") or BCP 47 language tag (ex. \"en-US\").") + @query + locale: string; + + @doc("The string index type.") + @query + stringIndexType: StringIndexType; + + @doc("The request body.") + @body + body: bytes; + }, + AcceptedResponse + >; + + @doc("Get a AnalyzeResultOperation") + getAnalyzeResult is ResourceOps.ResourceRead; +} + +@tag("Creation") +interface Creation { + #suppress "@azure-tools/typespec-azure-core/long-running-polling-operation-required" "This operation does not follow the standard long-running operation pattern." + @doc("Builds a custom document analysis model.") + // @action("build") + buildDocumentModel is ResourceOps.ResourceCollectionAction< + ModelSummary, + BuildDocumentModelRequest, + AcceptedResponse + >; + + #suppress "@azure-tools/typespec-azure-core/long-running-polling-operation-required" "This operation does not follow the standard long-running operation pattern." + @doc("Creates a new model from document types of existing models.") + // @action("compose") + composeDocumentModel is ResourceOps.ResourceCollectionAction< + ModelSummary, + ComposeDocumentModelRequest, + AcceptedResponse + >; + + @doc("Generates authorization to copy a model to this location with specified modelId and optional description.") + // @action("authorizeCopy") + authorizeCopyDocumentModel is ResourceOps.ResourceCollectionAction< + ModelSummary, + AuthorizeCopyRequest, + CopyAuthorization + >; + + #suppress "@azure-tools/typespec-azure-core/long-running-polling-operation-required" "This operation does not follow the standard long-running operation pattern." + @doc("Copies model to the target resource, region, and modelId.") + @action("copyTo") + copyDocumentModelTo is ResourceOps.ResourceAction< + ModelSummary, + CopyAuthorization, + AcceptedResponse + >; +} + +@tag("Operation") +interface Operations { + @doc("Lists all operations.") + @get + listOperations is ResourceOps.ResourceList; + + #suppress "@azure-tools/typespec-azure-core/use-standard-operations" "This is an existing service with a non-standard read operation." + @doc("Gets operation info.") + @get + getOperation is Azure.Core.Foundations.ResourceOperation; +} + +@tag("Management") +interface DocumentModels { + @doc("Get a ModelSummary") + getModel is ResourceOps.ResourceRead; + + @doc("List ModelSummary resources") + listModels is ResourceOps.ResourceList; + + @doc("Delete a ModelSummary") + deleteModel is ResourceOps.ResourceDelete; +} + +@doc("Method used to compute string offset and length.") +enum StringIndexType { + @doc("Text elements") + textElements, + + @doc("Unicode code points") + unicodeCodePoint, + + @doc("UTF-16 code units") + utf16CodeUnit, +} + +@doc("Unique model name") +@pattern("[a-zA-Z0-9][a-zA-Z0-9._~-]{1,63}") +scalar ModelId extends string; + +@doc("Model description.") +@maxLength(4096) +scalar ModelDescription extends string; + +@doc("The summary of a model.") +@resource("documentModels") +model ModelSummary { + @key + @doc("Unique model name") + @visibility("read") + modelId: ModelId; + + @doc("Model description.") + description: string; + + @doc("Date and time (UTC) when the model was created") + createdDateTime: utcDateTime; +} + +@doc("The details of an error.") +model Error { + @doc("The error code.") + code: string; + + @doc("The error message.") + message: string; + + @doc("The target of the error.") + target: string; + + @doc("Additional details about the error.") + details: Error[]; + + @doc("The inner error details.") + innerError: InnerError; +} + +@doc("The inner details of an error.") +model InnerError { + @doc("The error code.") + code: string; + + @doc("The error message.") + message: string; + + @doc("The error target.") + target: string; + + @projectedName("csharp", "InnerErrorObject") + @doc("The inner error details.") + innerError: InnerError; +} + +@doc("Document analysis parameters.") +model AnalyzeDocumentRequest { + @doc("Content at specified URL.") + urlSource: string; + + @doc("Content represented via Base64 encoding.") + base64Source: string; +} + +@doc("General information regarding the current resource.") +model GetInfoResponse { + @doc("Info regarding custom document models.") + customDocumentModels: CustomDocumentModelsInfo; +} + +@doc("Info regarding custom document models.") +model CustomDocumentModelsInfo { + @doc("Number of custom models in the current resource.") + count: int32; + + @doc("Maximum number of custom models supported in the current resource.") + limit: int32; +} + +@doc("Operation status.") +enum AnalyzeResultOperationStatus { + @doc("Operation has not started.") + notStarted, + + @doc("Operation is running.") + runnning, + + @doc("Operation has failed.") + failed, + + @doc("Operation has succeeded.") + succeeded, +} + +@resource("analyzeResults") +@parentResource(ModelSummary) +@doc("Status and result of the analyze operation.") +model AnalyzeResultOperation { + @key + @visibility("none") + @doc("The result ID.") + resultId: string; + + @doc("Operation status.") + status: AnalyzeResultOperationStatus; + + @doc("Date and time (UTC) when the analyze operation was submitted.") + createdDateTime: utcDateTime; + + @doc("Date and time (UTC) when the status was last updated.") + lastUpdatedDateTime: utcDateTime; + + @doc("Encountered error during document analysis.") + error: Error; + + @doc("Document analysis result.") + analyzeResult: AnalyzeResult; +} + +@doc("The result of an analysis job.") +model AnalyzeResult { + @doc("API version used to produce this result.") + apiVersion: ApiVersion; + + @doc("Model ID used to produce this result.") + modelId: ModelId; + + @doc("Method used to compute string offset and length.") + stringIndexType: StringIndexType; + + @doc("Concatenate string representation of all textual and visual elements in reading order.") + content: string; + + @doc("Analyzed pages.") + pages: DocumentPage[]; + + @doc("Extracted tables.") + tables: DocumentTable[]; + + @doc("Extracted key-value pairs.") + keyValuePairs: DocumentKeyValuePair[]; + + @doc("Extracted entities.") + entities: DocumentEntity[]; + + @doc("Extracted styles.") + styles: DocumentStyle[]; + + @doc("Extracted documents.") + documents: Document[]; +} + +@doc("Content and layout elements extracted from a page from the input.") +model DocumentPage { + @doc("1-based page number in the input document.") + @minValue(1) + pageNumber: int32; + + @doc("The general orientation of the content in clockwise direction, measured in degrees between (-180, 180].") + @minValue(-180) + @maxValue(180) + angle: int32; + + @doc("The width of the image/PDF in pixels/inches, respectively.") + @minValue(0) + width: int32; + + @doc("The height of the image/PDF in pixels/inches, respectively.") + @minValue(0) + height: int32; + + @doc("The unit used by the width, height, and boundingBox properties.") + unit: LengthUnit; + + @doc("Location of the page in the reading order concatenated content.") + spans: DocumentSpan[]; + + @doc("Extracted words from the page.") + words: DocumentWord[]; + + @doc("Extracted selection marks from the page.") + selectionMarks: DocumentSelectionMark[]; + + @doc("Extracted lines from the page, potentially containing both textual and visual elements.") + lines: DocumentLine[]; +} + +@doc("The unit used by the width, height, and boundingBox properties. For images, the unit is \"pixel\". For PDF, the unit is \"inch\".") +enum LengthUnit { + @doc("Unit is pixel.") + pixel, + + @doc("Unit is inch.") + inch, +} + +@doc("Contiguous region of the concatenated content property, specified as an offset and length.") +model DocumentSpan { + @doc("Zero-based index of the content represented by the span.") + @minValue(0) + offset: int32; + + @doc("Number of characters in the content represented by the span.") + @minValue(0) + length: int32; +} + +@doc("A word object consisting of a contiguous sequence of characters. For non-space delimited languages, such as Chinese, Japanese, and Korean, each character is represented as its own word.") +model DocumentWord { + @doc("Text content of the word.") + content: string; + + @doc("Bounding box of the word") + boundingBox?: BoundingBox; + + @doc("Location of the word in the reading order concatenated content.") + span: DocumentSpan; + + @doc("Confidence of correctly extracting the word.") + confidence: Confidence; +} + +// @doc( +// "Quadrangle bounding box, with coordinates specified relative to the top-left of the page. The eight numbers represent the four points, clockwise from the top-left corner relative to the text orientation." +// ) +// @maxLength(8) +// @minLength(8) +alias BoundingBox = float64[]; + +@doc("A selection mark object representing check boxes, radio buttons, and other elements indicating a selection.") +model DocumentSelectionMark { + @doc("State of the selection mark.") + state: SelectionMarkState; + + @doc("Bounding box of the selection mark.") + boundingBox?: BoundingBox; + + @doc("Location of the selection mark in the reading order concatenated content.") + span: DocumentSpan; + + @doc("Confidence of correctly extracting the selection mark.") + confidence: Confidence; +} + +@doc("Prediction confidence.") +@minValue(0) +@maxValue(1) +scalar Confidence extends float64; + +@doc("State of the selection mark.") +enum SelectionMarkState { + @doc("Selected.") + selected, + + @doc("Unselected.") + unselected, +} + +@doc("A table object consisting table cells arranged in a rectangular layout.") +model DocumentTable { + @doc("Number of rows in the table.") + rowCount: int32; + + @doc("Number of columns in the table.") + columnCount: int32; + + @doc("Cells contained within the table.") + cells: DocumentTableCell[]; + + @doc("Bounding regions covering the table.") + boundingRegions?: BoundingRegion[]; + + @doc("Location of the table in the reading order concatenated content.") + spans: DocumentSpan[]; +} + +@doc("An object representing the location and content of a table cell.") +model DocumentTableCell { + @doc("The kind of the DocumentTableCell.") + kind?: DocumentTableCellKind; + + @doc("Row index of the cell.") + rowIndex: int32; + + @doc("Column index of the cell.") + columnIndex: int32; + + @doc("Number of rows spanned by this cell.") + rowSpan?: int32; + + @doc("Number of columns spanned by this cell.") + columnSpan?: int32; + + @doc("Concatenated content of the table cell in reading order.") + content: string; + + @doc("Bounding regions covering the table cell.") + boundingRegions?: BoundingRegion[]; + + @doc("Location of the table cell in the reading order concatenated content.") + spans: DocumentSpan[]; +} + +@doc("Table cell kind.") +enum DocumentTableCellKind { + @doc("Content cell.") + content, + + @doc("Row header cell.") + rowHeader, + + @doc("Column header cell.") + columnHeader, + + @doc("Stub cell.") + stubHead, + + @doc("Blank cell.") + description, +} + +@doc("Bounding box on a specific page of the input.") +model BoundingRegion { + @doc("1-based page number of page containing the bounding region.") + @minValue(1) + pageNumber: int32; + + @doc("Bounding box on the page, or the entire page if not specified.") + boundingBox: BoundingBox; +} + +@doc("An object representing a form field with distinct field label (key) and field value (may be empty).") +model DocumentKeyValuePair { + @doc("Field label of the key-value pair.") + key: DocumentKeyValueElement; + + @doc("Field value of the key-value pair.") + value?: DocumentKeyValueElement; + + @doc("Confidence of correctly extracting the key-value pair.") + confidence: Confidence; +} + +@doc("An object representing the field key or value in a key-value pair.") +model DocumentKeyValueElement { + @doc("Concatenated content of the key-value element in reading order.") + content: string; + + @doc("Location of the key-value element in the reading order concatenated content.") + spans: DocumentSpan[]; + + @doc("Bounding regions covering the key-value element.") + boundingRegions?: BoundingRegion; +} + +@doc("An object representing various categories of entities.") +model DocumentEntity { + @doc("Entity type.") + category: string; + + @doc("Entity sub type.") + subCategory: string; + + @doc("Content content") + content: string; + + @doc("Bounding regions covering the entity.") + boundingRegions?: BoundingRegion; + + @doc("Location of the entity in the reading order concatenated content.") + spans: DocumentSpan[]; + + @doc("Confidence of correctly extracting the entity.") + confidence: Confidence; +} + +@doc("An object representing observed text styles.") +model DocumentStyle { + @doc("Location of the text elements in the concatenated content the style applies to.") + spans: DocumentSpan[]; + + @doc("Confidence of correctly identifying the style.") + confidence: Confidence; + + @doc("Is content handwritten?") + isHandwritten?: boolean; +} + +@doc("An object describing the location and semantic content of a document.") +model Document { + @doc("Document type") + docType: DocType; + + @doc("Location of the document in the reading order concatenated content.") + spans: DocumentSpan[]; + + @doc("Dictionary of named field values.") + fields: Record; + + @doc("Confidence of correctly extracting the document.") + confidence: Confidence; + + @doc("Bounding regions covering the document.") + boundingRegions?: BoundingRegion; +} + +@doc("Document type name.") +@minLength(2) +@maxLength(64) +scalar DocType extends string; + +@doc("An object representing the content and location of a field value.") +model DocumentField { + @doc("Location of the field in the reading order concatenated content.") + spans: DocumentSpan[]; + + @doc("Confidence of correctly extracting the field.") + confidence: Confidence; + + @doc("Data type of the field value.") + type: DocumentFieldType; + + @doc("String value.") + valueString?: string; + + @doc("Date value in YYYY-MM-DD format (ISO 8601).") + valueDate?: plainDate; + + @doc("Time value in hh:mm:ss format (ISO 8601).") + valueTime?: plainTime; + + @doc("Phone number value in E.164 format (ex. +19876543210).") + valuePhoneNumber?: string; + + @doc("Floating point value") + valueNumber?: float64; + + @doc("Integer value") + valueInteger?: int64; + + @doc("Selection mark value.") + valueSelectionMark?: SelectionMarkState; + + @doc("Presence of signature.") + valueSignature?: DocumentSignatureType; + + @doc("3-letter country code value (ISO 3166-1 alpha-3).") + valueCountryRegion?: string; + + @doc("Array of field values.") + valueArray?: DocumentField[]; + + @doc("Dictionary of named field values.") + valueObject?: Record; + + @doc("Field content.") + content?: string; + + @doc("Bounding regions covering the field.") + boundingRegions?: BoundingRegion[]; +} + +@doc("Semantic data type of the field value.") +enum DocumentFieldType { + @doc("String value.") + string, + + @doc("Date value") + date, + + @doc("Time value") + time, + + @doc("Phone number value") + phoneNumber, + + @doc("Floating point value") + number, + + @doc("Integer value") + integer, + + @doc("Selection mark value.") + selectionMark, + + @doc("Country code value.") + countryRegion, + + @doc("Signature value.") + signature, + + @doc("Array value.") + array, + + @doc("Object value.") + object, +} + +@doc("Presence of signature.") +enum DocumentSignatureType { + @doc("Document is signed.") + signed, + + @doc("Document is unsigned.") + unsigned, +} + +@doc("A content line object consisting of an adjacent sequence of content elements, such as words and selection marks.") +model DocumentLine { + @doc("Concatenated content of the contained elements in reading order.") + content: string; + + @doc("Location of the line in the reading order concatenated content.") + spans: DocumentSpan; + + @doc("Bounding box of the line.") + boundingBox?: BoundingBox; +} + +@doc("Request body to build a new custom model.") +model BuildDocumentModelRequest { + @doc("Model Id") + modelId: ModelId; + + @doc("Model description") + description?: ModelDescription; + + @doc("Azure Blob Storage location containing the training data.") + azureBlobSource?: AzureBlobContentSource; +} + +@doc("Azure Blob Storage content.") +model AzureBlobContentSource { + @doc("Azure Blob Storage container URL.") + containerUrl: string; + + @doc("Blob name prefix.") + prefix?: string; +} + +@doc("Request body to create a composed model from component models.") +model ComposeDocumentModelRequest { + @doc("Model Id") + modelId: ModelId; + + @doc("Model description") + description?: ModelDescription; + + @doc("List of component models to compose.") + componentModels: ComponentModelInfo[]; +} + +@doc("A component of a composed model.") +model ComponentModelInfo { + @doc("Model Id") + modelId: ModelId; +} + +@doc("Request body to authorize model copy.") +model AuthorizeCopyRequest { + @doc("Model Id") + modelId: ModelId; + + @doc("Model description") + description?: ModelDescription; +} + +@doc("Authorization to copy a model to the specified target resource and modelId.") +model CopyAuthorization { + @doc("ID of the target Azure resource where the model should be copied to.") + targetResourceId: string; + + @doc("Location of the target Azure resource where the model should be copied to.") + targetResourceRegion: string; + + @doc("Identifier of the target model.") + targetModelId: ModelId; + + @doc("URL of the copied model in the target account.") + targetModelLocation: string; + + @doc("Token used to authorize the request.") + accessToken: string; + + @doc("Date/time when the access token expires.") + expirationDateTime: utcDateTime; +} + +@resource("operations") +@doc("Operation info.") +model OperationInfo { + @key + @doc("Operation ID") + @visibility("read") + operationId: string; + + @doc("Operation status.") + status: OperationStatus; + + @doc("Operation progress (0-100).") + @minValue(0) + @maxValue(100) + percentCompleted: int32; + + @doc("Date and time (UTC) when the operation was created.") + createdDateTime: utcDateTime; + + @doc("Date and time (UTC) when the status was last updated.") + lastUpdatedDateTime: utcDateTime; + + @doc("Type of operation") + kind: OperationKind; + + @doc("URL of the resource targeted by this operation.") + resourceLocation: string; +} + +@doc("Operation status.") +enum OperationStatus { + @doc("Operation has not started yet.") + notStarted, + + @doc("Operation is running.") + running, + + @doc("Operation failed.") + failed, + + @doc("Operation succeeded.") + succeeded, + + @doc("Operation was canceled.") + canceled, +} + +@doc("Type of operation") +enum OperationKind { + @doc("Operation to build a new custom model.") + documentModelBuild, + + @doc("Operation to compose a new custom model.") + documentModelCompose, + + @doc("Operation to copy a custom model.") + documentModelCopyTo, +} + +@doc("The response for the getOperation operation.") +model GetOperationResponse extends OperationInfo { + @doc("Encountered error.") + error?: Error; + + @doc("Operation result upon success.") + result: {}; +} diff --git a/packages/samples/specs/data-plane/language/authoring/authoring.tsp b/packages/samples/specs/data-plane/language/authoring/authoring.tsp new file mode 100644 index 0000000000..6213c4a2bf --- /dev/null +++ b/packages/samples/specs/data-plane/language/authoring/authoring.tsp @@ -0,0 +1,365 @@ +import "@typespec/http"; +import "@typespec/rest"; +import "@typespec/versioning"; +import "@azure-tools/typespec-azure-core"; + +using TypeSpec.Http; +using TypeSpec.Rest; +using TypeSpec.Versioning; +using Azure.Core; +using Azure.Core.Traits; + +@useAuth(AzureApiKeyAuthentication) +@server( + "{Endpoint}/language", + "Language Service", + { + Endpoint: Endpoint, + } +) +@service({ + title: "Microsoft Cognitive Language Service - Analyze Text Authoring", + version: "202ß2-05-15-preview", +}) +@useDependency(Azure.Core.Versions.v1_0_Preview_2) +@route("/authoring/analyze-text/") +namespace Azure.Language.Authoring; + +alias ServiceTraits = NoRepeatableRequests & NoConditionalRequests & NoClientRequestId; + +alias Operations = Azure.Core.ResourceOperations; + +// Common Parameters + +// TODO: Use the common parameter for this +@doc("The endpoint to use.") +scalar Endpoint extends string; + +// Models + +@doc("The details of a project.") +model Project { + @key + @segment("projects") + @doc("The project name.") + @visibility("read") + projectName: string; + + @doc("The project kind.") + projectKind: ProjectKind; + + @doc("The storage container name.") + storageInputContainerName: string; + + @doc("The project settings.") + settings?: ProjectSettings; + + @doc("Whether the project would be used for multiple languages or not.") + multilingual?: boolean; + + @doc("The project description.") + description?: string; + + @doc("The project language. This is BCP-47 representation of a language. For example, use \"en\" for English, \"en-gb\" for English (UK), \"es\" for Spanish etc.") + language: string; + + @doc("Represents the project creation datetime.") + @visibility("read") + createdDateTime: utcDateTime; + + @doc("Represents the project last modification datetime.") + @visibility("read") + lastModifiedDateTime: utcDateTime; + + @doc("Represents the project last training datetime.") + @visibility("read") + lastTrainedDateTime: utcDateTime; + + @doc("Represents the project last deployment datetime.") + @visibility("read") + lastDeployedDateTime: utcDateTime; +} + +@doc("Represents the project kind.") +enum ProjectKind { + @doc("For building a classification model to classify text using your own data. Each file will have only one label. For example, file 1 is classified as A and file 2 is classified as B.") + CustomSingleLabelClassification, + + @doc("For building a classification model to classify text using your own data. Each file can have one or many labels. For example, file 1 is classified as A, B, and C and file 2 is classified as B and C.") + CustomMultiLabelClassification, + + @doc("For building an extraction model to identify your domain categories using your own data.") + CustomEntityRecognition, +} + +@doc("Represents the settings used to define the project behavior.") +model ProjectSettings is Record; + +@doc("The details of a project deployment.") +@parentResource(Project) +model Deployment { + @doc("The name of the deployment.") + @key("deploymentName") + @segment("deployments") + @visibility("read") + name: string; +} + +@doc("The details about a job.") +model Job { + @doc("The job ID.") + jobId: string; + + @doc("The creation date time of the job.") + @visibility("read") + createdDateTime: utcDateTime; + + @doc("The the last date time the job was updated.") + @visibility("read") + lastUpdatedDateTime: utcDateTime; + + @doc("The expiration date time of the job.") + @visibility("read") + expirationDateTime: utcDateTime; + + @doc("The job status.") + status: JobStatus; + + @doc("The warnings that were encountered while executing the job.") + warnings: JobWarning[]; + + @doc("The errors encountered while executing the job.") + errors: Azure.Core.Foundations.Error; +} + +@doc("Represents the job status.") +enum JobStatus { + @doc("The job has not started yet.") + notStarted, + + @doc("The job is running.") + running, + + @doc("The job has completed successfully.") + succeeded, + + @doc("The job has failed.") + failed, + + @doc("The job has been cancelled.") + cancelled, + + @doc("The job is cancelling.") + cancelling, + + @doc("The job is partially completed.") + partiallyCompleted, +} + +@doc("Represents a warning that was encountered while executing the request.") +model JobWarning { + @doc("The warning code.") + code: string; + + @doc("The warning message.") + message: string; +} + +@doc("The details of a deployment job.") +@parentResource(Deployment) +model DeploymentJob { + ...Job; + + @doc("The job ID.") + @key("jobId") + @segment("jobs") + @visibility("read") + id: string; +} + +@doc("The details of a swap deployments job.") +@parentResource(Deployment) +model SwapDeploymentsJob { + ...Job; + + @doc("The job ID.") + @key("jobId") + @visibility("read") + @segment("swap/jobs") + id: string; +} + +@doc("The details of an exported project.") +model ExportedProject {} + +@doc("Represents a supported language.") +model SupportedLanguage { + @doc("The language name.") + languageName: string; + + @doc("The language code. This is BCP-47 representation of a language. For example, \"en\" for English, \"en-gb\" for English (UK), \"es\" for Spanish etc.") + languageCode: string; +} + +@doc("A collection of SupportedLanguage resources.") +model SupportedLanguages is Azure.Core.Page; + +@doc("Represents a training config version.") +model TrainingConfigVersion { + @projectedName("csharp", "version") + @doc("Represents the version of the config.") + trainingConfigVersion: string; + + @doc("Represents the training config version expiration date.") + modelExpirationDate: plainDate; +} + +@doc("A collection of TrainingConfigVersion resources.") +model TrainingConfigVersions is Azure.Core.Page; + +// Operations + +@doc("Export parameters.") +model ExportParams { + @query + @doc("The project file version.") + projectFileVersion: string; +} + +@doc("Training job parameters.") +model TrainingJobOptions { + @doc("The model label.") + modelLabel: string; +} + +@doc("Swap deployment options.") +model SwapDeploymentsOptions { + @doc("Represents the first deployment name.") + firstDeploymentName: string; + + @doc("Represents the second deployment name.") + secondDeploymentName: string; +} + +@doc("Swap deployment parameters.") +model SwapDeploymentsParams { + @doc("The body schema of the operation.") + @body + body: SwapDeploymentsOptions; +} + +interface Projects { + #suppress "@azure-tools/typespec-azure-core/long-running-polling-operation-required" "This operation does not follow the standard long-running operation pattern." + @doc("Creates a new project or updates an existing one.") + createOrUpdate is Operations.LongRunningResourceCreateOrUpdate; + + @doc("Gets the details of a project.") + get is Operations.ResourceRead; + + #suppress "@azure-tools/typespec-azure-core/long-running-polling-operation-required" "This operation does not follow the standard long-running operation pattern." + @doc("Deletes a project.") + delete is Operations.LongRunningResourceDelete; + + @doc("Lists the existing projects.") + list is Operations.ResourceList>; + + #suppress "@azure-tools/typespec-azure-core/long-running-polling-operation-required" "This operation does not follow the standard long-running operation pattern." + @doc("Triggers a job to export a project's data.") + export is Operations.ResourceAction< + Project, + ExportParams, + TypeSpec.Http.AcceptedResponse & Foundations.LongRunningStatusLocation + >; + + #suppress "@azure-tools/typespec-azure-core/long-running-polling-operation-required" "This operation does not follow the standard long-running operation pattern." + // NOTE: `import` is a reserved keyword + @doc("Triggers a job to export a project's data.") + importx is Operations.ResourceAction< + Project, + ExportedProject, + TypeSpec.Http.AcceptedResponse & Foundations.LongRunningStatusLocation + >; + + #suppress "@azure-tools/typespec-azure-core/long-running-polling-operation-required" "This operation does not follow the standard long-running operation pattern." + @doc("Triggers a training job for a project.") + train is Operations.ResourceAction< + Project, + { + @doc("The body of the request.") + @body + body: TrainingJobOptions; + }, + TypeSpec.Http.AcceptedResponse & Foundations.LongRunningStatusLocation + >; +} + +interface Deployments { + @doc("Gets the details of a deployment.") + getDeployment is Operations.ResourceRead; + + #suppress "@azure-tools/typespec-azure-core/use-standard-names" "This operation does not follow the standard naming pattern." + #suppress "@azure-tools/typespec-azure-core/long-running-polling-operation-required" "This operation does not follow the standard long-running operation pattern." + @doc("Creates a new deployment or replaces an existing one.") + deployProject is Operations.LongRunningResourceCreateOrReplace; + + #suppress "@azure-tools/typespec-azure-core/long-running-polling-operation-required" "This operation does not follow the standard long-running operation pattern." + @doc("Deletes a project deployment.") + deleteDeployment is Operations.LongRunningResourceDelete; + + @doc("Lists the existing deployments.") + list is Operations.ResourceList; + + #suppress "@azure-tools/typespec-azure-core/long-running-polling-operation-required" "This operation does not follow the standard long-running operation pattern." + @doc("Swaps two existing deployments with each other.") + @collectionAction(Deployment, "swap") + swapDeployments is Operations.ResourceCollectionAction< + Deployment, + SwapDeploymentsParams, + Azure.Core.Foundations.AcceptedResponse & Foundations.LongRunningStatusLocation + >; +} + +interface Jobs { + @doc("Gets the status of an existing deployment job.") + getDeploymentStatus is Operations.ResourceRead; + + @doc("Gets the status of an existing swap deployment job.") + getSwapDeploymentsStatus is Operations.ResourceRead; +} + +@route("projects/global/") +interface Global { + #suppress "@azure-tools/typespec-azure-core/use-standard-operations" "This is an existing service that cannot be changed." + @get + @route("languages") + @doc("Gets the supported languages.") + listSupportedLanguages is Foundations.Operation; + + #suppress "@azure-tools/typespec-azure-core/use-standard-operations" "This is an existing service that cannot be changed." + @get + @doc("Lists training configuration versions.") + @route("training-config-versions") + listTrainingConfigVersions is Foundations.Operation< + StandardListQueryParameters, + TrainingConfigVersions + >; +} + +// Missing operations + +// "/authoring/analyze-text/projects/{projectName}/models": { +// "/authoring/analyze-text/projects/{projectName}/models/{trainedModelLabel}": { +// "/authoring/analyze-text/projects/{projectName}/models/{trainedModelLabel}/evaluation/result": { +// "/authoring/analyze-text/projects/{projectName}/models/{trainedModelLabel}/evaluation/summary-result": { + +// Special endpoints + +// "/authoring/analyze-text/projects/{projectName}/export/jobs/{jobId}": { +// "/authoring/analyze-text/projects/{projectName}/import/jobs/{jobId}": { +// "/authoring/analyze-text/projects/{projectName}/train/jobs": { +// "/authoring/analyze-text/projects/{projectName}/train/jobs/{jobId}": { +// "/authoring/analyze-text/projects/{projectName}/train/jobs/{jobId}/:cancel": { + +// Under global + +// "/authoring/analyze-text/projects/global/deletion-jobs/{jobId}": { diff --git a/packages/samples/specs/data-plane/language/authoring/main.tsp b/packages/samples/specs/data-plane/language/authoring/main.tsp new file mode 100644 index 0000000000..e153aae1f0 --- /dev/null +++ b/packages/samples/specs/data-plane/language/authoring/main.tsp @@ -0,0 +1 @@ +import "./authoring.tsp"; diff --git a/packages/samples/specs/data-plane/languageqna/Interface/common.tsp b/packages/samples/specs/data-plane/languageqna/Interface/common.tsp new file mode 100644 index 0000000000..330b1ac882 --- /dev/null +++ b/packages/samples/specs/data-plane/languageqna/Interface/common.tsp @@ -0,0 +1,130 @@ +import "@typespec/http"; +import "@typespec/rest"; +import "@typespec/openapi"; + +using TypeSpec.Http; +using TypeSpec.OpenAPI; + +@doc("Language of the text records. This is BCP-47 representation of a language. For example, use \"en\" for English; \"es\" for Spanish etc. If not set, use \"en\" for English as default.") +scalar Language extends string; + +@error +model ODataError { + message: string; +} + +@doc("Error response") +@error +model ErrorResponse { + @doc("The error object") + error: Error; +} + +@doc("The error object") +model Error { + @doc("One of a server-defined set of error codes") + code: ErrorCode; + + @doc("A human-readable representation of the error") + message: string; + + @doc("Error target") + target?: string; +} + +@doc("Collection of error types") +model Errors { + errors: Error[]; +} + +enum ErrorCode { + InvalidRequest, + InvalidArgument, + Unauthorized, + Forbidden, + NotFound, + ProjectNotFound, + OperationNotFound, + AzureCognitiveSearchNotFound, + AzureCognitiveSearchIndexNotFound, + TooManyRequests, + AzureCognitiveSearchThrottling, + AzureCognitiveSearchIndexLimitReached, + InternalServerError, + ServiceUnavailable, +} + +model ApiVersionParameter { + @doc("Client API version") + @query("api-version") + apiVersion: string; +} + +model ProjectNamePathParameter { + @extension("x-ms-parameter-location", "method") + @doc("The name of the project to use") + @maxLength(100) + @path + projectName: string; +} + +model JobIdParameter { + @extension("x-ms-parameter-location", "method") + @doc("Job ID") + @path + jobId: string; +} + +model TopParameter { + @extension("x-ms-parameter-location", "method") + @doc("The maximum number of resources to return from the collection") + @query + top?: int32; +} + +model SkipParameter { + @extension("x-ms-parameter-location", "method") + @doc("An offset into the collection of the first resource to be returned") + @query + skip?: int32; +} + +model MaxPageSizeParameter { + @extension("x-ms-parameter-location", "method") + @doc("The maximum number of resources to include in a single response") + @query + mazpagesize?: int32; +} + +alias ListParameters = TopParameter & SkipParameter & MaxPageSizeParameter; + +model ImportExportFormatParameter { + @extension("x-ms-parameter-location", "method") + @doc("Knowledge base Import or Export format") + @query + format?: ImportExportFormat; +} + +model AssetKindParameter { + @extension("x-ms-parameter-location", "method") + @doc("Kind of the asset of the project") + @query + assetKind?: "qnas" | "synonyms"; +} + +alias LROResponse = (AcceptedResponse & { + @header("Operation-Location") operationLocation: string; +}) | ErrorResponse; + +// Common models + +enum ImportExportFormat { + @doc("Export or Import QnA assets in JSON format") + json, + + @doc("Export or Import knowledge base replica including all assets and metadata in Excel format.") + tsv, + + @doc("Export or Import knowledge base replica including all assets and metadata in Tsv format.") + excel, +} diff --git a/packages/samples/specs/data-plane/languageqna/Interface/main.tsp b/packages/samples/specs/data-plane/languageqna/Interface/main.tsp new file mode 100644 index 0000000000..866f32674a --- /dev/null +++ b/packages/samples/specs/data-plane/languageqna/Interface/main.tsp @@ -0,0 +1,80 @@ +import "@typespec/http"; +import "@typespec/rest"; + +import "./questionanswering-authoring_models.tsp"; + +@useAuth( + ApiKeyAuth | OAuth2Auth<[ + { + type: OAuth2FlowType.implicit, + authorizationUrl: "https://login.contoso.com/common/oauth2/v2.0/authorize", + scopes: ["https://cognitiveservices.azure.com/.default"], + } + ]> +) +@service({ + title: "Hello world", + version: "0.1.0", +}) +namespace Azure.Language.QnA; //@route("") // TODO + +using TypeSpec.Http; +using TypeSpec.Rest; +using TypeSpec.Rest.Resource; +using TypeSpec.OpenAPI; + +@doc("") +@route("/projects/{projectName}") +namespace Hello { + @post + op CreateExport(...ProjectNamePathParameter): JobState; +} + +interface Projects + extends ResourceList, + ResourceRead, + ResourceDelete, + ResourceUpdate { + @extension("x-ms-long-running-operation", true) + @post + CreateExport( + ...ResourceParameters, + ...AssetKindParameter, + ): Body<""> | ODataError; // TODO: capture LRO status + + @route("feedback") + @post + feedback( + ...ResourceParameters, + @body feedback: ActiveLearningFeedback, + ): ActiveLearningFeedback | ODataError; +} + +// TODO: Switch to CreateOrUpdate +interface Deployments + extends ResourceCreate, + ResourceList { + // TODO extension resource for multi-parents + @get + @route("{projectName}/jobs/{jobId}") + GetJob(...ResourceParameters, ...JobIdParameter): JobState | ODataError; +} + +interface Synonyms + extends ResourceCreate, + ResourceList {} + +interface Sources + extends ResourceUpdate, + ResourceList { + // TODO: Singlton Resource not represented correctly + @get + @route("{projectName}/sources/jobs/{jobId}") + GetJob(...ResourceParameters, ...JobIdParameter): JobState | ODataError; +} + +interface Qnas extends ResourceCreate, ResourceList { + @get + @route("{projectName}/qnas/jobs/{jobId}") + GetJob(...ResourceParameters, ...JobIdParameter): JobState | ODataError; +} diff --git a/packages/samples/specs/data-plane/languageqna/Interface/questionanswering-authoring_models.tsp b/packages/samples/specs/data-plane/languageqna/Interface/questionanswering-authoring_models.tsp new file mode 100644 index 0000000000..5d8184a7c0 --- /dev/null +++ b/packages/samples/specs/data-plane/languageqna/Interface/questionanswering-authoring_models.tsp @@ -0,0 +1,233 @@ +import "./common.tsp"; + +using TypeSpec.Rest; +using TypeSpec.Rest.Resource; + +model ActiveLearningFeedback { + @doc("A list of Feedback Records for Active Learning.") + records?: FeedbackRecord[]; +} + +model FeedbackRecord { + @doc("Unique identifier of the user.") + userId?: string; + + @doc("User suggested question for the QnA.") + userQuestion?: string; + + @doc("Unique ID of the QnA.") + qnaId?: int32; +} + +model ProjectMetadata { + @doc("Name of the project.") + @key + @segment("projects") + projectName: string; + + @doc("Description of the project.") + description?: string; + + language?: Language; + + @doc("Resource enabled for multiple languages across projects or not.") + multilingualResource?: boolean; + + settings?: ProjectSettings; + + @doc("Project creation date-time.") + createdDateTime?: string; + + @doc("Represents the project last modified date-time.") + lastModifiedDateTime?: string; + + @doc("Represents the project last deployment date-time.") + lastDeployedDateTime?: string; +} + +model ProjectSettings { + @doc("Default Answer response when no good match is found in the knowledge base.") + defaultAnswer?: string; +} + +@parentResource(ProjectMetadata) +model ProjectDeployment { + @doc("Name of the deployment.") + @key + @segment("deployments") + deploymentName: string; + + @doc("Represents the project last deployment date-time.") + lastDeployedDateTime?: string; +} + +alias stringArray = string[]; + +model SynonymAsset is WordAlterations; + +@parentResource(ProjectMetadata) +model WordAlterations { + @doc("Collection of word alterations.") + @segment("synonym") + @key + alterations: string[]; +} + +@doc("Source to be updated.") +model UpdateSourceRecord { + updateOperation: UpdateOperationKind; + newValue: UpdateQnaSourceRecord; +} + +@doc("Update source record.") +model UpdateQnaSourceRecord { + ...QnaSourceMetadata; + + @doc("Boolean flag used to refresh data from the Source.") + refreshSourceOptions: boolean; +} + +@doc("Custom source record with last updated date-time.") +@parentResource(ProjectMetadata) +model QnaSourceRecord { + ...QnaSourceMetadata; + ...LastUpdatedDateTime; +} + +@doc("Input source file or url details.") +model QnaSourceMetadata { + @doc("Friendly name of the Source.") + displayName?: string; + + @doc("Unique source identifier. Name of the file if it's a 'file' source; otherwise, the complete URL if it's a 'url' source.") + @segment("sources") + @key + source: string; + + @doc("URI location for the file or url.") + sourceUri: string; + + sourceKind: QnaSourceKind; + contentStructureKind: SourceContentStructureKind; +} + +@doc("Supported source types.") +enum QnaSourceKind { + file, + url, +} + +@doc("Content structure type for sources.") +enum SourceContentStructureKind { + unstructured, +} + +@doc("Last updated date-time parameter.") +model LastUpdatedDateTime { + @doc("Date-time when the QnA was last updated.") + lastUpdatedDateTime: utcDateTime; +} + +@doc("Represents the job metadata.") // TODO extension resource +model JobMetaData { + jobId: string; + createdDateTime: utcDateTime; + lastUpdatedDateTime: utcDateTime; + expirationDateTime?: utcDateTime; + status: JobStatus; +} + +@doc("Job state represents the job metadata and any errors.") +model JobState { + ...JobMetaData; + + @doc("Collection of Error types.") + errors: Error[]; +} + +@doc("Job status.") +enum JobStatus { + notStarted, + running, + succeeded, + failed, + cancelled, + cancelling, + partiallyCompleted, +} + +enum UpdateOperationKind { + add, + delete, + replace, +} + +model UpdateQnaRecord { + updateOperation: UpdateOperationKind; + value: QnaRecord; +} + +@parentResource(ProjectMetadata) +model QnaRecord { + @segment("qnas") + @key + id: int32; + + answer: string; + source: string; + questions: string[]; + metadata: string; + dialog: QnaDialog; + activeLearningSuggestions: SuggestedQuestionsCluster; +} + +model QnaDialog { + isContextOnly: boolean; + prompts: QnaPrompt[]; +} + +model QnaPrompt { + displayOrder: int16; + qnaId: int32; + qna: QnaRecord; + displayText: string; +} + +model SuggestedQuestionsCluster { + clusterHead: string; + suggestedQuestions: SuggestedQuestion; +} + +model SuggestedQuestion { + question: string; + userSuggestedCount: int32; + autoSuggestedCount: int32; +} + +model ImportJobOptions { + metadata: CreateProjectOptions; + assets: Asset[]; + fileUri: string; +} + +model Asset { + synonyms?: SynonymAsset; + qnas?: ImportQnaAsset; +} + +model CreateProjectOptions { + description?: string; + language: Language; + multilingualResource: boolean; + settings: ProjectSettings[]; +} + +alias ImportQnaAsset = ImportQnaRecord; +model ImportQnaRecord { + ...RetrieveQnaRecord; + ...SourceDisplayNameParameter; +} + +model RetrieveQnaRecord {} + +model SourceDisplayNameParameter {} diff --git a/packages/samples/specs/data-plane/languageqna/Raw/common.tsp b/packages/samples/specs/data-plane/languageqna/Raw/common.tsp new file mode 100644 index 0000000000..20b4b07619 --- /dev/null +++ b/packages/samples/specs/data-plane/languageqna/Raw/common.tsp @@ -0,0 +1,102 @@ +import "@typespec/http"; +import "@typespec/rest"; +import "@typespec/openapi"; + +using TypeSpec.Http; +using TypeSpec.OpenAPI; + +// namespace Azure.QnAMaker.Common; + +@doc("The set of possible error codes.") +enum ErrorCode { + @doc("Invalid request") + InvalidRequest, + + @doc("Invalid argument") + InvalidArgument, + + @doc("Unauthorized") + Unauthorized, + + @doc("Forbidden") + Forbidden, + + @doc("Not found") + NotFound, + + @doc("Project not found") + ProjectNotFound, + + @doc("Operation not found") + OperationNotFound, + + @doc("Azure Cognitive Search not found") + AzureCognitiveSearchNotFound, + + @doc("Azure Cognitive Search index not found") + AzureCognitiveSearchIndexNotFound, + + @doc("Too many requests") + TooManyRequests, + + @doc("Azure Cognitive Search throttling") + AzureCognitiveSearchThrottling, + + @doc("Azure Cognitive Search index limit reached") + AzureCognitiveSearchIndexLimitReached, + + @doc("Internal server error") + InternalServerError, + + @doc("Service unavailable") + ServiceUnavailable, +} + +@doc("The projectName parameter definition.") +model ProjectNamePathParameter { + @path + @doc("The name of the project") + @maxLength(100) + projectName: string; +} + +@doc("The jobId parameter definition.") +model JobIdParameter { + @extension("x-ms-parameter-location", "method") + @doc("Job ID") + @path + jobId: string; +} + +@doc("The format parameter definition.") +model ImportExportFormatParameter { + @doc("Knowledge base Import or Export format") + @query + format?: ImportExportFormat; +} + +@doc("The assetKind parameter definition.") +model AssetKindParameter { + @doc("Kind of the asset of the project") + @query + assetKind?: "qnas" | "synonyms"; +} + +@doc("The language property definition.") +model Language { + @projectedName("csharp", "LanguageCode") + @doc("Language of the text records. This is BCP-47 representation of a language. For example, use \"en\" for English; \"es\" for Spanish etc. If not set, use \"en\" for English as default.") + language?: string; +} + +@doc("The format of an import or export operation.") +enum ImportExportFormat { + @doc("Export or Import QnA assets in JSON format") + json, + + @doc("Export or Import knowledge base replica including all assets and metadata in Excel format.") + tsv, + + @doc("Export or Import knowledge base replica including all assets and metadata in Tsv format.") + excel, +} diff --git a/packages/samples/specs/data-plane/languageqna/Raw/main.tsp b/packages/samples/specs/data-plane/languageqna/Raw/main.tsp new file mode 100644 index 0000000000..d16b30280b --- /dev/null +++ b/packages/samples/specs/data-plane/languageqna/Raw/main.tsp @@ -0,0 +1,521 @@ +import "@typespec/http"; +import "@typespec/rest"; +import "@typespec/versioning"; +import "@azure-tools/typespec-azure-core"; +import "@azure-tools/typespec-autorest"; +import "./common.tsp"; + +using TypeSpec.Http; +using TypeSpec.Rest; +using TypeSpec.Versioning; +using Azure.Core; +using Azure.Core.Traits; +using Autorest; +using TypeSpec.OpenAPI; +// using Azure.QnAMaker.Common; + +#suppress "@azure-tools/typespec-azure-core/casing-style" "This is an existing service." +@useAuth( + ApiKeyAuth | OAuth2Auth<[ + { + type: OAuth2FlowType.implicit, + authorizationUrl: "https://login.contoso.com/common/oauth2/v2.0/authorize", + scopes: ["https://cognitiveservices.azure.com/.default"], + } + ]> +) +@service({ + title: "Microsoft Cognitive Language Service - Question Answering - Authoring", + version: "21-10-01", +}) +@useDependency(Azure.Core.Versions.v1_0_Preview_2) +namespace Azure.QnAMaker; + +alias ServiceTraits = NoRepeatableRequests & NoConditionalRequests & NoClientRequestId; + +alias Operations = Azure.Core.ResourceOperations; + +@doc("The API key header definition.") +model ApiKey { + @doc("Service connection key") + @header("Ocp-Apim-Subscription-Key") + ocpApimSubscriptionKey: string; +} + +@doc("Collection of error types") +model Errors { + @projectedName("csharp", "ErrorItems") + @doc("The error list.") + errors: Azure.Core.Foundations.Error[]; +} + +@useDependency(Azure.Core.Versions.v1_0_Preview_2) +@route("/query-knowledgebases") +namespace QuestionAnsweringProjects { + @doc("Gets all projects for a user") + op listProjects is Operations.ResourceList< + ProjectMetadata, + ListQueryParametersTrait + >; + + @doc("Get the requested project metadata") + op getProjectDetails is Operations.ResourceRead; + + @doc("Create or update a project") + op createProject is Operations.ResourceCreateOrUpdate; + + #suppress "@azure-tools/typespec-azure-core/long-running-polling-operation-required" "This operation does not follow the standard long-running operation pattern." + @doc("Delete the project") + op deleteProject is Operations.LongRunningResourceDelete; + + @doc("Gets the status of a Project delete job") + op getDeleteStatus is Operations.ResourceRead; + + #suppress "@azure-tools/typespec-azure-core/long-running-polling-operation-required" "This operation does not follow the standard long-running operation pattern." + @doc("Export project metadata and assets") + @extension("x-ms-long-running-operation", true) + @action("export") + @actionSeparator("/:") + op export is Operations.ResourceAction< + ProjectMetadata, + ImportExportFormatParameter & AssetKindParameter, + AcceptedResponse & Azure.Core.Foundations.LongRunningStatusLocation + >; + + @doc("Gets the status of an Export job, once job completes, returns the project metadata, and assets") + op getExportStatus is Operations.ResourceRead; + + #suppress "@azure-tools/typespec-azure-core/long-running-polling-operation-required" "This operation does not follow the standard long-running operation pattern." + @doc("Import project assets") + @extension("x-ms-long-running-operation", true) + @action("import") + @actionSeparator("/:") + op `import` is Operations.ResourceAction< + ProjectMetadata, + ImportExportFormatParameter & AssetKindParameter, + AcceptedResponse & Azure.Core.Foundations.LongRunningStatusLocation + >; + + @doc("Gets the status of an Import job") + op getImportStatus is Operations.ResourceRead; + + #suppress "@azure-tools/typespec-azure-core/use-standard-operations" "This is an existing service that cannot be changed." + #suppress "@azure-tools/typespec-azure-core/long-running-polling-operation-required" "This operation does not follow the standard long-running operation pattern." + @doc("Deploy project to production.") + @put + op createDeployment is Azure.Core.Foundations.ResourceOperation< + ProjectDeployment, + {}, + AcceptedResponse & Azure.Core.Foundations.LongRunningStatusLocation + >; + + @doc("List all deployments of a project.") + op listDeployments is Operations.ResourceList; + + @doc("Gets the status of a Deploy job.") + @get + op getDeploymentsJobStatus is Operations.ResourceRead; + + #suppress "@azure-tools/typespec-azure-core/use-standard-operations" "This is an existing service that cannot be changed." + @doc("List all the synonyms of a project.") + @get + @route("projects/{projectName}/deployments/synonyms") + op listSynonyms is Azure.Core.Foundations.Operation< + { + ...ProjectNamePathParameter; + ...StandardListQueryParameters; + }, + Azure.Core.Page + >; + + #suppress "@azure-tools/typespec-azure-core/request-body-problem" "This is an existing service that cannot be changed." + #suppress "@azure-tools/typespec-azure-core/use-standard-operations" "This is an existing service that cannot be changed." + @doc("Create or update all the synonyms of a project.") + @put + @route("projects/{projectName}/deployments/synonyms") + op replaceSynonyms is Azure.Core.Foundations.Operation< + { + ...ProjectNamePathParameter; + + @doc("The request body.") + @body + body: SynonymAsset[]; + }, + Azure.Core.Page + >; + + #suppress "@azure-tools/typespec-azure-core/use-standard-operations" "This is an existing service that cannot be changed." + @doc("List all the sources of a project.") + @get + @route("projects/{projectName}/sources") + op listSources is Azure.Core.Foundations.Operation< + { + ...ProjectNamePathParameter; + ...StandardListQueryParameters; + }, + Azure.Core.Page + >; + + #suppress "@azure-tools/typespec-azure-core/use-standard-operations" "This is an existing service that cannot be changed." + @doc("Updates the sources of a project.") + @patch + @route("projects/{projectName}/sources") + op updateSources is Azure.Core.Foundations.Operation< + { + ...ProjectNamePathParameter; + + @doc("The request body.") + @body + body: UpdateRecord; + }, + Azure.Core.Page + >; + + #suppress "@azure-tools/typespec-azure-core/use-standard-operations" "This is an existing service that cannot be changed." + @doc("Gets the status of update sources job.") + @get + @route("projects/{projectName}/sources/jobs/{jobId}") + op getSourcesJobStatus is Azure.Core.Foundations.Operation< + { + ...ProjectNamePathParameter; + ...JobIdParameter; + }, + JobMetadata + >; + + #suppress "@azure-tools/typespec-azure-core/use-standard-operations" "This is an existing service that cannot be changed." + @doc("List all the sources of a project.") + @get + @route("projects/{projectName}/qnas") + op listQuestionAndAnswers is Azure.Core.Foundations.Operation< + { + ...ProjectNamePathParameter; + ...StandardListQueryParameters; + }, + Azure.Core.Page + >; + + #suppress "@azure-tools/typespec-azure-core/use-standard-operations" "This is an existing service that cannot be changed." + @doc("Updates the sources of a project.") + @patch + @route("projects/{projectName}/qnas") + op updateQuestionAndAnswers is Azure.Core.Foundations.Operation< + { + ...ProjectNamePathParameter; + + @doc("The request body.") + @body + body: UpdateRecord; + }, + Azure.Core.Page + >; + + #suppress "@azure-tools/typespec-azure-core/use-standard-operations" "This is an existing service that cannot be changed." + @doc("Gets the status of update sources job.") + @get + @route("projects/{projectName}/qnas/jobs/{jobId}") + op getQuestionAndAnswersJobStatus is Azure.Core.Foundations.Operation< + { + ...ProjectNamePathParameter; + ...JobIdParameter; + }, + JobMetadata + >; + + // TODO: ok resonse code is incorrect + @post + @doc("Update Active Learning feedback.") + @action("feedback") + @actionSeparator("/") + op createFeedback is Operations.ResourceAction; +} + +// Model definitions + +@resource("projects") +@doc("Represents the project") +model ProjectMetadata { + @key + @doc("Name of the project") + @visibility("read") + projectName: string; + + @doc("Description of the project.") + description: string; +} + +@doc("Parameters needed to create the project") +model CreateProjectOptions { + @doc("Description of the project") + description?: string; + + ...Language; + + @doc("Resource enabled for multiple languages across projects or not") + multilingualResource?: boolean; + + @doc("Configurable settings of the Project") + settings?: ProjectSettings; +} + +@doc("Configurable settings of the Project") +model ProjectSettings { + @doc("Default Answer response when no good match is found in the knowledge base") + defaultAnswer?: string; +} + +@doc("Represents the job metadata") +model JobMetadata { + @key + @doc("The job ID.") + @visibility("read") + jobId: string; + + @doc("When the job was created.") + createdDateTime: utcDateTime; + + @doc("When the job expires.") + expirationDateTime?: utcDateTime; + + @doc("When the job was last updated.") + lastUpdatedDateTime: utcDateTime; + + @doc("The job status.") + status: JobStatus; +} + +@doc("The job status.") +enum JobStatus { + @doc("The job has not started yet.") + notStarted, + + @doc("The job is running.") + running, + + @doc("The job has completed successfully.") + succeeded, + + @doc("The job has failed.") + failed, + + @doc("The job has been cancelled.") + cancelled, + + @doc("The job is cancelling.") + cancelling, + + @doc("The job is partially completed.") + partiallyCompleted, +} + +@doc("Job state represents the job metadata and any errors") +@resource("import/jobs") +@parentResource(ProjectMetadata) +model JobState { + ...JobMetadata; + ...Errors; +} + +@doc("URL to download the result of the Export Job") +model ExportJobResultUrl { + @doc("URL to download the result of the Export Job") + resultUrl: string; +} + +@doc("Export job status, project metadata, and assets.") +@resource("export/jobs") +@parentResource(ProjectMetadata) +model ExportJobState { + ...JobState; + ...ExportJobResultUrl; +} + +@doc("The state of a deletion job.") +@resource("projects/deletion-jobs") +model DeletionJobState { + ...JobState; +} + +@resource("deployments") +@parentResource(ProjectMetadata) +@doc("Project deployment details.") +model ProjectDeployment { + @key + @doc("Name of the deployment.") + @visibility("read") + deploymentName: string; + + @doc("Represents the project last deployment date-time.") + lastDeployedDateTime?: utcDateTime; +} + +@doc("Job state represents the job metadata and any errors") +@resource("jobs") +@parentResource(ProjectDeployment) +model DeploymentJobState { + ...JobMetadata; + ...Errors; +} + +@doc("Collection of synonyms.") +model SynonymAsset is WordAlterations; + +@doc("Collection of word alterations.") +model WordAlterations { + @doc("Collection of word alterations.") + alterations: string[]; +} + +@doc("Custom source record with last updated date-time.") +model QnaSourceRecord { + ...QnaSourceMetadata; + + @doc("The time of the last deployment.") + lastDeployedDateTime?: utcDateTime; +} + +@doc("Input source file or url details.") +model QnaSourceMetadata { + @doc("Friendly name of the Source.") + displayName?: string; + + @doc("Unique source identifier. Name of the file if it's a 'file' source; otherwise, the complete URL if it's a 'url' source.") + source?: string; + + @doc("URI location for the file or url.") + sourceUri: string; + + @doc("The source kind.") + sourceKind: QnaSourceKind; + + @doc("The content structure kind.") + contentStructureKind: SourceContentStructureKind; +} + +@doc("Supported source types.") +enum QnaSourceKind { + @doc("File source") + file, + + @doc("Url source") + url, +} + +@doc("Content structure type for sources.") +enum SourceContentStructureKind { + @doc("The source content is unstructured") + unstructured, +} + +@friendlyName("{name}UpdateRecord", T) +model UpdateRecord { + updateOperation: UpdateOperationKind; + value: T; +} + +@doc("Update source record.") +model UpdateQnaSourceRecord { + ...QnaSourceMetadata; + + @doc("Boolean flag used to refresh data from the Source.") + refreshSourceOptions: boolean; +} + +@doc("The kind of an update operation.") +enum UpdateOperationKind { + @doc("Addition operation") + add, + + @doc("Deletion operation") + delete, + + @doc("Replace operation") + replace, +} + +@doc("Question and answer record") +model QnaRecord { + @doc("The record ID.") + id: int32; + + @doc("The answer.") + answer: string; + + @doc("The source.") + source: string; + + @doc("The questions.") + questions: string[]; + + @doc("The metadata.") + metadata: string; + + @doc("The dialog.") + dialog: QnaDialog; + + @doc("The active learning suggestions.") + activeLearningSuggestions: SuggestedQuestionsCluster; +} + +@doc("The details of a suggested questions cluster.") +model SuggestedQuestionsCluster { + @doc("Active Learning suggested questions cluster details.") + clusterHead: string; + + @doc("List of all suggested questions for the QnA.") + suggestedQuestions: SuggestedQuestion; +} + +@doc("A dialog to be displayed to the user.") +model QnaDialog { + @doc("If true, is context only.") + isContextOnly: boolean; + + @doc("The prompts to display.") + prompts: QnaPrompt[]; +} + +@doc("Details of a QnA prompt.") +model QnaPrompt { + @doc("The display order.") + displayOrder: int16; + + @doc("The QnA ID.") + qnaId: int32; + + @doc("The QnA record.") + qna: QnaRecord; + + @doc("The display text.") + displayText: string; +} + +@doc("Question suggested by the Active Learning feature.") +model SuggestedQuestion { + @doc("Question suggested by the Active Learning feature.") + question: string; + + @doc("The number of times the question was suggested explicitly by the user.") + userSuggestedCount: int32; + + @doc("The number of times the question was suggested automatically by the Active Learning algorithm.") + autoSuggestedCount: int32; +} + +@doc("The active learning feedback.") +model ActiveLearningFeedback { + @doc("A list of Feedback Records for Active Learning.") + records?: FeedbackRecord[]; +} + +@doc("A feedback record.") +model FeedbackRecord { + @doc("Unique identifier of the user.") + userId?: string; + + @doc("User suggested question for the QnA.") + userQuestion?: string; + + @doc("Unique ID of the QnA.") + qnaId?: int32; +} diff --git a/packages/samples/specs/data-plane/searchindex/main.tsp b/packages/samples/specs/data-plane/searchindex/main.tsp new file mode 100644 index 0000000000..4ad86240c1 --- /dev/null +++ b/packages/samples/specs/data-plane/searchindex/main.tsp @@ -0,0 +1,1067 @@ +// Based on https://github.com/Azure/azure-rest-api-specs/blob/main/specification/search/data-plane/Azure.Search/preview/2021-04-30-Preview/searchindex.json + +// (PR TODO: I think we have issue for arbitrary JSON extension/object literals, but can't find it) +// ISSUE: Can't set x-ms-code-generation-settings: https://github.com/Azure/typespec-azure/issues/1132 +// ISSUE: Can't set x-ms-parameter-grouping: https://github.com/Azure/typespec-azure/issues/1000 +// ISSUE: Can't set service description: https://github.com/Azure/typespec-azure/issues/1032 +// ISSUE: @extension on parameter doesn't work: https://github.com/Azure/typespec-azure/issues/1121 + +import "@typespec/http"; +import "@typespec/rest"; +import "@typespec/openapi"; +import "@azure-tools/typespec-azure-core"; + +@useAuth( + ApiKeyAuth | OAuth2Auth<[ + { + type: OAuth2FlowType.implicit, + authorizationUrl: "https://login.contoso.com/common/oauth2/v2.0/authorize", + scopes: ["https://cognitiveservices.azure.com/.default"], + } + ]> +) +@service({ + title: "SearchIndexClient", + version: "2021-04-30-Preview", +}) +namespace Azure.SearchIndex; + +using Azure.Core; +using TypeSpec.Http; +using TypeSpec.OpenAPI; + +#suppress "@azure-tools/typespec-azure-core/use-extensible-enum" "Existing service." +@fixed +@doc("Specifies the mode for Autocomplete. The default is 'oneTerm'. Use 'twoTerms' to get shingles and 'oneTermWithContext' to use the current context in producing autocomplete terms.") +enum AutocompleteMode { + @doc("Only one term is suggested. If the query has two terms, only the last term is completed. For example, if the input is 'washington medic', the suggested terms could include 'medicaid', 'medicare', and 'medicine'.") + OneTerm: "oneTerm", + + @doc("Matching two-term phrases in the index will be suggested. For example, if the inpu.t is 'medic', the suggested terms could include 'medicare coverage' and 'medical assistant'.") + TwoTerms: "twoTerms", + + @doc("Completes the last term in a query with two or more terms, where the last two terms are a phrase that exists in the index. For example, if the input is 'washington medic', the suggested terms could include 'washington medicaid' and 'washington medical'.") + OneTermWithContext: "oneTermWithContext", +} + +@doc("This parameter is only valid if the query type is 'semantic'. If set, the query returns answers extracted from key passages in the highest ranked documents. The number of answers returned can be configured by appending the pipe character '|' followed by the 'count-' option after the answers parameter value, such as 'extractive|count-3'. Default count is 1.") +enum QueryAnswerType { + @doc("Do not return answers for the query.") + None: "none", + + @doc("Extracts answer candidates from the contents of the documents returned in response to a query expressed as a question in natural language.") + Extractive: "extractive", +} + +@doc("This parameter is only valid if the query type is 'semantic'. If set, the query returns captions extracted from key passages in the highest ranked documents. When s is set to 'extractive', highlighting is enabled by default, and can be configured by appending the pipe character '|' followed by the 'highlight-' option, such as 'extractive|highlight-true'. Defaults to 'None'.") +enum QueryCaptionType { + @doc("Do not return captions for the query.") + None: "none", + + @doc("Extracts captions from the matching documents that contain passages relevant to the search query.") + Extractive: "extractive", +} + +@doc("The language of the query.") +enum QueryLanguage { + @doc("Query language not specified.") + None: "none", + + @doc("Query language value for English (United States).") + EnUs: "en-us", + + @doc("Query language value for English (Great Britain).") + EnGb: "en-gb", + + @doc("Query language value for English (India).") + EnIn: "en-in", + + @doc("Query language value for English (Canada).") + EnCa: "en-ca", + + @doc("Query language value for English (Australia).") + EnAu: "en-au", + + @doc("Query language value for French (France).") + FrFr: "fr-fr", + + @doc("Query language value for French (Canada).") + FrCa: "fr-ca", + + @doc("Query language value for German (Germany).") + DeDe: "de-de", + + @doc("Query language value for Spanish (Spain).") + EsEs: "es-es", + + @doc("Query language value for Spanish (Mexico).") + EsMx: "es-mx", + + @doc("Query language value for Chinese (China).") + ZhCn: "zh-cn", + + @doc("Query language value for Chinese (Taiwan).") + ZhTw: "zh-tw", + + @doc("Query language value for Portuguese (Brazil).") + PtBr: "pt-br", + + @doc("Query language value for Portuguese (Portugal).") + PtPt: "pt-pt", + + @doc("Query language value for Italian (Italy).") + ItIt: "it-it", + + @doc("Query language value for Japanese (Japan).") + JaJp: "ja-jp", + + @doc("Query language value for Korean (Korea).") + KoKr: "ko-kr", + + @doc("Query language value for Russian (Russia).") + RuRu: "ru-ru", + + @doc("Query language value for Czech (Czech Republic).") + CsCz: "cs-cz", + + @doc("Query language value for Dutch (Belgium).") + NlBe: "nl-be", + + @doc("Query language value for Dutch (Netherlands).") + NlNl: "nl-nl", + + @doc("Query language value for Hungarian (Hungary).") + HuHu: "hu-hu", + + @doc("Query language value for Polish (Poland).") + PlPl: "pl-pl", + + @doc("Query language value for Swedish (Sweden).") + SvSe: "sv-se", + + @doc("Query language value for Turkish (Turkey).") + TrTr: "tr-tr", + + @doc("Query language value for Hindi (India).") + HiIn: "hi-in", + + @doc("Query language value for Arabic (Saudi Arabia).") + ArSa: "ar-sa", + + @doc("Query language value for Arabic (Egypt).") + ArEg: "ar-eg", + + @doc("Query language value for Arabic (Morocco).") + ArMa: "ar-ma", + + @doc("Query language value for Arabic (Kuwait).") + ArKw: "ar-kw", + + @doc("Query language value for Arabic (Jordan).") + ArJo: "ar-jo", + + @doc("Query language value for Danish (Denmark).") + DaDk: "da-dk", + + @doc("Query language value for Norwegian (Norway).") + NoNo: "no-no", + + @doc("Query language value for Bulgarian (Bulgaria).") + BgBg: "bg-bg", + + @doc("Query language value for Croatian (Croatia).") + HrHr: "hr-hr", + + @doc("Query language value for Croatian (Bosnia and Herzegovina).") + HrBa: "hr-ba", + + @doc("Query language value for Malay (Malaysia).") + MsMy: "ms-my", + + @doc("Query language value for Malay (Brunei Darussalam).") + MsBn: "ms-bn", + + @doc("Query language value for Slovenian (Slovenia).") + SlSl: "sl-sl", + + @doc("Query language value for Tamil (India).") + TaIn: "ta-in", + + @doc("Query language value for Vietnamese (Viet Nam).") + ViVn: "vi-vn", + + @doc("Query language value for Greek (Greece).") + ElGr: "el-gr", + + @doc("Query language value for Romanian (Romania).") + RoRo: "ro-ro", + + @doc("Query language value for Icelandic (Iceland).") + IsIs: "is-is", + + @doc("Query language value for Indonesian (Indonesia).") + IdId: "id-id", + + @doc("Query language value for Thai (Thailand).") + ThTh: "th-th", + + @doc("Query language value for Lithuanian (Lithuania).") + LtLt: "lt-lt", + + @doc("Query language value for Ukrainian (Ukraine).") + UkUa: "uk-ua", + + @doc("Query language value for Latvian (Latvia).") + LvLv: "lv-lv", + + @doc("Query language value for Estonian (Estonia).") + EtEe: "et-ee", + + @doc("Query language value for Catalan (Spain).") + CaEs: "ca-es", + + @doc("Query language value for Finnish (Finland).") + FiFi: "fi-fi", + + @doc("Query language value for Serbian (Bosnia and Herzegovina).") + SrBa: "sr-ba", + + @doc("Query language value for Serbian (Montenegro).") + SrMe: "sr-me", + + @doc("Query language value for Serbian (Serbia).") + SrRs: "sr-rs", + + @doc("Query language value for Slovak (Slovakia).") + SkSk: "sk-sk", + + @doc("Query language value for Norwegian (Norway).") + NbNo: "nb-no", + + @doc("Query language value for Armenian (Armenia).") + HyAm: "hy-am", + + @doc("Query language value for Bengali (India).") + BnIn: "bn-in", + + @doc("Query language value for Basque (Spain).") + EuEs: "eu-es", + + @doc("Query language value for Galician (Spain).") + GlEs: "gl-es", + + @doc("Query language value for Gujarati (India).") + GuIn: "gu-in", + + @doc("Query language value for Hebrew (Israel).") + HeIl: "he-il", + + @doc("Query language value for Irish (Ireland).") + GaIe: "ga-ie", + + @doc("Query language value for Kannada (India).") + KnIn: "kn-in", + + @doc("Query language value for Malayalam (India).") + MlIn: "ml-in", + + @doc("Query language value for Marathi (India).") + MrIn: "mr-in", + + @doc("Query language value for Persian (U.A.E.).") + FaAe: "fa-ae", + + @doc("Query language value for Punjabi (India).") + PaIn: "pa-in", + + @doc("Query language value for Telugu (India).") + TeIn: "te-in", + + @doc("Query language value for Urdu (Pakistan).") + UrPk: "ur-pk", +} + +@doc("Improve search recall by spell-correcting individual search query terms.") +enum QuerySpellerType { + @doc("Speller not enabled.") + None: "none", + + @doc("Speller corrects individual query terms using a static lexicon for the language specified by the queryLanguage parameter.") + Lexicon: "lexicon", +} + +#suppress "@azure-tools/typespec-azure-core/use-extensible-enum" "Existing service." +@fixed +@doc("Specifies the syntax of the search query. The default is 'simple'. Use 'full' if your query uses the Lucene query syntax and 'semantic' if query syntax is not needed.") +enum QueryType { + @doc("Uses the simple query syntax for searches. Search text is interpreted using a simple query language that allows for symbols such as +, * and \"\". Queries are evaluated across all searchable fields by default, unless the searchFields parameter is specified.") + Simple: "simple", + + @doc("Uses the full Lucene query syntax for searches. Search text is interpreted using the Lucene query language which allows field-specific and weighted searches, as well as other advanced features.") + Full: "full", + + @doc("Best suited for queries expressed in natural language as opposed to keywords. Improves precision of search results by re-ranking the top search results using a ranking model trained on the Web corpus.") + Semantic: "semantic", +} + +#suppress "@azure-tools/typespec-azure-core/use-extensible-enum" "Existing service." +@fixed +@doc("Index action type") +enum IndexActionType { + @doc("Inserts the document into the index if it is new and updates it if it exists. All fields are replaced in the update case.") + Upload: "upload", + + @doc("Merges the specified field values with an existing document. If the document does not exist, the merge will fail. Any field you specify in a merge will replace the existing field in the document. This also applies to collections of primitive and complex types.") + Merge: "merge", + + @doc("Behaves like merge if a document with the given key already exists in the index. If the document does not exist, it behaves like upload with a new document.") + MergeOrUpload: "mergeOrUpload", + + @doc("Removes the specified document from the index. Any field you specify in a delete operation other than the key field will be ignored. If you want to remove an individual field from a document, use merge instead and set the field explicitly to null.") + Delete: "delete", +} + +#suppress "@azure-tools/typespec-azure-core/use-extensible-enum" "Existing service." +@fixed +@doc("Specifies whether any or all of the search terms must be matched in order to count the document as a match.") +enum SearchMode { + @doc("Any of the search terms must be matched in order to count the document as a match.") + Any: "any", + + @doc("All of the search terms must be matched in order to count the document as a match.") + All: "all", +} + +#suppress "@azure-tools/typespec-azure-core/use-extensible-enum" "Existing service." +@fixed +@doc("A value that specifies whether we want to calculate scoring statistics (such as document frequency) globally for more consistent scoring, or locally, for lower latency. The default is 'local'. Use 'global' to aggregate scoring statistics globally before scoring. Using global scoring statistics can increase latency of search queries.") +enum ScoringStatistics { + @doc("The scoring statistics will be calculated locally for lower latency.") + Local: "local", + + @doc("The scoring statistics will be calculated globally for more consistent scoring.") + Global: "global", +} + +@doc("Api Version Parameter") +model ApiVersionParameter { + #suppress "@azure-tools/typespec-azure-core/casing-style" "This is the name of a query parameter." + @doc("Client Api Version.") + @query + `api-version`: string; +} + +@doc("Client Request Id Parameter") +model ClientRequestIdParameter { + #suppress "@azure-tools/typespec-azure-core/casing-style" "This is the name of a header." + @doc("The tracking ID sent with the request to help with debugging.") + @extension("x-ms-client-id", true) + @header + `x-ms-client-request-id`?: string; // ISSUE: Can't set format=uuid: https://github.com/microsoft/typespec/issues/153 +} + +// ISSUE: Can't allow additionalProperties: https://github.com/Azure/typespec-azure/issues/997 +@doc("An answer is a text passage extracted from the contents of the most relevant documents that matched the query. Answers are extracted from the top search results. Answer candidates are scored and the top answers are selected.") +model AnswerResult { + @doc("The score value represents how relevant the answer is to the the query relative to other answers returned for the query.") + @visibility("read") + score?: float64; + + @doc("The key of the document the answer was extracted from.") + @visibility("read") + key?: string; + + @doc("The text passage extracted from the document contents as the answer.") + @visibility("read") + text?: string; + + #suppress "@azure-tools/typespec-azure-core/no-nullable" "Existing service" + @doc("Same text passage as in the Text property with highlighted text phrases most relevant to the query.") + @visibility("read") + highlights?: string | null; +} + +@doc("The result of Autocomplete requests.") +model AutocompleteItem { + @doc("The completed term.") + @visibility("read") + text: string; + + @doc("The query along with the completed term.") + @visibility("read") + queryPlusText: string; +} + +@doc("The result of Autocomplete query.") +model AutocompleteResult { + @doc("A value indicating the percentage of the index that was considered by the autocomplete request, or null if minimumCoverage was not specified in the request.") + @projectedName("json", "@search.coverage") + @visibility("read") + coverage?: float64; + + @doc("The list of returned Autocompleted items.") + @projectedName("json", "value") + @visibility("read") + results: AutocompleteItem[]; +} + +@doc("Parameters for fuzzy matching, and other autocomplete query behaviors.") +model AutocompleteRequest { + @doc("The search text on which to base autocomplete results.") + @projectedName("json", "search") + searchText: string; + + @doc("Specifies the mode for Autocomplete. The default is 'oneTerm'. Use 'twoTerms' to get shingles and 'oneTermWithContext' to use the current context while producing auto-completed terms.") + autocompleteMode?: AutocompleteMode; + + @doc("An OData expression that filters the documents used to produce completed terms for the Autocomplete result.") + filter?: string; + + @doc("A value indicating whether to use fuzzy matching for the autocomplete query. Default is false. When set to true, the query will autocomplete terms even if there's a substituted or missing character in the search text. While this provides a better experience in some scenarios, it comes at a performance cost as fuzzy autocomplete queries are slower and consume more resources.") + @projectedName("json", "fuzzy") + useFuzzyMatching?: boolean; + + @doc("A string tag that is appended to hit highlights. Must be set with highlightPreTag. If omitted, hit highlighting is disabled.") + highlightPostTag?: string; + + @doc("A string tag that is prepended to hit highlights. Must be set with highlightPostTag. If omitted, hit highlighting is disabled.") + highlightPreTag?: string; + + @doc("A number between 0 and 100 indicating the percentage of the index that must be covered by an autocomplete query in order for the query to be reported as a success. This parameter can be useful for ensuring search availability even for services with only one replica. The default is 80.") + minimumCoverage?: float64; + + @doc("The comma-separated list of field names to consider when querying for auto-completed terms. Target fields must be included in the specified suggester.") + searchFields?: string; + + @doc("The name of the suggester as specified in the suggesters collection that's part of the index definition.") + suggesterName: string; + + @doc("The number of auto-completed terms to retrieve. This must be a value between 1 and 100. The default is 5.") + top?: int32; +} + +// ISSUE: Can't allow additionalProperties: https://github.com/Azure/typespec-azure/issues/997 +@doc("Captions are the most representative passages from the document relatively to the search query. They are often used as document summary. Captions are only returned for queries of type 'semantic'..") +model CaptionResult { + #suppress "@azure-tools/typespec-azure-core/no-nullable" "Existing service" + @doc("Same text passage as in the Text property with highlighted phrases most relevant to the query.") + @visibility("read") + highlights?: string | null; + + @doc("A representative text passage extracted from the document most relevant to the search query.") + @visibility("read") + text?: string; +} + +// ISSUE: Can't allow additionalProperties: https://github.com/Azure/typespec-azure/issues/997 +@doc("A single bucket of a facet query result. Reports the number of documents with a field value falling within a particular range or having a particular value or interval.") +model FacetResult { + @doc("The approximate count of documents falling within the bucket described by this facet.") + @visibility("read") + count?: int64; +} + +@doc("Response containing search results from an index.") +model SearchDocumentsResult { + @doc("The total count of results found by the search operation, or null if the count was not requested. If present, the count may be greater than the number of results in this response. This can happen if you use the $top or $skip parameters, or if Azure Cognitive Search can't return all the requested documents in a single Search response.") + @projectedName("json", "@odata.count") + @visibility("read") + count?: int64; + + @doc("Continuation URL returned when Azure Cognitive Search can't return all the requested results in a single Search response. You can use this URL to formulate another GET or POST Search request to get the next part of the search response. Make sure to use the same verb (GET or POST) as the request that produced this response.") + @projectedName("json", "@odata.nextLink") + @visibility("read") + nextLink?: string; + + #suppress "@azure-tools/typespec-azure-core/casing-style" "Existing service." + @doc("A value indicating the percentage of the index that was included in the query, or null if minimumCoverage was not specified in the request.") + @visibility("read") + `@search.coverage`?: float64; + + @doc("The facet query results for the search operation, organized as a collection of buckets for each faceted field; null if the query did not include any facet expressions.") + @projectedName("json", "@search.facets") + @visibility("read") + facets?: Record; + + @doc("The answers query results for the search operation; null if the answers query parameter was not specified or set to 'none'.") + @projectedName("json", "@search.answers") + @visibility("read") + answers?: AnswerResult[]; + + @doc("Continuation JSON payload returned when Azure Cognitive Search can't return all the requested results in a single Search response. You can use this JSON along with @odata.nextLink to formulate another POST Search request to get the next part of the search response.") + @projectedName("json", "@search.nextPageParameters") + @visibility("read") + nextPageParameters?: SearchRequest; + + @doc("The sequence of results returned by the query.") + @projectedName("json", "value") + @visibility("read") + results: SearchResult[]; +} + +@doc("Describes an error condition for the Azure Cognitive Search API.") +@error +model SearchError { + @doc("One of a server-defined set of error codes.") + @visibility("read") + code?: string; + + @doc("A human-readable representation of the error.") + @visibility("read") + message: string; + + @doc("An array of details about specific errors that led to this reported error.") + @visibility("read") + details?: SearchError[]; +} + +// ISSUE: Can't allow additionalProperties: https://github.com/Azure/typespec-azure/issues/997 +@doc("Contains a document found by a search query, plus associated metadata.") +model SearchResult { + #suppress "@azure-tools/typespec-azure-core/no-nullable" "Existing service" + @doc("Captions are the most representative passages from the document relatively to the search query. They are often used as document summary. Captions are only returned for queries of type 'semantic'.") + @projectedName("json", "@search.captions") + @visibility("read") + captions?: CaptionResult[] | null; + + @doc("Text fragments from the document that indicate the matching search terms, organized by each applicable field; null if hit highlighting was not enabled for the query.") + @projectedName("json", "@search.highlights") + @visibility("read") + highlights?: Record; + + #suppress "@azure-tools/typespec-azure-core/no-nullable" "Existing service" + @doc("The relevance score computed by the semantic ranker for the top search results. Search results are sorted by the RerankerScore first and then by the Score. RerankerScore is only returned for queries of type 'semantic'.") + @projectedName("json", "@search.rerankerScore") + @visibility("read") + rerankerScore?: float64 | null; + + @doc("The relevance score of the document compared to other documents returned by the query.") + @projectedName("json", "@search.score") + @visibility("read") + score: float64; +} + +@doc("Parameters for filtering, sorting, faceting, paging, and other search query behaviors.") +model SearchRequest { + @doc("A value that specifies whether to fetch the total count of results. Default is false. Setting this value to true may have a performance impact. Note that the count returned is an approximation.") + @projectedName("json", "count") + includeTotalResultCount?: boolean; + + @doc("The list of facet expressions to apply to the search query. Each facet expression contains a field name, optionally followed by a comma-separated list of name:value pairs.") + facets?: string[]; // ISSUE: Can't set externalDocs: https://github.com/Azure/typespec-azure/issues/1035 + + @doc("The OData $filter expression to apply to the search query.") + filter?: string; // ISSUE: Can't set externalDocs: https://github.com/Azure/typespec-azure/issues/1035 + + @doc("The comma-separated list of field names to use for hit highlights. Only searchable fields can be used for hit highlighting.") + @projectedName("json", "highlight") + highlightFields?: string; + + @doc("A string tag that is appended to hit highlights. Must be set with highlightPreTag. Default is </em>.") + highlightPostTag?: string; + + @doc("A string tag that is prepended to hit highlights. Must be set with highlightPostTag. Default is <em>.") + highlightPreTag?: string; + + @doc("A number between 0 and 100 indicating the percentage of the index that must be covered by a search query in order for the query to be reported as a success. This parameter can be useful for ensuring search availability even for services with only one replica. The default is 100.") + minimumCoverage?: float64; + + @doc("The comma-separated list of OData $orderby expressions by which to sort the results. Each expression can be either a field name or a call to either the geo.distance() or the search.score() functions. Each expression can be followed by asc to indicate ascending, or desc to indicate descending. The default is ascending order. Ties will be broken by the match scores of documents. If no $orderby is specified, the default sort order is descending by document match score. There can be at most 32 $orderby clauses.") + @projectedName("json", "orderby") + orderBy?: string; + + @doc("A value that specifies the syntax of the search query. The default is 'simple'. Use 'full' if your query uses the Lucene query syntax.") + queryType?: QueryType; + + @doc("A value that specifies whether we want to calculate scoring statistics (such as document frequency) globally for more consistent scoring, or locally, for lower latency. The default is 'local'. Use 'global' to aggregate scoring statistics globally before scoring. Using global scoring statistics can increase latency of search queries.") + scoringStatistics?: ScoringStatistics; + + @doc("A value to be used to create a sticky session, which can help getting more consistent results. As long as the same sessionId is used, a best-effort attempt will be made to target the same replica set. Be wary that reusing the same sessionID values repeatedly can interfere with the load balancing of the requests across replicas and adversely affect the performance of the search service. The value used as sessionId cannot start with a '_' character.") + sessionId?: string; + + @doc("The list of parameter values to be used in scoring functions (for example, referencePointParameter) using the format name-values. For example, if the scoring profile defines a function with a parameter called 'mylocation' the parameter string would be \"mylocation--122.2,44.8\" (without the quotes).") + scoringParameters?: string[]; // ISSUE: Can't set collectionFormat: https://github.com/Azure/typespec-azure/issues/1031 + + @doc("The name of a scoring profile to evaluate match scores for matching documents in order to sort the results.") + scoringProfile?: string; + + @doc("The name of a semantic configuration that will be used when processing documents for queries of type semantic.") + semanticConfiguration?: string; + + @doc("A full-text search query expression; Use \"*\" or omit this parameter to match all documents.") + @projectedName("json", "search") + searchText?: string; + + @doc("The comma-separated list of field names to which to scope the full-text search. When using fielded search (fieldName:searchExpression) in a full Lucene query, the field names of each fielded search expression take precedence over any field names listed in this parameter.") + searchFields?: string; + + @doc("A value that specifies whether any or all of the search terms must be matched in order to count the document as a match.") + searchMode?: SearchMode; + + @doc("A value that specifies the language of the search query.") + queryLanguage?: QueryLanguage; + + @doc("A value that specified the type of the speller to use to spell-correct individual search query terms.") + speller?: QuerySpellerType; + + @doc("A value that specifies whether answers should be returned as part of the search response.") + answers?: QueryAnswerType; + + @doc("The comma-separated list of fields to retrieve. If unspecified, all fields marked as retrievable in the schema are included.") + select?: string; + + @doc("The number of search results to skip. This value cannot be greater than 100,000. If you need to scan documents in sequence, but cannot use skip due to this limitation, consider using orderby on a totally-ordered key and filter with a range query instead.") + skip?: int32; + + @doc("The number of search results to retrieve. This can be used in conjunction with $skip to implement client-side paging of search results. If results are truncated due to server-side paging, the response will include a continuation token that can be used to issue another Search request for the next page of results.") + top?: int32; + + @doc("A value that specifies whether captions should be returned as part of the search response.") + captions?: QueryCaptionType; + + @doc("The comma-separated list of field names used for semantic search.") + semanticFields?: string; +} + +// ISSUE: Can't allow additionalProperties: https://github.com/Azure/typespec-azure/issues/997 +@doc("Represents an index action that operates on a document.") +model IndexAction { + @doc("The operation to perform on a document in an indexing batch.") + @projectedName("json", "@search.action") + actiontype?: IndexActionType; +} + +@doc("Contains a batch of document write actions to send to the index.") +model IndexBatch { + @doc("The actions in the batch.") + @projectedName("json", "value") + actions: IndexAction[]; +} + +@doc("Response containing the status of operations for all documents in the indexing request.") +model IndexDocumentsResult { + @doc("The list of status information for each document in the indexing request.") + @projectedName("json", "value") + @visibility("read") + results: IndexingResult[]; +} + +@doc("Status of an indexing operation for a single document.") +model IndexingResult { + @doc("The key of a document that was in the indexing request.") + @visibility("read") + key: string; + + @doc("The error message explaining why the indexing operation failed for the document identified by the key; null if indexing succeeded.") + @visibility("read") + errorMessage?: string; + + @doc("A value indicating whether the indexing operation succeeded for the document identified by the key.") + @projectedName("json", "status") + @visibility("read") + succeeded: boolean; + + @doc("The status code of the indexing operation. Possible values include: 200 for a successful update or delete, 201 for successful document creation, 400 for a malformed input document, 404 for document not found, 409 for a version conflict, 422 when the index is temporarily unavailable, or 503 for when the service is too busy.") + @visibility("read") + statusCode: int32; +} + +@doc("Response containing suggestion query results from an index.") +model SuggestDocumentsResult { + @doc("The sequence of results returned by the query.") + @projectedName("json", "value") + @visibility("read") + results: SuggestResult[]; + + @doc("A value indicating the percentage of the index that was included in the query, or null if minimumCoverage was not set in the request.") + @projectedName("json", "@search.coverage") + @visibility("read") + coverage?: float64; +} + +// ISSUE: Can't allow additionalProperties: https://github.com/Azure/typespec-azure/issues/997 +@doc("A result containing a document found by a suggestion query, plus associated metadata.") +model SuggestResult { + @doc("The text of the suggestion result.") + @projectedName("json", "@search.text") + @visibility("read") + text: string; +} + +@doc("Parameters for filtering, sorting, fuzzy matching, and other suggestions query behaviors.") +model SuggestRequest { + // ISSUE: Can't set externalDocs: https://github.com/Azure/typespec-azure/issues/1035 + @doc("An OData expression that filters the documents considered for suggestions.") + filter?: string; + + @doc("A value indicating whether to use fuzzy matching for the suggestion query. Default is false. When set to true, the query will find suggestions even if there's a substituted or missing character in the search text. While this provides a better experience in some scenarios, it comes at a performance cost as fuzzy suggestion searches are slower and consume more resources.") + @projectedName("json", "fuzzy") + useFuzzyMatching?: boolean; + + @doc("A string tag that is appended to hit highlights. Must be set with highlightPreTag. If omitted, hit highlighting of suggestions is disabled.") + highlightPostTag?: string; + + @doc("A string tag that is prepended to hit highlights. Must be set with highlightPostTag. If omitted, hit highlighting of suggestions is disabled.") + highlightPreTag?: string; + + @doc("A number between 0 and 100 indicating the percentage of the index that must be covered by a suggestion query in order for the query to be reported as a success. This parameter can be useful for ensuring search availability even for services with only one replica. The default is 80.") + minimumCoverage?: float64; + + @doc("The comma-separated list of OData $orderby expressions by which to sort the results. Each expression can be either a field name or a call to either the geo.distance() or the search.score() functions. Each expression can be followed by asc to indicate ascending, or desc to indicate descending. The default is ascending order. Ties will be broken by the match scores of documents. If no $orderby is specified, the default sort order is descending by document match score. There can be at most 32 $orderby clauses.") + @projectedName("json", "orderby") + orderBy?: string; + + @doc("The search text to use to suggest documents. Must be at least 1 character, and no more than 100 characters.") + @projectedName("json", "search") + searchText: string; + + @doc("The comma-separated list of field names to search for the specified search text. Target fields must be included in the specified suggester.") + searchFields?: string; + + @doc("The comma-separated list of fields to retrieve. If unspecified, only the key field will be included in the results.") + select?: string; + + @doc("The name of the suggester as specified in the suggesters collection that's part of the index definition.") + suggesterName: string; + + @doc("The number of suggestions to retrieve. This must be a value between 1 and 100. The default is 5.") + top?: int32; +} + +#suppress "@azure-tools/typespec-azure-core/use-standard-operations" "Existing operation." +@tag("Documents") +@route("/docs") +interface Documents { + @doc("Queries the number of documents in the index.") + @get + @route("$count") + getCount(...ApiVersionParameter, ...ClientRequestIdParameter): int64 | SearchError; + + @doc("Searches for documents in the index.") + @get + getSearch( + @doc("A full-text search query expression; Use \"*\" or omit this parameter to match all documents.") + @query("search") + searchText?: string, + + @doc("A value that specifies whether to fetch the total count of results. Default is false. Setting this value to true may have a performance impact. Note that the count returned is an approximation.") + @query("$count") + includeTotalResultCount?: boolean, + + #suppress "@azure-tools/typespec-azure-core/prefer-csv-collection-format" "Existing service" + @doc("The list of facet expressions to apply to the search query. Each facet expression contains a field name, optionally followed by a comma-separated list of name:value pairs.") + @query({ + name: "facet", + format: "multi", + }) + facets?: string[], // ISSUE: Can't set collectionFormat: https://github.com/Azure/typespec-azure/issues/1031 + + #suppress "@azure-tools/typespec-azure-core/casing-style" "Existing operation." + @doc("The OData $filter expression to apply to the search query.") + @query + $filter?: string, + + #suppress "@azure-tools/typespec-azure-core/prefer-csv-collection-format" "Existing service" + @doc("The list of field names to use for hit highlights. Only searchable fields can be used for hit highlighting.") + @query({ + name: "highlight", + format: "multi", + }) + highlightFields?: string[], + + @doc("A string tag that is appended to hit highlights. Must be set with highlightPreTag. Default is </em>.") + @query + highlightPostTag?: string, + + @doc("A string tag that is prepended to hit highlights. Must be set with highlightPostTag. Default is <em>.") + @query + highlightPreTag?: string, + + @doc("A number between 0 and 100 indicating the percentage of the index that must be covered by a search query in order for the query to be reported as a success. This parameter can be useful for ensuring search availability even for services with only one replica. The default is 100.") + @query + minimumCoverage?: float64, + + #suppress "@azure-tools/typespec-azure-core/prefer-csv-collection-format" "Existing service" + @doc("The list of OData $orderby expressions by which to sort the results. Each expression can be either a field name or a call to either the geo.distance() or the search.score() functions. Each expression can be followed by asc to indicate ascending, and desc to indicate descending. The default is ascending order. Ties will be broken by the match scores of documents. If no OrderBy is specified, the default sort order is descending by document match score. There can be at most 32 $orderby clauses.") + @query({ + name: "$orderBy", + format: "multi", + }) + orderBy?: string[], + + @doc("A value that specifies the syntax of the search query. The default is 'simple'. Use 'full' if your query uses the Lucene query syntax.") + @query + queryType?: QueryType, + + #suppress "@azure-tools/typespec-azure-core/prefer-csv-collection-format" "Existing service" + @doc("The list of parameter values to be used in scoring functions (for example, referencePointParameter) using the format name-values. For example, if the scoring profile defines a function with a parameter called 'mylocation' the parameter string would be \"mylocation--122.2,44.8\" (without the quotes).") + @query({ + name: "scoringParameter", + format: "multi", + }) + scoringParameters?: string[], // ISSUE: Can't set collectionFormat: https://github.com/Azure/typespec-azure/issues/1031 + + @doc("The name of a scoring profile to evaluate match scores for matching documents in order to sort the results.") + @query + scoringProfile?: string, + + @doc("The name of the semantic configuration that lists which fields should be used for semantic ranking, captions, highlights, and answers") + @query + semanticConfiguration?: string, + + #suppress "@azure-tools/typespec-azure-core/prefer-csv-collection-format" "Existing service" + @doc("The list of field names to which to scope the full-text search. When using fielded search (fieldName:searchExpression) in a full Lucene query, the field names of each fielded search expression take precedence over any field names listed in this parameter.") + @query({ + format: "multi", + }) + searchFields?: string[], + + @doc("The language of the query.") + @query + queryLanguage?: QueryLanguage, + + @doc("Improve search recall by spell-correcting individual search query terms.") + @query + speller?: QuerySpellerType, + + @doc("This parameter is only valid if the query type is 'semantic'. If set, the query returns answers extracted from key passages in the highest ranked documents. The number of answers returned can be configured by appending the pipe character '|' followed by the 'count-' option after the answers parameter value, such as 'extractive|count-3'. Default count is 1.") + @query + answers?: QueryAnswerType, + + @doc("A value that specifies whether any or all of the search terms must be matched in order to count the document as a match.") + @query + searchMode?: SearchMode, + + @doc("A value that specifies whether we want to calculate scoring statistics (such as document frequency) globally for more consistent scoring, or locally, for lower latency.") + @query + scoringStatistics?: ScoringStatistics, + + @doc("A value to be used to create a sticky session, which can help to get more consistent results. As long as the same sessionId is used, a best-effort attempt will be made to target the same replica set. Be wary that reusing the same sessionID values repeatedly can interfere with the load balancing of the requests across replicas and adversely affect the performance of the search service. The value used as sessionId cannot start with a '_' character.") + @query + sessionId?: string, + + #suppress "@azure-tools/typespec-azure-core/prefer-csv-collection-format" "Existing service" + #suppress "@azure-tools/typespec-azure-core/casing-style" "Existing operation." + @doc("The list of fields to retrieve. If unspecified, all fields marked as retrievable in the schema are included.") + @query({ + format: "multi", + }) + $select?: string[], + + #suppress "@azure-tools/typespec-azure-core/casing-style" "Existing operation." + @doc("The number of search results to skip. This value cannot be greater than 100,000. If you need to scan documents in sequence, but cannot use $skip due to this limitation, consider using $orderby on a totally-ordered key and $filter with a range query instead.") + @query + $skip?: int32, + + #suppress "@azure-tools/typespec-azure-core/casing-style" "Existing operation." + @doc("The number of search results to retrieve. This can be used in conjunction with $skip to implement client-side paging of search results. If results are truncated due to server-side paging, the response will include a continuation token that can be used to issue another Search request for the next page of results.") + @query + $top?: int32, + + @doc("This parameter is only valid if the query type is 'semantic'. If set, the query returns captions extracted from key passages in the highest ranked documents. When Captions is set to 'extractive', highlighting is enabled by default, and can be configured by appending the pipe character '|' followed by the 'highlight-' option, such as 'extractive|highlight-true'. Defaults to 'None'.") + @query + captions?: QueryCaptionType, + + #suppress "@azure-tools/typespec-azure-core/prefer-csv-collection-format" "Existing service" + @doc("The list of field names used for semantic search.") + @query({ + format: "multi", + }) + semanticFields?: string[], + + ...ApiVersionParameter, + ...ClientRequestIdParameter, + ): SearchDocumentsResult | SearchError; + + @doc("Autocompletes incomplete query terms based on input text and matching terms in the index.") + @post + @route("search.post.search") + searchPost( + @doc("The definition of the Search request.") + @body + searchRequest: SearchRequest, + + ...ApiVersionParameter, + ...ClientRequestIdParameter, + ): SearchDocumentsResult | SearchError; + + @doc("Autocompletes incomplete query terms based on input text and matching terms in the index.") + @get + @route("search.autocomplete") + getAutocomplete( + @doc("The incomplete term which should be auto-completed.") + @query + search: string, + + @doc("The name of the suggester as specified in the suggesters collection that's part of the index definition.") + @query + suggesterName: string, + + @doc("Specifies the mode for Autocomplete. The default is 'oneTerm'. Use 'twoTerms' to get shingles and 'oneTermWithContext' to use the current context while producing auto-completed terms.") + @query + autocompleteMode?: AutocompleteMode, + + #suppress "@azure-tools/typespec-azure-core/casing-style" "Existing operation." + @doc("An OData expression that filters the documents used to produce completed terms for the Autocomplete result.") + @query + $filter?: string, + + @doc("A value indicating whether to use fuzzy matching for the autocomplete query. Default is false. When set to true, the query will find terms even if there's a substituted or missing character in the search text. While this provides a better experience in some scenarios, it comes at a performance cost as fuzzy autocomplete queries are slower and consume more resources.") + @query + fuzzy?: boolean, + + @doc("A string tag that is appended to hit highlights. Must be set with highlightPreTag. If omitted, hit highlighting is disabled.") + @query + highlightPostTag?: string, + + @doc("A string tag that is prepended to hit highlights. Must be set with highlightPostTag. If omitted, hit highlighting is disabled.") + @query + highlightPreTag?: string, + + @doc("A number between 0 and 100 indicating the percentage of the index that must be covered by an autocomplete query in order for the query to be reported as a success. This parameter can be useful for ensuring search availability even for services with only one replica. The default is 80.") + @query + minimumCoverage?: float64, + + #suppress "@azure-tools/typespec-azure-core/prefer-csv-collection-format" "Existing service" + @doc("The list of field names to consider when querying for auto-completed terms. Target fields must be included in the specified suggester.") + @query({ + format: "multi", + }) + searchFields?: string[], + + #suppress "@azure-tools/typespec-azure-core/casing-style" "Existing operation." + @doc("The number of auto-completed terms to retrieve. This must be a value between 1 and 100. The default is 5.") + @query + $top?: int32, + + ...ApiVersionParameter, + ...ClientRequestIdParameter, + ): AutocompleteResult | SearchError; + + @doc("Autocompletes incomplete query terms based on input text and matching terms in the index.") + @post + @route("search.post.autocomplete") + autocompletePost( + @doc("The definition of the Autocomplete request.") + @body + autocompleteRequest: AutocompleteRequest, + + ...ApiVersionParameter, + ...ClientRequestIdParameter, + ): AutocompleteResult | SearchError; + + @doc("Sends a batch of document write actions to the index.") + @post + @route("search.index") + index( + @doc("The batch of index actions.") + @body + batch: IndexBatch, + + ...ApiVersionParameter, + ...ClientRequestIdParameter, + ): IndexDocumentsResult | { + @statusCode statusCode: 207; + @body body: IndexDocumentsResult; + } | SearchError; + + @doc("Suggests documents in the index that match the given partial query text.") + @get + @route("search.suggest") + getSuggestion( + @doc("The search text to use to suggest documents. Must be at least 1 character, and no more than 100 characters.") + @query("search") + searchText: string, + + @doc("The name of the suggester as specified in the suggesters collection that's part of the index definition.") + @query + suggesterName: string, + + #suppress "@azure-tools/typespec-azure-core/casing-style" "Existing operation." + @doc("An OData expression that filters the documents considered for suggestions.") + @query + $filter?: string, + + @doc("A value indicating whether to use fuzzy matching for the suggestions query. Default is false. When set to true, the query will find terms even if there's a substituted or missing character in the search text. While this provides a better experience in some scenarios, it comes at a performance cost as fuzzy suggestions queries are slower and consume more resources.") + @query("fuzzy") + useFuzzyMatching?: boolean, + + @doc("A string tag that is appended to hit highlights. Must be set with highlightPreTag. If omitted, hit highlighting of suggestions is disabled.") + @query + highlightPostTag?: string, + + @doc("A string tag that is prepended to hit highlights. Must be set with highlightPostTag. If omitted, hit highlighting of suggestions is disabled.") + @query + highlightPreTag?: string, + + @doc("A number between 0 and 100 indicating the percentage of the index that must be covered by a suggestions query in order for the query to be reported as a success. This parameter can be useful for ensuring search availability even for services with only one replica. The default is 80.") + @query + minimumCoverage?: float64, + + #suppress "@azure-tools/typespec-azure-core/prefer-csv-collection-format" "Existing service" + @doc("The list of OData $orderby expressions by which to sort the results. Each expression can be either a field name or a call to either the geo.distance() or the search.score() functions. Each expression can be followed by asc to indicate ascending, or desc to indicate descending. The default is ascending order. Ties will be broken by the match scores of documents. If no $orderby is specified, the default sort order is descending by document match score. There can be at most 32 $orderby clauses.") + @query({ + name: "$orderby", + format: "multi", + }) + orderBy?: string[], + + #suppress "@azure-tools/typespec-azure-core/prefer-csv-collection-format" "Existing service" + @doc("The list of field names to search for the specified search text. Target fields must be included in the specified suggester.") + @query({ + format: "multi", + }) + searchFields?: string[], + + #suppress "@azure-tools/typespec-azure-core/casing-style" "Existing operation." + @doc("The list of fields to retrieve. If unspecified, only the key field will be included in the results.") + @query + $select?: string, + + #suppress "@azure-tools/typespec-azure-core/casing-style" "Existing operation." + @doc("The number of suggestions to retrieve. The value must be a number between 1 and 100. The default is 5.") + @query + $top?: int32, + + ...ApiVersionParameter, + ...ClientRequestIdParameter, + ): SuggestDocumentsResult | SearchError; + + @doc("Search post suggest.") + @post + @route("search.post.suggest") + suggestPost( + @doc("The Suggest request.") + @body + suggestRequest: SuggestRequest, + + ...ApiVersionParameter, + ...ClientRequestIdParameter, + ): SuggestDocumentsResult | SearchError; +} + +// ISSUE: Can't respond with empty object: https://github.com/Azure/typespec-azure/issues/1122. +// They probably meant to have additonalProperties here? Surely this doesn't literally return `{}` always? +@tag("Documents") +@route("/docs('{key}')") +interface DocumentsByKey { + #suppress "@azure-tools/typespec-azure-core/use-standard-operations" "Existing service." + @doc("Retrieves a document from the index.") + @get + get( + @doc("The key") + @path + key: string, + + #suppress "@azure-tools/typespec-azure-core/prefer-csv-collection-format" "Existing service" + @doc("Selected fields") + @query({ + name: "$select", + format: "multi", + }) + selectedFields: string[], + + ...ApiVersionParameter, + ...ClientRequestIdParameter, + ): Body<{}> | SearchError; +} diff --git a/packages/samples/specs/data-plane/searchservice/common.tsp b/packages/samples/specs/data-plane/searchservice/common.tsp new file mode 100644 index 0000000000..be5954a0ce --- /dev/null +++ b/packages/samples/specs/data-plane/searchservice/common.tsp @@ -0,0 +1,92 @@ +import "@typespec/http"; +import "@typespec/rest"; +import "@typespec/openapi"; + +using TypeSpec.Http; +using TypeSpec.OpenAPI; + +namespace Azure.SearchService; + +@doc("The error object") +@error +model SearchError { + @doc("One of a server-defined set of error codes") + @visibility("read") + code: string; + + @doc("A human-readable representation of the error") + @visibility("read") + message: string; + + @doc("An array of details about specific errors that led to this reported error.") + @visibility("read") + details?: SearchError[]; +} + +model ApiVersionParameter { + #suppress "@azure-tools/typespec-azure-core/casing-style" "This is the name of a query parameter." + @doc("Client API version") + @TypeSpec.Http.query + `api-version`: string; +} + +// ISSUE: Can't set x-ms-parameter-grouping: https://github.com/Azure/typespec-azure/issues/1000 +// ISSUE: @extension on parameter doesn't work: https://github.com/Azure/typespec-azure/issues/1121 +model ClientRequestIdParameter { + #suppress "@azure-tools/typespec-azure-core/casing-style" "This is the name of an HTTP header." + @doc("The tracking ID sent with the request to help with debugging.") + @TypeSpec.Http.header + `x-ms-client-request-id`: string; +} + +model PreferHeaderParameter { + @doc("The tracking ID sent with the request to help with debugging.") + @TypeSpec.Http.header("Prefer") + prefer: "return=representation"; // BUGBUG. format needed, also missing few other custom x-ms flags +} + +model IfMatchParameter { + @doc("The tracking ID sent with the request to help with debugging.") + @TypeSpec.Http.header("If-Match") + ifMatch?: string; // BUGBUG. format needed, also missing few other custom x-ms flags +} + +model IfNoneMatchParameter { + @doc("Defines the If-None-Match condition. The operation will be performed only if the ETag on the server does not match this value.") + @TypeSpec.Http.header("If-None-Match") + ifNoneMatch?: string; +} + +model SelectParameter { + @doc("Selects which top-level properties of the resource to retrieve. Specified as a comma-separated list of JSON property names, or '*' for all properties. The default is all properties.") + @TypeSpec.Http.query + $select?: string; +} + +model CollectionResult { + @extension("x-ms-client-name", N) + value: T; +} + +model SearchCreatedResponse { + ...CreatedResponse; + @body body: T; +} + +model ETag { + @projectedName("json", "@odata.etag") + @doc("The ETag of the resource.") + eTag: string; +} + +model IgnoreResetRequirementsParameter { + @doc("Ignores cache reset requirements.") + @query("ignoreResetRequirements") + skipIndexerResetRequirementForCache?: boolean; +} + +model DisableCacheReprocessingChangeDetectionParameter { + @doc("Disables cache reprocessing change detection.") + @query + disableCacheReprocessingChangeDetection?: boolean; +} diff --git a/packages/samples/specs/data-plane/searchservice/dataIdentity.model.tsp b/packages/samples/specs/data-plane/searchservice/dataIdentity.model.tsp new file mode 100644 index 0000000000..093ab23dd2 --- /dev/null +++ b/packages/samples/specs/data-plane/searchservice/dataIdentity.model.tsp @@ -0,0 +1,8 @@ +namespace Azure.SearchService; + +model SearchIndexerDataIdentity { + @doc("Identifies the concrete type of the identity.") + `@odata.type`: string; +} + +model SearchIndexerDataNoneIdentity extends SearchIndexerDataIdentity {} diff --git a/packages/samples/specs/data-plane/searchservice/dataPolicy.model.tsp b/packages/samples/specs/data-plane/searchservice/dataPolicy.model.tsp new file mode 100644 index 0000000000..6aba2e0903 --- /dev/null +++ b/packages/samples/specs/data-plane/searchservice/dataPolicy.model.tsp @@ -0,0 +1,13 @@ +namespace Azure.SearchService; + +@doc("Base type for data change detection policies.") +model DataChangeDetectionPolicy { + @doc("Identifies the concrete type of the data change detection policy.") + `@odata.type`: string; +} + +@doc("Base type for data deletion detection policies.") +model DataDeletionDetectionPolicy { + @doc("Identifies the concrete type of the data deletion detection policy.") + `@odata.type`: string; +} diff --git a/packages/samples/specs/data-plane/searchservice/languages.tsp b/packages/samples/specs/data-plane/searchservice/languages.tsp new file mode 100644 index 0000000000..0d46f81530 --- /dev/null +++ b/packages/samples/specs/data-plane/searchservice/languages.tsp @@ -0,0 +1,213 @@ +namespace Azure.SearchService; + +@doc("The language codes supported for input text by KeyPhraseExtractionSkill.") +enum KeyPhraseExtractionSkillLanguage { + @doc("Danish") da, + @doc("Dutch") nl, + @doc("English") en, + @doc("Finnish") fi, + @doc("French") fr, + @doc("German") de, + @doc("Italian") it, + @doc("Japanese") ja, + @doc("Korean") ko, + @doc("Norwegian (Bokmaal)") no, + @doc("Polish") pl, + @doc("Portuguese (Portugal)") `pt-PT`, + @doc("Portuguese (Brazil)") `pt-BR`, + @doc("Russian") ru, + @doc("Spanish") es, + @doc("Swedish") sv, +} + +@doc("The language codes supported for input by OcrSkill.") +enum OcrSkillLanguage { + @doc("Chinese-Simplified") `zh-Hans`, + @doc("Chinese-Traditional") `zh-Hant`, + @doc("Czech") cs, + @doc("Danish") da, + @doc("Dutch") nl, + @doc("English") en, + @doc("Finnish") fi, + @doc("French") fr, + @doc("German") de, + @doc("Greek") el, + @doc("Hungarian") hu, + @doc("Italian") it, + @doc("Japanese") ja, + @doc("Korean") ko, + @doc("Norwegian (Bokmaal)") nb, + @doc("Polish") pl, + @doc("Portuguese") pt, + @doc("Russian") ru, + @doc("Spanish") es, + @doc("Swedish") sv, + @doc("Turkish") tr, + @doc("Arabic") ar, + @doc("Romanian") ro, + @doc("Serbian (Cyrillic, Serbia)") `sr-Cyrl`, + @doc("Serbian (Latin, Serbia)") `sr-Latn`, + @doc("Slovak") sk, + + @doc("Unknown. If the language is explicitly set to \"unk\", the language will be auto-detected.") + unk, +} + +@doc("The language codes supported for input by ImageAnalysisSkill.") +enum ImageAnalysisSkillLanguage { + @doc("English") en, + @doc("Spanish") es, + @doc("Japanese") ja, + @doc("Portuguese") pt, + @doc("Chinese") zh, +} + +@doc("The language codes supported for input text by EntityRecognitionSkill.") +enum EntityRecognitionSkillLanguage { + @doc("Arabic") ar, + @doc("Czech") cs, + @doc("Chinese-Simplified") `zh-Hans`, + @doc("Chinese-Traditional") `zh-Hant`, + @doc("Danish") da, + @doc("Dutch") nl, + @doc("English") en, + @doc("Finnish") fi, + @doc("French") fr, + @doc("German") de, + @doc("Greek") el, + @doc("Hungarian") hu, + @doc("Italian") it, + @doc("Japanese") ja, + @doc("Korean") ko, + @doc("Norwegian (Bokmaal)") no, + @doc("Polish") pl, + @doc("Portuguese (Portugal)") `pt-PT`, + @doc("Portuguese (Brazil)") `pt-BR`, + @doc("Russian") ru, + @doc("Spanish") es, + @doc("Swedish") sv, + @doc("Turkish") tr, +} + +@doc("The language codes supported for input text by SentimentSkill.") +enum SentimentSkillLanguage { + @doc("Danish") da, + @doc("Dutch") nl, + @doc("English") en, + @doc("Finnish") fi, + @doc("French") fr, + @doc("German") de, + @doc("Greek") el, + @doc("Italian") it, + @doc("Japanese") ja, + @doc("Korean") ko, + @doc("Norwegian (Bokmaal)") no, + @doc("Polish") pl, + @doc("Portuguese (Portugal)") `pt-PT`, + @doc("Russian") ru, + @doc("Spanish") es, + @doc("Swedish") sv, + @doc("Turkish") tr, +} + +@doc("The language codes supported for input text by SplitSkill.") +enum SplitSkillLanguage { + @doc("Danish") da, + @doc("German") de, + @doc("English") en, + @doc("Spanish") es, + @doc("Finnish") fi, + @doc("French") fr, + @doc("Italian") it, + @doc("Korean") ko, + @doc("Portuguese") pt, +} + +@doc("The language codes supported for input text by CustomEntityLookupSkill.") +enum CustomEntityLookupSkillLanguage { + @doc("Danish") da, + @doc("German") de, + @doc("English") en, + @doc("Spanish") es, + @doc("Finnish") fi, + @doc("French") fr, + @doc("Italian") it, + @doc("Korean") ko, + @doc("Portuguese") pt, +} + +@doc("The language codes supported for input text by TextTranslationSkill.") +enum TextTranslationSkillLanguage { + @doc("Afrikaans") af, + @doc("Arabic") ar, + @doc("Bangla") bn, + @doc("Bosnian (Latin)") bs, + @doc("Bulgarian") bg, + @doc("Cantonese (Traditional)") yue, + @doc("Catalan") ca, + @doc("Chinese Simplified") `zh-Hans`, + @doc("Chinese Traditional") `zh-Hant`, + @doc("Croatian") hr, + @doc("Czech") cs, + @doc("Danish") da, + @doc("Dutch") nl, + @doc("English") en, + @doc("Estonian") et, + @doc("Fijian") fj, + @doc("Filipino") fil, + @doc("Finnish") fi, + @doc("French") fr, + @doc("German") de, + @doc("Greek") el, + @doc("Haitian Creole") ht, + @doc("Hebrew") he, + @doc("Hindi") hi, + @doc("Hmong Daw") mww, + @doc("Hungarian") hu, + @doc("Icelandic") `is`, + @doc("Indonesian") id, + @doc("Italian") it, + @doc("Japanese") ja, + @doc("Kiswahili") sw, + @doc("Klingon") tlh, + @doc("Klingon (Latin script)") `tlh-Latn`, + @doc("Klingon (Klingon script)") `tlh-Piqd`, + @doc("Korean") ko, + @doc("Latvian") lv, + @doc("Lithuanian") lt, + @doc("Malagasy") mg, + @doc("Malay") ms, + @doc("Maltese") mt, + @doc("Norwegian") nb, + @doc("Persian") fa, + @doc("Polish") pl, + @doc("Portuguese") pt, + @doc("Portuguese (Brazil)") `pt-br`, + @doc("Portuguese (Portugal)") `pt-PT`, + @doc("Queretaro Otomi") otq, + @doc("Romanian") ro, + @doc("Russian") ru, + @doc("Samoan") sm, + @doc("Serbian (Cyrillic)") `sr-Cyrl`, + @doc("Serbian (Latin)") `sr-Latn`, + @doc("Slovak") sk, + @doc("Slovenian") sl, + @doc("Spanish") es, + @doc("Swedish") sv, + @doc("Tahitian") ty, + @doc("Tamil") ta, + @doc("Telugu") te, + @doc("Thai") th, + @doc("Tongan") to, + @doc("Turkish") tr, + @doc("Ukrainian") uk, + @doc("Urdu") ur, + @doc("Vietnamese") vi, + @doc("Welsh") cy, + @doc("Yucatec Maya") yua, + @doc("Irish") ga, + @doc("Kannada") kn, + @doc("Maori") mi, + @doc("Malayalam") ml, + @doc("Punjabi") pa, +} diff --git a/packages/samples/specs/data-plane/searchservice/main.tsp b/packages/samples/specs/data-plane/searchservice/main.tsp new file mode 100644 index 0000000000..82c22ae278 --- /dev/null +++ b/packages/samples/specs/data-plane/searchservice/main.tsp @@ -0,0 +1,4 @@ +import "./search-datasource.ops.tsp"; +import "./search-indexer.ops.tsp"; +import "./search-index.ops.tsp"; +import "./skills.ops.tsp"; diff --git a/packages/samples/specs/data-plane/searchservice/search-datasource.ops.tsp b/packages/samples/specs/data-plane/searchservice/search-datasource.ops.tsp new file mode 100644 index 0000000000..97e8b66622 --- /dev/null +++ b/packages/samples/specs/data-plane/searchservice/search-datasource.ops.tsp @@ -0,0 +1,89 @@ +import "@typespec/http"; +import "@typespec/rest"; + +import "./searchservice.models.tsp"; + +namespace Azure.SearchService; + +using TypeSpec.Http; +using TypeSpec.Rest; +using TypeSpec.Rest.Resource; + +@tag("DataSources") +interface DatasourcesApis { + @route("/datasources") + @doc("Lists all indexe data sources available for a search service.") + @get + list(...SelectParameter, ...ClientRequestIdParameter, ...ApiVersionParameter): CollectionResult< + SearchIndexerDataSource, + "DataSources" + > | SearchError; + + @route("/datasources") + @doc("Creates a new datasource.") + @post + create( + @doc("The definition of the data source to create.") + @body + body: SearchIndexerDataSource, + + ...ClientRequestIdParameter, + ...ApiVersionParameter, + ): SearchCreatedResponse | SearchError; + + @doc("Retrieves an index definition.") + @route("/datasources('{dataSourceName}')") + @get + get( + @doc("The name of the data source to retrieve.") + @path + dataSourceName: string, + + ...ClientRequestIdParameter, + ...ApiVersionParameter, + ): SearchIndexerDataSource | SearchError; + + @doc("Creates a new search data source or updates an data source if it already exists.") + @route("/datasources('{dataSourceName}')") + @put + createOrUpdate( + @doc("The name of the data source to create or update.") + @path + dataSourceName: string, + + @doc("The definition of the data source to create or update.") + @body + body: SearchIndexerDataSource, + + ...IgnoreResetRequirementsParameter, + ...ClientRequestIdParameter, + ...IfMatchParameter, + ...IfNoneMatchParameter, + ...PreferHeaderParameter, + ...ApiVersionParameter, + ): SearchIndexerDataSource | SearchCreatedResponse | SearchError; + + @doc("Deletes a datasource.") + @route("/datasources('{dataSourceName}')") + @delete + delete( + @doc("The name of the data source to delete.") + @path + dataSourceName: string, + + ...ClientRequestIdParameter, + ...IfMatchParameter, + ...IfNoneMatchParameter, + ...ApiVersionParameter, + ): NoContentResponse | NotFoundResponse | SearchError; +} + +@tag("Service") +interface ServiceApis { + @get + @route("servicestats") + GetServiceStatistics( + ...ClientRequestIdParameter, + ...ApiVersionParameter, + ): ServiceStatistics | SearchError; +} diff --git a/packages/samples/specs/data-plane/searchservice/search-index.models.tsp b/packages/samples/specs/data-plane/searchservice/search-index.models.tsp new file mode 100644 index 0000000000..275deb431e --- /dev/null +++ b/packages/samples/specs/data-plane/searchservice/search-index.models.tsp @@ -0,0 +1,1630 @@ +import "./searchservice.models.tsp"; + +using TypeSpec.OpenAPI; +using TypeSpec.Rest; + +namespace Azure.SearchService; + +@doc("Represents a search index definition, which describes the fields and search behavior of an index.") +model SearchIndex { + ...ETag; + + @doc("The name of the index.") + name: string; + + @doc("The fields of the index.") + fields: SearchField[]; + + @doc("The scoring profiles for the index.") + scoringProfiles?: ScoringProfile[]; + + @doc("The name of the scoring profile to use if none is specified in the query. If this property is not set and no scoring profile is specified in the query, then default scoring (tf-idf) will be used.") + defaultScoringProfile?: string; + + @doc("Options to control Cross-Origin Resource Sharing (CORS) for the index.") + corsOptions?: CorsOptions; + + @doc("The suggesters for the index.") + suggesters?: Suggester; + + @doc("The analyzers for the index.") + analyzers?: LexicalAnalyzer; + + @doc("The tokenizers for the index.") + tokenizers?: LexicalTokenizer; + + @doc("The token filters for the index.") + tokenFilter?: TokenFilter; + + @doc("The character filters for the index.") + charFilters?: CharFilter; + + @doc("The normalizers for the index.") + normalizers?: LexicalNormalizer; + + @doc("A description of an encryption key that you create in Azure Key Vault. This key is used to provide an additional level of encryption-at-rest for your data when you want full assurance that no one, not even Microsoft, can decrypt your data in Azure Cognitive Search. Once you have encrypted your data, it will always remain encrypted. Azure Cognitive Search will ignore attempts to set this property to null. You can change this property as needed if you want to rotate your encryption key; Your data will be unaffected. Encryption with customer-managed keys is not available for free search services, and is only available for paid services created on or after January 1, 2019.") + encryptionKey?: SearchResourceEncryptionKey; + + @doc("The type of similarity algorithm to be used when scoring and ranking the documents matching a search query. The similarity algorithm can only be defined at index creation time and cannot be modified on existing indexes. If null, the ClassicSimilarity algorithm is used.") + similarity?: Similarity; + + @doc("Defines parameters for a search index that influence semantic capabilities.") + semantic?: SemanticSettings; +} + +@doc("Represents a field in an index definition, which describes the name, data type, and search behavior of a field.") +model SearchField { + @doc("The name of the field, which must be unique within the fields collection of the index or parent field.") + name: string; + + @doc("The data type of the field.") + type: SearchFieldDataType; + + @doc("A value indicating whether the field uniquely identifies documents in the index. Exactly one top-level field in each index must be chosen as the key field and it must be of type Edm.String. Key fields can be used to look up documents directly and update or delete specific documents. Default is false for simple fields and null for complex fields.") + key?: boolean; + + @doc("A value indicating whether the field can be returned in a search result. You can disable this option if you want to use a field (for example, margin) as a filter, sorting, or scoring mechanism but do not want the field to be visible to the end user. This property must be true for key fields, and it must be null for complex fields. This property can be changed on existing fields. Enabling this property does not cause any increase in index storage requirements. Default is true for simple fields and null for complex fields.") + retrievable?: boolean; + + @doc("A value indicating whether the field is full-text searchable. This means it will undergo analysis such as word-breaking during indexing. If you set a searchable field to a value like \"sunny day\", internally it will be split into the individual tokens \"sunny\" and \"day\". This enables full-text searches for these terms. Fields of type Edm.String or Collection(Edm.String) are searchable by default. This property must be false for simple fields of other non-string data types, and it must be null for complex fields. Note: searchable fields consume extra space in your index since Azure Cognitive Search will store an additional tokenized version of the field value for full-text searches. If you want to save space in your index and you don't need a field to be included in searches, set searchable to false.") + searchable?: boolean; + + @doc("A value indicating whether to enable the field to be referenced in $filter queries. filterable differs from searchable in how strings are handled. Fields of type Edm.String or Collection(Edm.String) that are filterable do not undergo word-breaking, so comparisons are for exact matches only. For example, if you set such a field f to \"sunny day\", $filter=f eq 'sunny' will find no matches, but $filter=f eq 'sunny day' will. This property must be null for complex fields. Default is true for simple fields and null for complex fields.") + filterable?: boolean; + + @doc("A value indicating whether to enable the field to be referenced in $orderby expressions. By default Azure Cognitive Search sorts results by score, but in many experiences users will want to sort by fields in the documents. A simple field can be sortable only if it is single-valued (it has a single value in the scope of the parent document). Simple collection fields cannot be sortable, since they are multi-valued. Simple sub-fields of complex collections are also multi-valued, and therefore cannot be sortable. This is true whether it's an immediate parent field, or an ancestor field, that's the complex collection. Complex fields cannot be sortable and the sortable property must be null for such fields. The default for sortable is true for single-valued simple fields, false for multi-valued simple fields, and null for complex fields.") + sortable?: boolean; + + @doc("A value indicating whether to enable the field to be referenced in facet queries. Typically used in a presentation of search results that includes hit count by category (for example, search for digital cameras and see hits by brand, by megapixels, by price, and so on). This property must be null for complex fields. Fields of type Edm.GeographyPoint or Collection(Edm.GeographyPoint) cannot be facetable. Default is true for all other simple fields.") + facetable?: boolean; + + @doc("The name of the analyzer to use for the field. This option can be used only with searchable fields and it can't be set together with either searchAnalyzer or indexAnalyzer. Once the analyzer is chosen, it cannot be changed for the field. Must be null for complex fields.") + analyzer?: LexicalAnalyzerName; + + @doc("The name of the analyzer used at search time for the field. This option can be used only with searchable fields. It must be set together with indexAnalyzer and it cannot be set together with the analyzer option. This property cannot be set to the name of a language analyzer; use the analyzer property instead if you need a language analyzer. This analyzer can be updated on an existing field. Must be null for complex fields.") + searchAnalyzer?: LexicalAnalyzerName; + + @doc("The name of the analyzer used at indexing time for the field. This option can be used only with searchable fields. It must be set together with searchAnalyzer and it cannot be set together with the analyzer option. This property cannot be set to the name of a language analyzer; use the analyzer property instead if you need a language analyzer. Once the analyzer is chosen, it cannot be changed for the field. Must be null for complex fields.") + indexAnalyzer?: LexicalAnalyzerName; + + @doc("The name of the normalizer to use for the field. This option can be used only with fields with filterable, sortable, or facetable enabled. Once the normalizer is chosen, it cannot be changed for the field. Must be null for complex fields.") + normalizer?: LexicalNormalizerName; + + @doc("A list of the names of synonym maps to associate with this field. This option can be used only with searchable fields. Currently only one synonym map per field is supported. Assigning a synonym map to a field ensures that query terms targeting that field are expanded at query-time using the rules in the synonym map. This attribute can be changed on existing fields. Must be null or an empty collection for complex fields.") + synonymMaps: string[]; + + @doc("A list of sub-fields if this is a field of type Edm.ComplexType or Collection(Edm.ComplexType). Must be null or empty for simple fields.") + fields?: SearchField[]; +} + +@doc("Defines the data type of a field in a search index.") +enum SearchFieldDataType { + @doc("Indicates that a field contains a string.") + String: "Edm.String", + + @doc("Indicates that a field contains a 32-bit signed integer.") + Int32: "Edm.Int32", + + @doc("Indicates that a field contains a 64-bit signed integer.") + Int64: "Edm.Int64", + + @doc("Indicates that a field contains an IEEE double-precision floating point number.") + Double: "Edm.Double", + + @doc("Indicates that a field contains a Boolean value (true or false).") + Boolean: "Edm.Boolean", + + @doc("Indicates that a field contains a date/time value, including timezone information.") + DateTimeOffset: "Edm.DateTimeOffset", + + @doc("Indicates that a field contains a geo-location in terms of longitude and latitude.") + GeographyPoint: "Edm.GeographyPoint", + + @doc("Indicates that a field contains one or more complex objects that in turn have sub-fields of other types.") + ComplexType: "Edm.ComplexType", +} + +@doc("Defines the names of all text analyzers supported by Azure Cognitive Search.") +enum LexicalAnalyzerName { + @doc("Microsoft analyzer for Arabic.") + ArMicrosoft: "ar.microsoft", + + @doc("Lucene analyzer for Arabic.") + ArLucene: "ar.lucene", + + @doc("Lucene analyzer for Armenian.") + HyLucene: "hy.lucene", + + @doc("Microsoft analyzer for Bangla.") + BnMicrosoft: "bn.microsoft", + + @doc("Lucene analyzer for Basque.") + EuLucene: "eu.lucene", + + @doc("Microsoft analyzer for Bulgarian.") + BgMicrosoft: "bg.microsoft", + + @doc("Lucene analyzer for Bulgarian.") + BgLucene: "bg.lucene", + + @doc("Microsoft analyzer for Catalan.") + CaMicrosoft: "ca.microsoft", + + @doc("Lucene analyzer for Catalan.") + CaLucene: "ca.lucene", + + @doc("Microsoft analyzer for Chinese (Simplified).") + ZhHansMicrosoft: "zh-Hans.microsoft", + + @doc("Lucene analyzer for Chinese (Simplified).") + ZhHansLucene: "zh-Hans.lucene", + + @doc("Microsoft analyzer for Chinese (Traditional).") + ZhHantMicrosoft: "zh-Hant.microsoft", + + @doc("Lucene analyzer for Chinese (Traditional).") + ZhHantLucene: "zh-Hant.lucene", + + @doc("Microsoft analyzer for Croatian.") + HrMicrosoft: "hr.microsoft", + + @doc("Microsoft analyzer for Czech.") + CsMicrosoft: "cs.microsoft", + + @doc("Lucene analyzer for Czech.") + CsLucene: "cs.lucene", + + @doc("Microsoft analyzer for Danish.") + DaMicrosoft: "da.microsoft", + + @doc("Lucene analyzer for Danish.") + DaLucene: "da.lucene", + + @doc("Microsoft analyzer for Dutch.") + NlMicrosoft: "nl.microsoft", + + @doc("Lucene analyzer for Dutch.") + NlLucene: "nl.lucene", + + @doc("Microsoft analyzer for English.") + EnMicrosoft: "en.microsoft", + + @doc("Lucene analyzer for English.") + EnLucene: "en.lucene", + + @doc("Microsoft analyzer for Estonian.") + EtMicrosoft: "et.microsoft", + + @doc("Microsoft analyzer for Finnish.") + FiMicrosoft: "fi.microsoft", + + @doc("Lucene analyzer for Finnish.") + FiLucene: "fi.lucene", + + @doc("Microsoft analyzer for French.") + FrMicrosoft: "fr.microsoft", + + @doc("Lucene analyzer for French.") + FrLucene: "fr.lucene", + + @doc("Lucene analyzer for Galician.") + GlLucene: "gl.lucene", + + @doc("Microsoft analyzer for German.") + DeMicrosoft: "de.microsoft", + + @doc("Lucene analyzer for German.") + DeLucene: "de.lucene", + + @doc("Microsoft analyzer for Greek.") + ElMicrosoft: "el.microsoft", + + @doc("Lucene analyzer for Greek.") + ElLucene: "el.lucene", + + @doc("Microsoft analyzer for Gujarati.") + GuMicrosoft: "gu.microsoft", + + @doc("Microsoft analyzer for Hebrew.") + HeMicrosoft: "he.microsoft", + + @doc("Microsoft analyzer for Hindi.") + HiMicrosoft: "hi.microsoft", + + @doc("Lucene analyzer for Hindi.") + HiLucene: "hi.lucene", + + @doc("Microsoft analyzer for Hungarian.") + HuMicrosoft: "hu.microsoft", + + @doc("Lucene analyzer for Hungarian.") + HuLucene: "hu.lucene", + + @doc("Microsoft analyzer for Icelandic.") + IsMicrosoft: "is.microsoft", + + @doc("Microsoft analyzer for Indonesian (Bahasa).") + IdMicrosoft: "id.microsoft", + + @doc("Lucene analyzer for Indonesian.") + IdLucene: "id.lucene", + + @doc("Lucene analyzer for Irish.") + GaLucene: "ga.lucene", + + @doc("Microsoft analyzer for Italian.") + ItMicrosoft: "it.microsoft", + + @doc("Lucene analyzer for Italian.") + ItLucene: "it.lucene", + + @doc("Microsoft analyzer for Japanese.") + JaMicrosoft: "ja.microsoft", + + @doc("Lucene analyzer for Japanese.") + JaLucene: "ja.lucene", + + @doc("Microsoft analyzer for Kannada.") + KnMicrosoft: "kn.microsoft", + + @doc("Microsoft analyzer for Korean.") + KoMicrosoft: "ko.microsoft", + + @doc("Lucene analyzer for Korean.") + KoLucene: "ko.lucene", + + @doc("Microsoft analyzer for Latvian.") + LvMicrosoft: "lv.microsoft", + + @doc("Lucene analyzer for Latvian.") + LvLucene: "lv.lucene", + + @doc("Microsoft analyzer for Lithuanian.") + LtMicrosoft: "lt.microsoft", + + @doc("Microsoft analyzer for Malayalam.") + MlMicrosoft: "ml.microsoft", + + @doc("Microsoft analyzer for Malay (Latin).") + MsMicrosoft: "ms.microsoft", + + @doc("Microsoft analyzer for Marathi.") + MrMicrosoft: "mr.microsoft", + + @doc("Microsoft analyzer for Norwegian (Bokmål).") + NbMicrosoft: "nb.microsoft", + + @doc("Lucene analyzer for Norwegian.") + NoLucene: "no.lucene", + + @doc("Lucene analyzer for Persian.") + FaLucene: "fa.lucene", + + @doc("Microsoft analyzer for Polish.") + PlMicrosoft: "pl.microsoft", + + @doc("Lucene analyzer for Polish.") + PlLucene: "pl.lucene", + + @doc("Microsoft analyzer for Portuguese (Brazil).") + PtBrMicrosoft: "pt-BR.microsoft", + + @doc("Lucene analyzer for Portuguese (Brazil).") + PtBrLucene: "pt-BR.lucene", + + @doc("Microsoft analyzer for Portuguese (Portugal).") + PtPtMicrosoft: "pt-PT.microsoft", + + @doc("Lucene analyzer for Portuguese (Portugal).") + PtPtLucene: "pt-PT.lucene", + + @doc("Microsoft analyzer for Punjabi.") + PaMicrosoft: "pa.microsoft", + + @doc("Microsoft analyzer for Romanian.") + RoMicrosoft: "ro.microsoft", + + @doc("Lucene analyzer for Romanian.") + RoLucene: "ro.lucene", + + @doc("Microsoft analyzer for Russian.") + RuMicrosoft: "ru.microsoft", + + @doc("Lucene analyzer for Russian.") + RuLucene: "ru.lucene", + + @doc("Microsoft analyzer for Serbian (Cyrillic).") + SrCyrillicMicrosoft: "sr-cyrillic.microsoft", + + @doc("Microsoft analyzer for Serbian (Latin).") + SrLatinMicrosoft: "sr-latin.microsoft", + + @doc("Microsoft analyzer for Slovak.") + SkMicrosoft: "sk.microsoft", + + @doc("Microsoft analyzer for Slovenian.") + SlMicrosoft: "sl.microsoft", + + @doc("Microsoft analyzer for Spanish.") + EsMicrosoft: "es.microsoft", + + @doc("Lucene analyzer for Spanish.") + EsLucene: "es.lucene", + + @doc("Microsoft analyzer for Swedish.") + SvMicrosoft: "sv.microsoft", + + @doc("Lucene analyzer for Swedish.") + SvLucene: "sv.lucene", + + @doc("Microsoft analyzer for Tamil.") + TaMicrosoft: "ta.microsoft", + + @doc("Microsoft analyzer for Telugu.") + TeMicrosoft: "te.microsoft", + + @doc("Microsoft analyzer for Thai.") + ThMicrosoft: "th.microsoft", + + @doc("Lucene analyzer for Thai.") + ThLucene: "th.lucene", + + @doc("Microsoft analyzer for Turkish.") + TrMicrosoft: "tr.microsoft", + + @doc("Lucene analyzer for Turkish.") + TrLucene: "tr.lucene", + + @doc("Microsoft analyzer for Ukrainian.") + UkMicrosoft: "uk.microsoft", + + @doc("Microsoft analyzer for Urdu.") + UrMicrosoft: "ur.microsoft", + + @doc("Microsoft analyzer for Vietnamese.") + ViMicrosoft: "vi.microsoft", + + @doc("Standard Lucene analyzer.") + StandardLucene: "standard.lucene", + + @doc("Standard ASCII Folding Lucene analyzer. See https://docs.microsoft.com/rest/api/searchservice/Custom-analyzers-in-Azure-Search#Analyzers") + StandardAsciiFoldingLucene: "standardasciifolding.lucene", + + @doc("Treats the entire content of a field as a single token. This is useful for data like zip codes, ids, and some product names. See http://lucene.apache.org/core/4_10_3/analyzers-common/org/apache/lucene/analysis/core/KeywordAnalyzer.html") + Keyword: "keyword", + + @doc("Flexibly separates text into terms via a regular expression pattern. See http://lucene.apache.org/core/4_10_3/analyzers-common/org/apache/lucene/analysis/miscellaneous/PatternAnalyzer.html") + Pattern: "pattern", + + @doc("Divides text at non-letters and converts them to lower case. See http://lucene.apache.org/core/4_10_3/analyzers-common/org/apache/lucene/analysis/core/SimpleAnalyzer.html") + Simple: "simple", + + @doc("Divides text at non-letters; Applies the lowercase and stopword token filters. See http://lucene.apache.org/core/4_10_3/analyzers-common/org/apache/lucene/analysis/core/StopAnalyzer.html") + Stop: "stop", + + @doc("An analyzer that uses the whitespace tokenizer. See http://lucene.apache.org/core/4_10_3/analyzers-common/org/apache/lucene/analysis/core/WhitespaceAnalyzer.html") + Whitespace: "whitespace", +} + +@doc("Defines parameters for a search index that influence scoring in search queries.") +model ScoringProfile { + @doc("The name of the scoring profile.") + name: string; + + @doc("Parameters that boost scoring based on text matches in certain index fields.") + text?: TextWeights; + + @doc("The collection of functions that influence the scoring of documents.") + functions?: ScoringFunction[]; + + @doc("A value indicating how the results of individual scoring functions should be combined. Defaults to \"Sum\". Ignored if there are no scoring functions.") + functionAggregation?: ScoringFunctionAggregation; +} + +@doc("Defines weights on index fields for which matches should boost scoring in search queries.") +model TextWeights { + @doc("The dictionary of per-field weights to boost document scoring. The keys are field names and the values are the weights for each field.") + weights: Record; +} + +@doc("Base type for functions that can modify document scores during ranking.") +@discriminator("type") +model ScoringFunction { + @doc("The name of the field used as input to the scoring function.") + fieldName: string; + + @doc("A multiplier for the raw score. Must be a positive number not equal to 1.0.") + boost: float64; + + @doc("A value indicating how boosting will be interpolated across document scores; defaults to \"Linear\".") + interpolation?: ScoringFunctionInterpolation; +} + +@doc("Defines a function that boosts scores based on distance from a geographic location.") +model DistanceScoringFunction extends ScoringFunction { + type: "distance"; + + @doc("Parameter values for the distance scoring function.") + distance: DistanceScoringParameters; +} + +@doc("Provides parameter values to a distance scoring function.") +model DistanceScoringParameters { + @doc("The name of the parameter passed in search queries to specify the reference location.") + referencePointParameter: string; + + @doc("The distance in kilometers from the reference location where the boosting range ends.") + boostingDistance: float64; +} + +@doc("Defines a function that boosts scores based on the value of a date-time field.") +model FreshnessScoringFunction extends ScoringFunction { + type: "freshness"; + + @doc("Parameter values for the freshness scoring function.") + freshness: FreshnessScoringParameters; +} + +@doc("Provides parameter values to a freshness scoring function.") +model FreshnessScoringParameters { + @doc("The expiration period after which boosting will stop for a particular document.") + boostingDuration: duration; +} + +@doc("Defines a function that boosts scores based on the magnitude of a numeric field.") +model MagnitudeScoringFunction extends ScoringFunction { + type: "magnitude"; + + @doc("Parameter values for the magnitude scoring function.") + magnitude: MagnitudeScoringParameters; +} + +@doc("Provides parameter values to a magnitude scoring function.") +model MagnitudeScoringParameters { + @doc("The field value at which boosting stgarts.") + boostingRangeStart: float64; + + @doc("The field value at which boosting ends.") + boostingRangeEnd: float64; + + @doc("A value indicating whether to apply a constant boost for field values beyond the range end value; default is false.") + constantBoostBeyondRange?: boolean; +} + +@doc("Defines a function that boosts scores of documents with string values matching a given list of tags.") +model TagScoringFunction extends ScoringFunction { + type: "tag"; + + @doc("Parameter values for the tag scoring function.") + tag: TagScoringParameters; +} + +@doc("Provides parameter values to a tag scoring function.") +model TagScoringParameters { + @doc("The name of the parameter passed in search queries to specify the list of tags to compare against the target field.") + tagsParameter: string; +} + +@doc("Defines the function used to interpolate score boosting across a range of documents.") +enum ScoringFunctionInterpolation { + @doc("Boosts scores by a linearly decreasing amount. This is the default interpolation for scoring functions.") + Linear: "linear", + + @doc("Boosts scores by a constant factor.") + Constant: "constant", + + @doc("Boosts scores by an amount that decreases quadratically. Boosts decrease slowly for higher scores, and more quickly as the scores decrease. This interpolation option is not allowed in tag scoring functions.") + Quadratic: "quadratic", + + @doc("Boosts scores by an amount that decreases logarithmically. Boosts decrease quickly for higher scores, and more slowly as the scores decrease. This interpolation option is not allowed in tag scoring functions.") + Logarithmic: "logarithmic", +} + +@doc("Defines the aggregation function used to combine the results of all the scoring functions in a scoring profile.") +enum ScoringFunctionAggregation { + @doc("Boost scores by the sum of all scoring function results.") + Sum: "sum", + + @doc("Boost scores by the average of all scoring function results.") + Average: "average", + + @doc("Boost scores by the minimum of all scoring function results.") + Minimum: "minimum", + + @doc("Boost scores by the maximum of all scoring function results.") + Maximum: "maximum", + + @doc("Boost scores using the first applicable scoring function in the scoring profile.") + FirstMatching: "firstMatching", +} + +@doc("Defines options to control Cross-Origin Resource Sharing (CORS) for an index.") +model CorsOptions { + @doc("The list of origins from which JavaScript code will be granted access to your index. Can contain a list of hosts of the form {protocol}://{fully-qualified-domain-name}[:{port#}], or a single '*' to allow all origins (not recommended).") + allowedOrigins: string[]; + + @doc("The duration for which browsers should cache CORS preflight responses. Defaults to 5 minutes.") + maxAgeInSeconds?: int64; +} + +@doc("Defines how the Suggest API should apply to a group of fields in the index.") +model Suggester { + @doc("The name of the suggester.") + name: string; + + @doc("A value indicating the capabilities of the suggester.") + searchMode: SuggesterSearchMode; + + @doc("The list of field names to which the suggester applies. Each field must be searchable.") + sourceFields: string[]; +} + +@doc("A value indicating the capabilities of the suggester.") +enum SuggesterSearchMode { + @doc("Matches consecutive whole terms and prefixes in a field. For example, for the field 'The fastest brown fox', the queries 'fast' and 'fastest brow' would both match.") + AnalyzingInfixMatching: "analyzingInfixMatching", +} + +@doc("Base type for analyzers.") +@discriminator("@odata.type") +model LexicalAnalyzer { + @doc("The name of the analyzer. It must only contain letters, digits, spaces, dashes or underscores, can only start and end with alphanumeric characters, and is limited to 128 characters.") + name: string; +} + +@doc("Allows you to take control over the process of converting text into indexable/searchable tokens. It's a user-defined configuration consisting of a single predefined tokenizer and one or more filters. The tokenizer is responsible for breaking text into tokens, and the filters for modifying tokens emitted by the tokenizer.") +model CustomAnalyzer extends LexicalAnalyzer { + `@odata.type`: "#Microsoft.Azure.Search.CustomAnalyzer"; + + @doc("The name of the tokenizer to use to divide continuous text into a sequence of tokens, such as breaking a sentence into words.") + tokenizer: LexicalTokenizerName; + + @doc("A list of token filters used to filter out or modify the tokens generated by a tokenizer. For example, you can specify a lowercase filter that converts all characters to lowercase. The filters are run in the order in which they are listed.") + tokenFilters?: TokenFilterName[]; + + @doc("A list of character filters used to prepare input text before it is processed by the tokenizer. For instance, they can replace certain characters or symbols. The filters are run in the order in which they are listed.") + charFilters?: CharFilterName[]; +} + +@doc("Flexibly separates text into terms via a regular expression pattern. This analyzer is implemented using Apache Lucene.") +model PatternAnalyzer extends LexicalAnalyzer { + `@odata.type`: "#Microsoft.Azure.Search.PatternAnalyzer"; + + @doc("A value indicating whether terms should be lower-cased. Default is true.") + lowercase?: boolean = true; + + @doc("A regular expression pattern to match token separators. Default is an expression that matches one or more non-word characters.") + pattern?: string = "\\W+"; + + @doc("Regular expression flags.") + flags?: RegexFlags; + + @doc("A list of stopwords.") + stopwords: string[]; +} + +@doc("Standard Apache Lucene analyzer; Composed of the standard tokenizer, lowercase filter and stop filter.") +model LuceneStandardAnalyzer extends LexicalAnalyzer { + `@odata.type`: "#Microsoft.Azure.Search.StandardAnalyzer"; + + @doc("The maximum token length. Default is 255. Tokens longer than the maximum length are split. The maximum token length that can be used is 300 characters.") + @maxValue(300) + maxTokenLength?: int32 = 255; + + @doc("A list of stopwords.") + stopwords?: string[]; +} + +@doc("Divides text at non-letters; Applies the lowercase and stopword token filters. This analyzer is implemented using Apache Lucene.") +model StopAnalyzer extends LexicalAnalyzer { + `@odata.type`: "#Microsoft.Azure.Search.StopAnalyzer"; + + @doc("A list of stopwords.") + stopwords?: string[]; +} + +@doc("Defines the names of all tokenizers supported by Azure Cognitive Search.") +enum LexicalTokenizerName { + @doc("Grammar-based tokenizer that is suitable for processing most European-language documents. See http://lucene.apache.org/core/4_10_3/analyzers-common/org/apache/lucene/analysis/standard/ClassicTokenizer.html") + Classic: "classic", + + @doc("Tokenizes the input from an edge into n-grams of the given size(s). See https://lucene.apache.org/core/4_10_3/analyzers-common/org/apache/lucene/analysis/ngram/EdgeNGramTokenizer.html") + EdgeNGram: "edgeNGram", + + @doc("Emits the entire input as a single token. See http://lucene.apache.org/core/4_10_3/analyzers-common/org/apache/lucene/analysis/core/KeywordTokenizer.html") + Keyword: "keyword_v2", + + @doc("Divides text at non-letters. See http://lucene.apache.org/core/4_10_3/analyzers-common/org/apache/lucene/analysis/core/LetterTokenizer.html") + Letter: "letter", + + @doc("Divides text at non-letters and converts them to lower case. See http://lucene.apache.org/core/4_10_3/analyzers-common/org/apache/lucene/analysis/core/LowerCaseTokenizer.html") + Lowercase: "lowercase", + + @doc("Divides text using language-specific rules.") + MicrosoftLanguageTokenizer: "microsoft_language_tokenizer", + + @doc("Divides text using language-specific rules and reduces words to their base forms.") + MicrosoftLanguageStemmingTokenizer: "microsoft_language_stemming_tokenizer", + + @doc("Tokenizes the input into n-grams of the given size(s). See http://lucene.apache.org/core/4_10_3/analyzers-common/org/apache/lucene/analysis/ngram/NGramTokenizer.html") + NGram: "nGram", + + @doc("Tokenizer for path-like hierarchies. See http://lucene.apache.org/core/4_10_3/analyzers-common/org/apache/lucene/analysis/path/PathHierarchyTokenizer.html") + PathHierarchy: "path_hierarchy_v2", + + @doc("Tokenizer that uses regex pattern matching to construct distinct tokens. See http://lucene.apache.org/core/4_10_3/analyzers-common/org/apache/lucene/analysis/pattern/PatternTokenizer.html") + Pattern: "pattern", + + @doc("Standard Lucene analyzer; Composed of the standard tokenizer, lowercase filter and stop filter. See http://lucene.apache.org/core/4_10_3/analyzers-common/org/apache/lucene/analysis/standard/StandardTokenizer.html") + Standard: "standard_v2", + + @doc("Tokenizes urls and emails as one token. See http://lucene.apache.org/core/4_10_3/analyzers-common/org/apache/lucene/analysis/standard/UAX29URLEmailTokenizer.html") + UaxUrlEmail: "uax_url_email", + + @doc("Divides text at whitespace. See http://lucene.apache.org/core/4_10_3/analyzers-common/org/apache/lucene/analysis/core/WhitespaceTokenizer.html") + Whitespace: "whitespace", +} + +@doc("Defines the names of all token filters supported by Azure Cognitive Search.") +enum TokenFilterName { + @doc("A token filter that applies the Arabic normalizer to normalize the orthography. See http://lucene.apache.org/core/4_10_3/analyzers-common/org/apache/lucene/analysis/ar/ArabicNormalizationFilter.html") + ArabicNormalization: "arabic_normalization", + + @doc("Strips all characters after an apostrophe (including the apostrophe itself). See http://lucene.apache.org/core/4_10_3/analyzers-common/org/apache/lucene/analysis/tr/ApostropheFilter.html") + Apostrophe: "apostrophe", + + @doc("Converts alphabetic, numeric, and symbolic Unicode characters which are not in the first 127 ASCII characters (the \"Basic Latin\" Unicode block) into their ASCII equivalents, if such equivalents exist. See http://lucene.apache.org/core/4_10_3/analyzers-common/org/apache/lucene/analysis/miscellaneous/ASCIIFoldingFilter.html") + Asciifolding: "asciifolding", + + @doc("Forms bigrams of CJK terms that are generated from the standard tokenizer. See http://lucene.apache.org/core/4_10_3/analyzers-common/org/apache/lucene/analysis/cjk/CJKBigramFilter.html") + CjkBigram: "cjk_bigram", + + @doc("Normalizes CJK width differences. Folds fullwidth ASCII variants into the equivalent basic Latin, and half-width Katakana variants into the equivalent Kana. See http://lucene.apache.org/core/4_10_3/analyzers-common/org/apache/lucene/analysis/cjk/CJKWidthFilter.html") + CjkWidth: "cjk_width", + + @doc("Removes English possessives, and dots from acronyms. See http://lucene.apache.org/core/4_10_3/analyzers-common/org/apache/lucene/analysis/standard/ClassicFilter.html") + Classic: "classic", + + @doc("Construct bigrams for frequently occurring terms while indexing. Single terms are still indexed too, with bigrams overlaid. See http://lucene.apache.org/core/4_10_3/analyzers-common/org/apache/lucene/analysis/commongrams/CommonGramsFilter.html") + CommonGram: "common_grams", + + @doc("Generates n-grams of the given size(s) starting from the front or the back of an input token. See http://lucene.apache.org/core/4_10_3/analyzers-common/org/apache/lucene/analysis/ngram/EdgeNGramTokenFilter.html") + EdgeNGram: "edgeNGram_v2", + + @doc("Removes elisions. For example, \"l'avion\" (the plane) will be converted to \"avion\" (plane). See http://lucene.apache.org/core/4_10_3/analyzers-common/org/apache/lucene/analysis/util/ElisionFilter.html") + Elision: "elision", + + @doc("Normalizes German characters according to the heuristics of the German2 snowball algorithm. See http://lucene.apache.org/core/4_10_3/analyzers-common/org/apache/lucene/analysis/de/GermanNormalizationFilter.html") + GermanNormalization: "german_normalization", + + @doc("Normalizes text in Hindi to remove some differences in spelling variations. See http://lucene.apache.org/core/4_10_3/analyzers-common/org/apache/lucene/analysis/hi/HindiNormalizationFilter.html") + HindiNormalization: "hindi_normalization", + + @doc("Normalizes the Unicode representation of text in Indian languages. See http://lucene.apache.org/core/4_10_3/analyzers-common/org/apache/lucene/analysis/in/IndicNormalizationFilter.html") + IndicNormalization: "indic_normalization", + + @doc("Emits each incoming token twice, once as keyword and once as non-keyword. See http://lucene.apache.org/core/4_10_3/analyzers-common/org/apache/lucene/analysis/miscellaneous/KeywordRepeatFilter.html") + KeywordRepeat: "keyword_repeat", + + @doc("A high-performance kstem filter for English. See http://lucene.apache.org/core/4_10_3/analyzers-common/org/apache/lucene/analysis/en/KStemFilter.html") + Kstem: "kstem", + + @doc("Removes words that are too long or too short. See http://lucene.apache.org/core/4_10_3/analyzers-common/org/apache/lucene/analysis/miscellaneous/LengthFilter.html") + Length: "length", + + @doc("Limits the number of tokens while indexing. See http://lucene.apache.org/core/4_10_3/analyzers-common/org/apache/lucene/analysis/miscellaneous/LimitTokenCountFilter.html") + Limit: "limit", + + @doc("Normalizes token text to lower case. See https://lucene.apache.org/core/6_6_1/analyzers-common/org/apache/lucene/analysis/core/LowerCaseFilter.html") + Lowercase: "lowercase", + + @doc("Generates n-grams of the given size(s). See http://lucene.apache.org/core/4_10_3/analyzers-common/org/apache/lucene/analysis/ngram/NGramTokenFilter.html") + NGram: "nGram_v2", + + @doc("Applies normalization for Persian. See http://lucene.apache.org/core/4_10_3/analyzers-common/org/apache/lucene/analysis/fa/PersianNormalizationFilter.html") + PersianNormalization: "persian_normalization", + + @doc("Create tokens for phonetic matches. See https://lucene.apache.org/core/4_10_3/analyzers-phonetic/org/apache/lucene/analysis/phonetic/package-tree.html") + Phonetic: "phonetic", + + @doc("Uses the Porter stemming algorithm to transform the token stream. See http://tartarus.org/~martin/PorterStemmer") + PorterStem: "porter_stem", + + @doc("Reverses the token string. See http://lucene.apache.org/core/4_10_3/analyzers-common/org/apache/lucene/analysis/reverse/ReverseStringFilter.html") + Reverse: "reverse", + + @doc("Normalizes use of the interchangeable Scandinavian characters. See http://lucene.apache.org/core/4_10_3/analyzers-common/org/apache/lucene/analysis/miscellaneous/ScandinavianNormalizationFilter.html") + ScandinavianNormalization: "scandinavian_normalization", + + @doc("Folds Scandinavian characters åÅäæÄÆ->a and öÖøØ->o. It also discriminates against use of double vowels aa, ae, ao, oe and oo, leaving just the first one. See http://lucene.apache.org/core/4_10_3/analyzers-common/org/apache/lucene/analysis/miscellaneous/ScandinavianFoldingFilter.html") + ScandinavianFoldingNormalization: "scandinavian_folding", + + @doc("Creates combinations of tokens as a single token. See http://lucene.apache.org/core/4_10_3/analyzers-common/org/apache/lucene/analysis/shingle/ShingleFilter.html") + Shingle: "shingle", + + @doc("A filter that stems words using a Snowball-generated stemmer. See http://lucene.apache.org/core/4_10_3/analyzers-common/org/apache/lucene/analysis/snowball/SnowballFilter.html") + Snowball: "snowball", + + @doc("Normalizes the Unicode representation of Sorani text. See http://lucene.apache.org/core/4_10_3/analyzers-common/org/apache/lucene/analysis/ckb/SoraniNormalizationFilter.html") + SoraniNormalization: "sorani_normalization", + + @doc("Language specific stemming filter. See https://docs.microsoft.com/rest/api/searchservice/Custom-analyzers-in-Azure-Search#TokenFilters") + Stemmer: "stemmer", + + @doc("Removes stop words from a token stream. See http://lucene.apache.org/core/4_10_3/analyzers-common/org/apache/lucene/analysis/core/StopFilter.html") + Stopwords: "stopwords", + + @doc("Trims leading and trailing whitespace from tokens. See http://lucene.apache.org/core/4_10_3/analyzers-common/org/apache/lucene/analysis/miscellaneous/TrimFilter.html") + Trim: "trim", + + @doc("Truncates the terms to a specific length. See http://lucene.apache.org/core/4_10_3/analyzers-common/org/apache/lucene/analysis/miscellaneous/TruncateTokenFilter.html") + Truncate: "truncate", + + @doc("Filters out tokens with same text as the previous token. See http://lucene.apache.org/core/4_10_3/analyzers-common/org/apache/lucene/analysis/miscellaneous/RemoveDuplicatesTokenFilter.html") + Unique: "unique", + + @doc("Normalizes token text to upper case. See https://lucene.apache.org/core/6_6_1/analyzers-common/org/apache/lucene/analysis/core/UpperCaseFilter.html") + Uppercase: "uppercase", + + @doc("Splits words into subwords and performs optional transformations on subword groups.") + WordDelimiter: "word_delimiter", +} + +@doc("Defines the names of all character filters supported by Azure Cognitive Search.") +enum CharFilterName { + @doc("A character filter that attempts to strip out HTML constructs. See https://lucene.apache.org/core/4_10_3/analyzers-common/org/apache/lucene/analysis/charfilter/HTMLStripCharFilter.html") + HtmlStrip: "html_strip", +} + +@doc("Defines flags that can be combined to control how regular expressions are used in the pattern analyzer and pattern tokenizer.") +enum RegexFlags { + @doc("Enables canonical equivalence.") + CanonEq: "CANON_EQ", + + @doc("Enables case-insensitive matching.") + CaseInsensitive: "CASE_INSENSITIVE", + + @doc("Permits whitespace and comments in the pattern.") + Comments: "COMMENTS", + + @doc("Enables dotall mode.") + DotAll: "DOTALL", + + @doc("Enables literal parsing of the pattern.") + Literal: "LITERAL", + + @doc("Enables multiline mode.") + Multiline: "MULTILINE", + + @doc("Enables Unicode-aware case folding.") + UnicodeCase: "UNICODE_CASE", + + @doc("Enables Unix lines mode.") + UnixLines: "UNIX_LINES", +} + +@doc("Base type for tokenizers.") +@discriminator("@odata.type") +model LexicalTokenizer { + @doc("The name of the tokenizer. It must only contain letters, digits, spaces, dashes or underscores, can only start and end with alphanumeric characters, and is limited to 128 characters.") + name: string; +} + +@doc("Grammar-based tokenizer that is suitable for processing most European-language documents. This tokenizer is implemented using Apache Lucene.") +model ClassicTokenizer extends LexicalTokenizer { + `@odata.type`: "#Microsoft.Azure.Search.ClassicTokenizer"; + + @doc("The maximum token length. Default is 255. Tokens longer than the maximum length are split. The maximum token length that can be used is 300 characters.") + @maxValue(300) + maxTokenLength?: int32 = 255; +} + +@doc("Tokenizes the input from an edge into n-grams of the given size(s). This tokenizer is implemented using Apache Lucene.") +model EdgeNGramTokenizer extends LexicalTokenizer { + `@odata.type`: "#Microsoft.Azure.Search.EdgeNGramTokenizer"; + + @doc("The minimum n-gram length. Default is 1. Maximum is 300. Must be less than the value of maxGram.") + @maxValue(300) + minGram?: int32 = 1; + + @doc("The maximum n-gram length. Default is 2. Maximum is 300.") + @maxValue(300) + maxGram?: int32 = 2; + + @doc("Character classes to keep in the tokens.") + tokenChars?: TokenCharacterKind[]; +} + +@doc("Represents classes of characters on which a token filter can operate.") +enum TokenCharacterKind { + @doc("Keeps letters in tokens.") + Letter: "letter", + + @doc("Keeps digits in tokens.") + Digit: "digit", + + @doc("Keeps whitespace in tokens.") + Whitespace: "whitespace", + + @doc("Keeps punctuation in tokens.") + Punctuation: "punctuation", + + @doc("Keeps symbols in tokens.") + Symbol: "symbol", +} + +@doc("Emits the entire input as a single token. This tokenizer is implemented using Apache Lucene.") +model KeywordTokenizer extends LexicalTokenizer { + `@odata.type`: "#Microsoft.Azure.Search.KeywordTokenizer"; + + @doc("The read buffer size in bytes. Default is 256.") + bufferSize?: int32 = 256; +} + +@doc("Emits the entire input as a single token. This tokenizer is implemented using Apache Lucene.") +model KeywordTokenizerV2 extends LexicalTokenizer { + `@odata.type`: "#Microsoft.Azure.Search.KeywordTokenizerV2"; + + @doc("The maximum token length. Default is 256. Tokens longer than the maximum length are split. The maximum token length that can be used is 300 characters.") + @maxValue(300) + maxTokenLength?: int32 = 255; +} + +@doc("Grammar-based tokenizer that is suitable for processing most European-language documents. This tokenizer is implemented using Apache Lucene.") +model MicrosoftLanguageTokenizer extends LexicalTokenizer { + `@odata.type`: "#Microsoft.Azure.Search.MicrosoftLanguageTokenizer"; + + @doc("The maximum token length. Default is 255. Tokens longer than the maximum length are split. The maximum token length that can be used is 300 characters.") + @maxValue(300) + maxTokenLength?: int32 = 255; + + @doc("A value indicating how the tokenizer is used. Set to true if used as the search tokenizer, set to false if used as the indexing tokenizer. Default is false.") + isSearchTokenizer?: boolean = false; + + @doc("The language to use. The default is English.") + language?: MicrosoftTokenizerLanguage; +} + +@doc("Lists the languages supported by the Microsoft language tokenizer.") +enum MicrosoftTokenizerLanguage { + @doc("Selects the Microsoft tokenizer for Arabic.") + Arabic: "arabic", + + @doc("Selects the Microsoft tokenizer for Bangla.") + Bangla: "bangla", + + @doc("Selects the Microsoft tokenizer for Bulgarian.") + Bulgarian: "bulgarian", + + @doc("Selects the Microsoft tokenizer for Catalan.") + Catalan: "catalan", + + @doc("Selects the Microsoft tokenizer for Croatian.") + Croatian: "croatian", + + @doc("Selects the Microsoft tokenizer for Czech.") + Czech: "czech", + + @doc("Selects the Microsoft tokenizer for Danish.") + Danish: "danish", + + @doc("Selects the Microsoft tokenizer for Dutch.") + Dutch: "dutch", + + @doc("Selects the Microsoft tokenizer for English.") + English: "english", + + @doc("Selects the Microsoft tokenizer for Finnish.") + Finnish: "finnish", + + @doc("Selects the Microsoft tokenizer for French.") + French: "french", + + @doc("Selects the Microsoft tokenizer for German.") + German: "german", + + @doc("Selects the Microsoft tokenizer for Greek.") + Greek: "greek", + + @doc("Selects the Microsoft tokenizer for Gujarati.") + Gujarati: "gujarati", + + @doc("Selects the Microsoft tokenizer for Hebrew.") + Hebrew: "hebrew", + + @doc("Selects the Microsoft tokenizer for Hindi.") + Hindi: "hindi", + + @doc("Selects the Microsoft tokenizer for Hungarian.") + Hungarian: "hungarian", + + @doc("Selects the Microsoft tokenizer for Icelandic.") + Icelandic: "icelandic", + + @doc("Selects the Microsoft tokenizer for Indonesian.") + Indonesian: "indonesian", + + @doc("Selects the Microsoft tokenizer for Italian.") + Italian: "italian", + + @doc("Selects the Microsoft tokenizer for Kannada.") + Kannada: "kannada", + + @doc("Selects the Microsoft tokenizer for Latvian.") + Latvian: "latvian", + + @doc("Selects the Microsoft tokenizer for Lithuanian.") + Lithuanian: "lithuanian", + + @doc("Selects the Microsoft tokenizer for Malay.") + Malay: "malay", + + @doc("Selects the Microsoft tokenizer for Malayalam.") + Malayalam: "malayalam", + + @doc("Selects the Microsoft tokenizer for Marathi.") + Marathi: "marathi", + + @doc("Selects the Microsoft tokenizer for Norwegian (Bokmål).") + NorwegianBokmaal: "norwegianBokmaal", + + @doc("Selects the Microsoft tokenizer for Polish.") + Polish: "polish", + + @doc("Selects the Microsoft tokenizer for Portuguese.") + Portuguese: "portuguese", + + @doc("Selects the Microsoft tokenizer for Portuguese (Brazil).") + PortugueseBrazilian: "portugueseBrazilian", + + @doc("Selects the Microsoft tokenizer for Punjabi.") + Punjabi: "punjabi", + + @doc("Selects the Microsoft tokenizer for Romanian.") + Romanian: "romanian", + + @doc("Selects the Microsoft tokenizer for Russian.") + Russian: "russian", + + @doc("Selects the Microsoft tokenizer for Serbian (Cyrillic).") + SerbianCyrillic: "serbianCyrillic", + + @doc("Selects the Microsoft tokenizer for Serbian (Latin).") + SerbianLatin: "serbianLatin", + + @doc("Selects the Microsoft tokenizer for Slovak.") + Slovak: "slovak", + + @doc("Selects the Microsoft tokenizer for Slovenian.") + Slovenian: "slovenian", + + @doc("Selects the Microsoft tokenizer for Spanish.") + Spanish: "spanish", + + @doc("Selects the Microsoft tokenizer for Swedish.") + Swedish: "swedish", + + @doc("Selects the Microsoft tokenizer for Tamil.") + Tamil: "tamil", + + @doc("Selects the Microsoft tokenizer for Telugu.") + Telugu: "telugu", + + @doc("Selects the Microsoft tokenizer for Turkish.") + Turkish: "turkish", + + @doc("Selects the Microsoft tokenizer for Ukrainian.") + Ukrainian: "ukrainian", + + @doc("Selects the Microsoft tokenizer for Urdu.") + Urdu: "urdu", +} + +@doc("Divides text using language-specific rules and reduces words to their base forms.") +model MicrosoftLanguageStemmingTokenizer extends LexicalTokenizer { + `@odata.type`: "#Microsoft.Azure.Search.MicrosoftLanguageStemmingTokenizer"; + + @doc("The maximum token length. Default is 255. Tokens longer than the maximum length are split. The maximum token length that can be used is 300 characters.") + @maxValue(300) + maxTokenLength?: int32 = 255; + + @doc("A value indicating how the tokenizer is used. Set to true if used as the search tokenizer, set to false if used as the indexing tokenizer. Default is false.") + isSearchTokenizer?: boolean = false; + + @doc("The language to use. The default is English.") + language?: MicrosoftStemmingTokenizerLanguage; +} + +@doc("Lists the languages supported by the Microsoft language stemming tokenizer.") +enum MicrosoftStemmingTokenizerLanguage { + @doc("Selects the Microsoft stemming tokenizer for Bangla.") + Bangla: "bangla", + + @doc("Selects the Microsoft stemming tokenizer for Bulgarian.") + Bulgarian: "bulgarian", + + @doc("Selects the Microsoft stemming tokenizer for Catalan.") + Catalan: "catalan", + + @doc("Selects the Microsoft stemming tokenizer for Chinese (Simplified).") + ChineseSimplified: "chineseSimplified", + + @doc("Selects the Microsoft stemming tokenizer for Chinese (Traditional).") + ChineseTraditional: "chineseTraditional", + + @doc("Selects the Microsoft stemming tokenizer for Croatian.") + Croatian: "croatian", + + @doc("Selects the Microsoft stemming tokenizer for Czech.") + Czech: "czech", + + @doc("Selects the Microsoft stemming tokenizer for Danish.") + Danish: "danish", + + @doc("Selects the Microsoft stemming tokenizer for Dutch.") + Dutch: "dutch", + + @doc("Selects the Microsoft stemming tokenizer for English.") + English: "english", + + @doc("Selects the Microsoft stemming tokenizer for French.") + French: "french", + + @doc("Selects the Microsoft stemming tokenizer for German.") + German: "german", + + @doc("Selects the Microsoft stemming tokenizer for Greek.") + Greek: "greek", + + @doc("Selects the Microsoft stemming tokenizer for Gujarati.") + Gujarati: "gujarati", + + @doc("Selects the Microsoft stemming tokenizer for Hindi.") + Hindi: "hindi", + + @doc("Selects the Microsoft stemming tokenizer for Icelandic.") + Icelandic: "icelandic", + + @doc("Selects the Microsoft stemming tokenizer for Indonesian.") + Indonesian: "indonesian", + + @doc("Selects the Microsoft stemming tokenizer for Italian.") + Italian: "italian", + + @doc("Selects the Microsoft stemming tokenizer for Japanese.") + Japanese: "japanese", + + @doc("Selects the Microsoft stemming tokenizer for Kannada.") + Kannada: "kannada", + + @doc("Selects the Microsoft stemming tokenizer for Korean.") + Korean: "korean", + + @doc("Selects the Microsoft stemming tokenizer for Malay.") + Malay: "malay", + + @doc("Selects the Microsoft stemming tokenizer for Malayalam.") + Malayalam: "malayalam", + + @doc("Selects the Microsoft stemming tokenizer for Marathi.") + Marathi: "marathi", + + @doc("Selects the Microsoft stemming tokenizer for Norwegian (Bokmål).") + NorwegianBokmaal: "norwegianBokmaal", + + @doc("Selects the Microsoft stemming tokenizer for Polish.") + Polish: "polish", + + @doc("Selects the Microsoft stemming tokenizer for Portuguese.") + Portuguese: "portuguese", + + @doc("Selects the Microsoft stemming tokenizer for Portuguese (Brazil).") + PortugueseBrazilian: "portugueseBrazilian", + + @doc("Selects the Microsoft stemming tokenizer for Punjabi.") + Punjabi: "punjabi", + + @doc("Selects the Microsoft stemming tokenizer for Romanian.") + Romanian: "romanian", + + @doc("Selects the Microsoft stemming tokenizer for Russian.") + Russian: "russian", + + @doc("Selects the Microsoft stemming tokenizer for Serbian (Cyrillic).") + SerbianCyrillic: "serbianCyrillic", + + @doc("Selects the Microsoft stemming tokenizer for Serbian (Latin).") + SerbianLatin: "serbianLatin", + + @doc("Selects the Microsoft stemming tokenizer for Slovenian.") + Slovenian: "slovenian", + + @doc("Selects the Microsoft stemming tokenizer for Spanish.") + Spanish: "spanish", + + @doc("Selects the Microsoft stemming tokenizer for Swedish.") + Swedish: "swedish", + + @doc("Selects the Microsoft stemming tokenizer for Tamil.") + Tamil: "tamil", + + @doc("Selects the Microsoft stemming tokenizer for Telugu.") + Telugu: "telugu", + + @doc("Selects the Microsoft stemming tokenizer for Thai.") + Thai: "thai", + + @doc("Selects the Microsoft stemming tokenizer for Ukrainian.") + Ukrainian: "ukrainian", + + @doc("Selects the Microsoft stemming tokenizer for Urdu.") + Urdu: "urdu", + + @doc("Selects the Microsoft stemming tokenizer for Vietnamese.") + Vietnamese: "vietnamese", +} + +@doc("Tokenizes the input into n-grams of the given size(s). This tokenizer is implemented using Apache Lucene.") +model NGramTokenizer extends LexicalTokenizer { + `@odata.type`: "#Microsoft.Azure.Search.NGramTokenizer"; + + @doc("The minimum n-gram length. Default is 1. Maximum is 300. Must be less than the value of maxGram.") + @maxValue(300) + minGram?: int32 = 1; + + @doc("The maximum n-gram length. Default is 2. Maximum is 300.") + @maxValue(300) + maxGram?: int32 = 2; + + @doc("Character classes to keep in the tokens.") + tokenChars?: TokenCharacterKind[]; +} + +@doc("Tokenizer for path-like hierarchies. This tokenizer is implemented using Apache Lucene.") +model PathHierarchyTokenizerV2 extends LexicalTokenizer { + `@odata.type`: "#Microsoft.Azure.Search.PathHierarchyTokenizerV2"; + + @doc("The delimiter character to use. Default is \"/\".") + @maxLength(1) + delimiter?: string = "/"; + + @doc("A value that, if set, replaces the delimiter character. Default is \"/\".") + @maxLength(1) + replacement?: string = "/"; + + @doc("The maximum token length. Default and maximum is 300.") + @maxValue(300) + maxTokenLength?: int32 = 300; + + @doc("A value indicating whether to generate tokens in reverse order. Default is false.") + // x-ms-client-name=ReverseTokenOrder + reverse?: boolean; + + @doc("The number of initial tokens to skip. Default is 0.") + skip?: int32 = 0; +} + +@doc("Tokenizer that uses regex pattern matching to construct distinct tokens. This tokenizer is implemented using Apache Lucene.") +model PatternTokenizer extends LexicalTokenizer { + `@odata.type`: "#Microsoft.Azure.Search.PatternTokenizer"; + + @doc("A regular expression pattern to match token separators. Default is an expression that matches one or more non-word characters.") + pattern?: string = "\\W+"; + + @doc("Regular expression flags.") + flags?: RegexFlags; + + @doc("The zero-based ordinal of the matching group in the regular expression pattern to extract into tokens. Use -1 if you want to use the entire pattern to split the input into tokens, irrespective of matching groups. Default is -1.") + group?: int32 = -1; +} + +@doc("Breaks text following the Unicode Text Segmentation rules. This tokenizer is implemented using Apache Lucene.") +model LuceneStandardTokenizer extends LexicalTokenizer { + `@odata.type`: "#Microsoft.Azure.Search.StandardTokenizer"; + + @doc("The maximum token length. Default is 255. Tokens longer than the maximum length are split. The maximum token length that can be used is 300 characters.") + @maxValue(300) + maxTokenLength?: int32 = 255; +} + +@doc("Breaks text following the Unicode Text Segmentation rules. This tokenizer is implemented using Apache Lucene.") +model LuceneStandardTokenizerV2 extends LexicalTokenizer { + `@odata.type`: "#Microsoft.Azure.Search.StandardTokenizerV2"; + + @doc("The maximum token length. Default is 255. Tokens longer than the maximum length are split. The maximum token length that can be used is 300 characters.") + @maxValue(300) + maxTokenLength?: int32 = 255; +} + +@doc("Tokenizes urls and emails as one token. This tokenizer is implemented using Apache Lucene.") +model UaxUrlEmailTokenizer extends LexicalTokenizer { + `@odata.type`: "#Microsoft.Azure.Search.UaxUrlEmailTokenizer"; + + @doc("The maximum token length. Default is 255. Tokens longer than the maximum length are split. The maximum token length that can be used is 300 characters.") + @maxValue(300) + maxTokenLength?: int32 = 255; +} + +@doc("Base type for token filters.") +@discriminator("@odata.type") +model TokenFilter { + @doc("The name of the token filter. It must only contain letters, digits, spaces, dashes or underscores, can only start and end with alphanumeric characters, and is limited to 128 characters.") + name: string; +} + +@doc("Converts alphabetic, numeric, and symbolic Unicode characters which are not in the first 127 ASCII characters (the \"Basic Latin\" Unicode block) into their ASCII equivalents, if such equivalents exist. This token filter is implemented using Apache Lucene.") +model AsciiFoldingTokenFilter extends TokenFilter { + `@odata.type`: "#Microsoft.Azure.Search.AsciiFoldingTokenFilter"; + + @doc("A value indicating whether the original token will be kept. Default is false.") + preserveOriginal?: boolean = false; +} + +@doc("Scripts that can be ignored by CjkBigramTokenFilter.") +enum CjkBigramTokenFilterScripts { + @doc("Ignore Han script when forming bigrams of CJK terms.") + Han: "han", + + @doc("Ignore Hiragana script when forming bigrams of CJK terms.") + Hiragana: "hiragana", + + @doc("Ignore Katakana script when forming bigrams of CJK terms.") + Katakana: "katakana", + + @doc("Ignore Hangul script when forming bigrams of CJK terms.") + Hangul: "hangul", +} + +@doc("Forms bigrams of CJK terms that are generated from the standard tokenizer. This token filter is implemented using Apache Lucene.") +model CjkBigramTokenFilter extends TokenFilter { + `@odata.type`: "#Microsoft.Azure.Search.CjkBigramTokenFilter"; + + @doc("The scripts to ignore.") + ignoreScripts?: CjkBigramTokenFilterScripts[]; + + @doc("Forms bigrams of CJK terms that are generated from the standard tokenizer. This token filter is implemented using Apache Lucene.") + outputUnigrams?: boolean; +} + +@doc("Construct bigrams for frequently occurring terms while indexing. Single terms are still indexed too, with bigrams overlaid. This token filter is implemented using Apache Lucene.") +model CommonGramTokenFilter extends TokenFilter { + `@odata.type`: "#Microsoft.Azure.Search.CommonGramTokenFilter"; + + @doc("The set of common words.") + commonWords: string[]; + + @doc("A value indicating whether common words matching will be case insensitive. Default is false.") + ignoreCase?: boolean = false; + + @doc("A value that indicates whether the token filter is in query mode. When in query mode, the token filter generates bigrams and then removes common words and single terms followed by a common word. Default is false.") + @projectedName("json", "queryMode") + useQueryMode?: boolean; +} + +@doc("Decomposes compound words found in many Germanic languages. This token filter is implemented using Apache Lucene.") +model DictionaryDecompounderTokenFilter extends TokenFilter { + `@odata.type`: "#Microsoft.Azure.Search.DictionaryDecompounderTokenFilter"; + + @doc("The list of words to match against.") + wordList: string[]; + + @doc("The minimum word size. Only words longer than this get processed. Default is 5. Maximum is 300.") + @maxValue(300) + minWordSize?: int32 = 5; + + @doc("The minimum subword size. Only words longer than this get processed. Default is 5. Maximum is 300.") + @maxValue(300) + minSubwordSize?: int32 = 2; + + @doc("The maximum subword size. Only words longer than this get processed. Default is 5. Maximum is 300.") + @maxValue(300) + maxSubwordSize?: int32 = 15; + + @doc("A value indicating whether to add only the longest matching subword to the output. Default is false.") + onlyLongestMatch?: boolean = false; +} + +@doc("Specifies which side of the input an n-gram should be generated from.") +enum EdgeNGramTokenFilterSide { + @doc("Specifies that the n-gram should be generated from the front of the input.") + Front: "front", + + @doc("Specifies that the n-gram should be generated from the back of the input.") + Back: "back", +} + +@doc("Generates n-grams of the given size(s) starting from the front or the back of an input token. This token filter is implemented using Apache Lucene.") +model EdgeNGramTokenFilter extends TokenFilter { + `@odata.type`: "#Microsoft.Azure.Search.EdgeNGramTokenFilter"; + + @doc("The minimum n-gram length. Default is 1. Must be less than the value of maxGram.") + minGram?: int32 = 1; + + @doc("The maximum n-gram length. Default is 2.") + maxGram?: int32 = 2; + + @doc("Specifies which side of the input the n-gram should be generated from. Default is \"front\".") + side?: EdgeNGramTokenFilterSide; //= EdgeNGramTokenFilterSide.Front +} + +@doc("Generates n-grams of the given size(s) starting from the front or the back of an input token. This token filter is implemented using Apache Lucene.") +model EdgeNGramTokenFilterV2 extends TokenFilter { + `@odata.type`: "#Microsoft.Azure.Search.EdgeNGramTokenFilterV2"; + + @doc("The minimum n-gram length. Default is 1. Must be less than the value of maxGram.") + minGram?: int32 = 1; + + @doc("The maximum n-gram length. Default is 2.") + maxGram?: int32 = 2; + + @doc("Specifies which side of the input the n-gram should be generated from. Default is \"front\".") + side?: EdgeNGramTokenFilterSide; //= EdgeNGramTokenFilterSide.Front +} + +@doc("Removes elisions. For example, \"l'avion\" (the plane) will be converted to \"avion\" (plane). This token filter is implemented using Apache Lucene.") +model ElisionTokenFilter extends TokenFilter { + `@odata.type`: "#Microsoft.Azure.Search.ElisionTokenFilter"; + + @doc("The set of articles to remove.") + articles?: string[]; +} + +@doc("A token filter that only keeps tokens with text contained in a specified list of words. This token filter is implemented using Apache Lucene.") +model KeepTokenFilter extends TokenFilter { + `@odata.type`: "#Microsoft.Azure.Search.KeepTokenFilter"; + + @doc("The list of words to keep.") + keepWords: string[]; + + @doc("A value indicating whether to lower case all words first. Default is false.") + @projectedName("json", "keepWordsCase") + lowerCaseKeepWords?: boolean = false; +} + +@doc("Marks terms as keywords. This token filter is implemented using Apache Lucene.") +model KeywordMarkerTokenFilter extends TokenFilter { + `@odata.type`: "#Microsoft.Azure.Search.KeywordMarkerTokenFilter"; + + @doc("A list of words to mark as keywords.") + keepWords: string[]; + + @doc("A value indicating whether to ignore case. If true, all words are converted to lower case first. Default is false.") + ignoreCase?: boolean = false; +} + +@doc("Removes words that are too long or too short. This token filter is implemented using Apache Lucene.") +model LengthTokenFilter extends TokenFilter { + `@odata.type`: "#Microsoft.Azure.Search.LengthTokenFilter"; + + @doc("The minimum length in characters. Default is 0. Maximum is 300. Must be less than the value of max.") + @maxValue(300) + @projectedName("json", "min") + minLength?: int32 = 0; + + @doc("The maximum length in characters. Default is 0. Maximum is 300. Must be less than the value of max.") + @maxValue(300) + @projectedName("json", "max") + maxLength?: int32 = 300; +} + +@doc("Limits the number of tokens while indexing. This token filter is implemented using Apache Lucene.") +model LimitTokenFilter extends TokenFilter { + `@odata.type`: "#Microsoft.Azure.Search.LimitTokenFilter"; + + @doc("The maximum number of tokens to produce. Default is 1.") + @maxValue(300) + maxTokenCount?: int32 = 1; + + @doc("A value indicating whether all tokens from the input must be consumed even if maxTokenCount is reached. Default is false.") + consumeAllTokens?: boolean = false; +} + +@doc("Generates n-grams of the given size(s). This token filter is implemented using Apache Lucene.") +model NGramTokenFilter extends TokenFilter { + `@odata.type`: "#Microsoft.Azure.Search.NGramTokenFilter"; + + @doc("The minimum n-gram length. Default is 1. Must be less than the value of maxGram.") + minGram?: int32 = 1; + + @doc("The maximum n-gram length. Default is 2.") + maxGram?: int32 = 2; +} + +@doc("Generates n-grams of the given size(s). This token filter is implemented using Apache Lucene.") +model NGramTokenFilterV2 extends TokenFilter { + `@odata.type`: "#Microsoft.Azure.Search.NGramTokenFilterV2"; + + @doc("The minimum n-gram length. Default is 1. Must be less than the value of maxGram.") + minGram?: int32 = 1; + + @doc("The maximum n-gram length. Default is 2.") + maxGram?: int32 = 2; +} + +@doc("Generates n-grams of the given size(s). This token filter is implemented using Apache Lucene.") +model PatternCaptureTokenFilter extends TokenFilter { + `@odata.type`: "#Microsoft.Azure.Search.PatternCaptureTokenFilter"; + + @doc("A list of patterns to match against each token.") + patterns: string[]; + + @doc("A value indicating whether to return the original token even if one of the patterns matches. Default is true.") + preserveOriginal?: boolean = true; +} + +@doc("A character filter that replaces characters in the input string. It uses a regular expression to identify character sequences to preserve and a replacement pattern to identify characters to replace. For example, given the input text \"aa bb aa bb\", pattern \"(aa)\\s+(bb)\", and replacement \"$1#$2\", the result would be \"aa#bb aa#bb\". This token filter is implemented using Apache Lucene.") +model PatternReplaceTokenFilter extends TokenFilter { + `@odata.type`: "#Microsoft.Azure.Search.PatternReplaceTokenFilter"; + + @doc("A regular expression pattern.") + pattern: string; + + @doc("The replacement text.") + replacement: string; +} + +@doc("Base type for character filters.") +@discriminator("@odata.type") +model CharFilter { + @doc("The name of the char filter. It must only contain letters, digits, spaces, dashes or underscores, can only start and end with alphanumeric characters, and is limited to 128 characters.") + name: string; +} + +@doc("A character filter that applies mappings defined with the mappings option. Matching is greedy (longest pattern matching at a given point wins). Replacement is allowed to be the empty string. This character filter is implemented using Apache Lucene.") +model MappingCharFilter extends CharFilter { + `@odata.type`: "#Microsoft.Azure.Search.MappingCharFilter"; + + @doc("A list of mappings of the following format: \"a=>b\" (all occurrences of the character \"a\" will be replaced with character \"b\").") + mappings: string[]; +} + +@doc("A character filter that replaces characters in the input string. It uses a regular expression to identify character sequences to preserve and a replacement pattern to identify characters to replace. For example, given the input text \"aa bb aa bb\", pattern \"(aa)\\s+(bb)\", and replacement \"$1#$2\", the result would be \"aa#bb aa#bb\". This character filter is implemented using Apache Lucene.") +model PatternReplaceCharFilter extends CharFilter { + `@odata.type`: "#Microsoft.Azure.Search.PatternReplaceCharFilter"; + + @doc("A regular expression pattern.") + pattern: string; + + @doc("The replacement text.") + replacement: string; +} + +@doc("Base type for similarity algorithms. Similarity algorithms are used to calculate scores that tie queries to documents. The higher the score, the more relevant the document is to that specific query. Those scores are used to rank the search results.") +@discriminator("@odata.type") +model Similarity {} + +@doc("Legacy similarity algorithm which uses the Lucene TFIDFSimilarity implementation of TF-IDF. This variation of TF-IDF introduces static document length normalization as well as coordinating factors that penalize documents that only partially match the searched queries.") +model ClassicSimilarity extends Similarity { + `@odata.type`: "#Microsoft.Azure.Search.ClassicSimilarity"; +} + +@doc("Ranking function based on the Okapi BM25 similarity algorithm. BM25 is a TF-IDF-like algorithm that includes length normalization (controlled by the 'b' parameter) as well as term frequency saturation (controlled by the 'k1' parameter).") +model BM25Similarity extends Similarity { + `@odata.type`: "#Microsoft.Azure.Search.BM25Similarity"; + + @doc("This property controls the scaling function between the term frequency of each matching terms and the final relevance score of a document-query pair. By default, a value of 1.2 is used. A value of 0.0 means the score does not scale with an increase in term frequency.") + k1?: float64; + + @doc("This property controls how the length of a document affects the relevance score. By default, a value of 0.75 is used. A value of 0.0 means no length normalization is applied, while a value of 1.0 means the score is fully normalized by the length of the document.") + b?: float64; +} + +@doc("Defines parameters for a search index that influence semantic capabilities.") +model SemanticSettings { + @doc("The semantic configurations for the index.") + configurations: SemanticConfiguration[]; +} + +@doc("Defines a specific configuration to be used in the context of semantic capabilities.") +model SemanticConfiguration { + @doc("The name of the semantic configuration.") + name: string; + + @doc("Describes the title, content, and keyword fields to be used for semantic ranking, captions, highlights, and answers. At least one of the three sub properties (titleField, prioritizedKeywordsFields and prioritizedContentFields) need to be set.") + prioritizedFields: PrioritizedFields; +} + +@doc("Describes the title, content, and keywords fields to be used for semantic ranking, captions, highlights, and answers.") +model PrioritizedFields { + @doc("Defines the title field to be used for semantic ranking, captions, highlights, and answers. If you don't have a title field in your index, leave this blank.") + titleField?: SemanticField[]; + + @doc("Defines the content fields to be used for semantic ranking, captions, highlights, and answers. For the best result, the selected fields should contain text in natural language form. The order of the fields in the array represents their priority. Fields with lower priority may get truncated if the content is long.") + prioritizedContentFields?: SemanticField[]; + + @doc("Defines the keyword fields to be used for semantic ranking, captions, highlights, and answers. For the best result, the selected fields should contain a list of keywords. The order of the fields in the array represents their priority. Fields with lower priority may get truncated if the content is long.") + prioritizedKeywordsFields?: SemanticField[]; +} + +@doc("A field that is used as part of the semantic configuration.") +model SemanticField { + @doc("Field name.") + fieldName: string; +} + +@doc("Base type for normalizers.") +@discriminator("@odata.type") +model LexicalNormalizer { + @doc("The name of the normalizer. It must only contain letters, digits, spaces, dashes or underscores, can only start and end with alphanumeric characters, and is limited to 128 characters. It cannot end in '.microsoft' nor '.lucene', nor be named 'asciifolding', 'standard', 'lowercase', 'uppercase', or 'elision'.") + name: string; +} + +@doc("Allows you to configure normalization for filterable, sortable, and facetable fields, which by default operate with strict matching. This is a user-defined configuration consisting of at least one or more filters, which modify the token that is stored.") +model CustomNormalizer extends LexicalNormalizer { + `@odata.type`: "#Microsoft.Azure.Search.CustomNormalizer"; + + @doc("A list of token filters used to filter out or modify the input token. For example, you can specify a lowercase filter that converts all characters to lowercase. The filters are run in the order in which they are listed.") + tokenFilters?: TokenFilterName[]; + + @doc("A list of character filters used to prepare input text before it is processed. For instance, they can replace certain characters or symbols. The filters are run in the order in which they are listed.") + charFilters?: CharFilterName; +} + +@doc("Defines the names of all text normalizers supported by Azure Cognitive Search.") +enum LexicalNormalizerName { + @doc("Converts alphabetic, numeric, and symbolic Unicode characters which are not in the first 127 ASCII characters (the \"Basic Latin\" Unicode block) into their ASCII equivalents, if such equivalents exist. See http://lucene.apache.org/core/4_10_3/analyzers-common/org/apache/lucene/analysis/miscellaneous/ASCIIFoldingFilter.html") + Asciifolding: "asciifolding", + + @doc("Removes elisions. For example, \"l'avion\" (the plane) will be converted to \"avion\" (plane). See http://lucene.apache.org/core/4_10_3/analyzers-common/org/apache/lucene/analysis/util/ElisionFilter.html") + Elision: "elision", + + @doc("Normalizes token text to lowercase. See https://lucene.apache.org/core/6_6_1/analyzers-common/org/apache/lucene/analysis/core/LowerCaseFilter.html") + Lowercase: "lowercase", + + @doc("Standard normalizer, which consists of lowercase and asciifolding. See http://lucene.apache.org/core/4_10_3/analyzers-common/org/apache/lucene/analysis/reverse/ReverseStringFilter.html") + Standard: "standard", + + @doc("Normalizes token text to uppercase. See https://lucene.apache.org/core/6_6_1/analyzers-common/org/apache/lucene/analysis/core/UpperCaseFilter.html") + Uppercase: "uppercase", +} + +@doc("Statistics for a given index. Statistics are collected periodically and are not guaranteed to always be up-to-date.") +model GetIndexStatisticsResult { + @doc("The number of documents in the index.") + documentCount: int64; + + @doc("The amount of storage in bytes consumed by the index.") + storageSize: int64; +} + +@doc("Specifies some text and analysis components used to break that text into tokens.") +model AnalyzeRequest { + @doc("The text to break into tokens.") + text: string; + + @doc("The name of the analyzer to use to break the given text.") + analyzer?: LexicalAnalyzerName; + + @doc("The name of the tokenizer to use to break the given text.") + tokenizer?: LexicalTokenizerName; + + @doc("The name of the normalizer to use to normalize the given text.") + normalizer?: LexicalNormalizerName; + + @doc("An optional list of token filters to use when breaking the given text.") + tokenFilters?: TokenFilterName[]; + + @doc("An optional list of character filters to use when breaking the given text.") + charFilters?: CharFilterName[]; +} + +@doc("The result of testing an analyzer on text.") +model AnalyzeResult { + @doc("The list of tokens returned by the analyzer specified in the request.") + tokens: AnalyzedTokenInfo[]; +} + +@doc("Information about a token returned by an analyzer.") +model AnalyzedTokenInfo { + @doc("The token returned by the analyzer.") + token: string; + + @doc("The index of the first character of the token in the input text.") + startOffset: int32; + + @doc("The index of the last character of the token in the input text.") + endOffset: int32; + + @doc("The position of the token in the input text relative to other tokens. The first token in the input text has position 0, the next has position 1, and so on. Depending on the analyzer used, some tokens might have the same position, for example if they are synonyms of each other.") + position: int32; +} diff --git a/packages/samples/specs/data-plane/searchservice/search-index.ops.tsp b/packages/samples/specs/data-plane/searchservice/search-index.ops.tsp new file mode 100644 index 0000000000..2f1a09ad75 --- /dev/null +++ b/packages/samples/specs/data-plane/searchservice/search-index.ops.tsp @@ -0,0 +1,108 @@ +import "./search-index.models.tsp"; +import "@typespec/http"; +import "@typespec/rest"; +import "./common.tsp"; + +using TypeSpec.Http; + +namespace Azure.SearchService; + +@tag("Indexes") +interface Indexes { + @route("/indexes") + @doc("Lists all indexes available for a search service.") + @get + list(...SelectParameter, ...ClientRequestIdParameter, ...ApiVersionParameter): CollectionResult< + SearchIndex, + "Indexes" + > | SearchError; + + @route("/indexes") + @doc("Creates a new search index.") + @post + create( + @doc("The definition of the index to create.") + @body + body: SearchIndex, + + ...ClientRequestIdParameter, + ...ApiVersionParameter, + ): SearchCreatedResponse | SearchError; + + @doc("Retrieves an index definition.") + @route("/indexes('{indexName}')") + @get + get( + @doc("The name of the index to retrieve.") + @path + indexName: string, + + ...ClientRequestIdParameter, + ...ApiVersionParameter, + ): SearchIndex | SearchError; + + @doc("Creates a new search index or updates an index if it already exists.") + @route("/indexes('{indexName}')") + @put + createOrUpdate( + @doc("The name of the index to create or update.") + @path + indexName: string, + + @doc("The definition of the index to create or update.") + @body + body: SearchIndex, + + @doc("Allows new analyzers, tokenizers, token filters, or char filters to be added to an index by taking the index offline for at least a few seconds. This temporarily causes indexing and query requests to fail. Performance and write availability of the index can be impaired for several minutes after the index is updated, or longer for very large indexes.") + @query + allowIndexDowntime?: boolean, + + ...ClientRequestIdParameter, + ...IfMatchParameter, + ...IfNoneMatchParameter, + ...PreferHeaderParameter, + ...ApiVersionParameter, + ): SearchIndex | SearchCreatedResponse | SearchError; + + @doc("Deletes a search index and all the documents it contains. This operation is permanent, with no recovery option. Make sure you have a master copy of your index definition, data ingestion code, and a backup of the primary data source in case you need to re-build the index.") + @route("/indexes('{indexName}')") + @delete + delete( + @doc("The name of the index to delete.") + @path + indexName: string, + + ...ClientRequestIdParameter, + ...IfMatchParameter, + ...IfNoneMatchParameter, + ...ApiVersionParameter, + ): NoContentResponse | SearchError; + + @doc("Returns statistics for the given index, including a document count and storage usage.") + @route("/indexes('{indexName}')/search.stats") + @get + getStatistics( + @doc("The name of the index for which to retrieve statistics.") + @path + indexName: string, + + ...ClientRequestIdParameter, + ...ApiVersionParameter, + ): GetIndexStatisticsResult | SearchError; + + @doc("Shows how an analyzer breaks text into tokens.") + @route("/indexes('{indexName}')/search.analyze") + @post + analyze( + @doc("The name of the index for which to test an analyzer.") + @path + indexName: string, + + @doc("The text and analyzer or analysis components to test.") + @body + request: AnalyzeRequest, + + ...ClientRequestIdParameter, + ...ApiVersionParameter, + ): AnalyzeResult | SearchError; +} diff --git a/packages/samples/specs/data-plane/searchservice/search-indexer.ops.tsp b/packages/samples/specs/data-plane/searchservice/search-indexer.ops.tsp new file mode 100644 index 0000000000..5f365218ac --- /dev/null +++ b/packages/samples/specs/data-plane/searchservice/search-indexer.ops.tsp @@ -0,0 +1,153 @@ +import "@typespec/http"; +import "@typespec/rest"; + +import "./searchservice.models.tsp"; + +// TODO: Parameterized host. ISSUE: https://github.com/microsoft/typespec/issues/175 +@doc("Client that can be used to manage and query indexes and documents, as well as manage other resources, on a search service.") +@useAuth( + ApiKeyAuth | OAuth2Auth<[ + { + type: OAuth2FlowType.implicit, + authorizationUrl: "https://login.contoso.com/common/oauth2/v2.0/authorize", + scopes: ["https://cognitiveservices.azure.com/.default"], + } + ]> +) +@service({ + title: "Search Service", + version: "2021-04-30-Preview", +}) +namespace Azure.SearchService; + +using TypeSpec.Http; +using TypeSpec.Rest; +using TypeSpec.Rest.Resource; +using TypeSpec.OpenAPI; + +@tag("Indexers") +interface IndexersApis { + @route("/indexers") + @doc("Lists all indexers available for a search service.") + @get + list(...SelectParameter, ...ClientRequestIdParameter, ...ApiVersionParameter): CollectionResult< + SearchIndexer, + "Indexers" + > | SearchError; + + @route("/indexers") + @doc("Creates a new search indexer.") + @post + create( + @doc("The definition of the data source to create.") + @body + body: SearchIndexer, + + ...ClientRequestIdParameter, + ...ApiVersionParameter, + ): SearchCreatedResponse | SearchError; + + @doc("Retrieves an indexer definition.") + @route("/indexers('{indexerName}')") + @get + get( + @doc("The name of the data source to retrieve.") + @path + indexerName: string, + + ...ClientRequestIdParameter, + ...ApiVersionParameter, + ): SearchIndexer | SearchError; + + @doc("Creates a new indexer or updates an indexer if it already exists.") + @route("/indexers('{indexerName}')") + @put + createOrUpdate( + @doc("The name of the indexer to create or update.") + @path + indexerName: string, + + @doc("The definition of the data source to create or update.") + @body + body: SearchIndexer, + + ...IgnoreResetRequirementsParameter, + ...DisableCacheReprocessingChangeDetectionParameter, + ...ClientRequestIdParameter, + ...IfMatchParameter, + ...IfNoneMatchParameter, + ...PreferHeaderParameter, + ...ApiVersionParameter, + ): SearchIndexer | SearchCreatedResponse | SearchError; + + @doc("Deletes a indexer.") + @route("/indexers('{indexerName}')") + @delete + delete( + @doc("The name of the indexer to delete.") + @path + indexerName: string, + + ...ClientRequestIdParameter, + ...IfMatchParameter, + ...IfNoneMatchParameter, + ...ApiVersionParameter, + ): NoContentResponse | NotFoundResponse | SearchError; + + @doc("Resets the change tracking state associated with an indexer.") + @route("/indexers('{indexerName}')/search.reset") + @post + reset( + @doc("The name of the indexer to reset.") + @path + indexerName: string, + + ...ClientRequestIdParameter, + ...ApiVersionParameter, + ): NoContentResponse | SearchError; + + @doc("Resets specific documents in the datasource to be selectively re-ingested by the indexer.") + @route("/indexers('{indexerName}')/search.resetdocs") + @post + resetDocs( + @doc("The name of the indexer to reset.") + @path + indexerName: string, + + @doc("datasource document identifiers to be reset") + @body + @projectedName("json", "keysOrIds") + documentKeysOrIds: string[], + + @doc("If false, keys or ids will be appended to existing ones. If true, only the keys or ids in this payload will be queued to be re-ingested.") + @query + overwrite?: boolean = false, + + ...ClientRequestIdParameter, + ...ApiVersionParameter, + ): NoContentResponse | SearchError; + + @doc("Runs an indexer on-demand.") + @route("/indexers('{indexerName}')/search.run") + @post + run( + @doc("The name of the indexer to reset.") + @path + indexerName: string, + + ...ClientRequestIdParameter, + ...ApiVersionParameter, + ): AcceptedResponse | SearchError; + + @doc("Returns the current status and execution history of an indexer.") + @route("/indexers('{indexerName}')/search.status") + @get + getStatus( + @doc("The name of the indexer for which to retrieve status.") + @path + indexerName: string, + + ...ClientRequestIdParameter, + ...ApiVersionParameter, + ): SearchIndexerStatus | SearchError; +} diff --git a/packages/samples/specs/data-plane/searchservice/searchservice.models.tsp b/packages/samples/specs/data-plane/searchservice/searchservice.models.tsp new file mode 100644 index 0000000000..8d96b687ab --- /dev/null +++ b/packages/samples/specs/data-plane/searchservice/searchservice.models.tsp @@ -0,0 +1,538 @@ +import "@typespec/http"; +import "@typespec/rest"; + +import "./dataIdentity.model.tsp"; +import "./dataPolicy.model.tsp"; + +using TypeSpec.Rest; +using TypeSpec.Rest.Resource; +using TypeSpec.OpenAPI; + +namespace Azure.SearchService; + +model SearchIndexerDataSource { + @doc("The name of the datasource.") + @visibility("read") + name: string; + + @doc("The description of the datasource.") + description?: string; + + @doc("The type of the datasource.") + type: SearchIndexerDataSourceType; + + @doc("Credentials for the datasource.") + credentials: DataSourceCredentials; + + @doc("The data container for the datasource.") + container: SearchIndexerDataContainer; + + @doc("An explicit managed identity to use for this datasource. If not specified and the connection string is a managed identity, the system-assigned managed identity is used. If not specified, the value remains unchanged. If ',none,' is specified, the value of this property is cleared.") + identity?: SearchIndexerDataIdentity; + + @doc("The data change detection policy for the datasource.") + dataChangeDetectionPolicy?: DataChangeDetectionPolicy; + + @doc("The data deletion detection policy for the datasource.") + dataDeletionDetectionPolicy?: DataDeletionDetectionPolicy; + + ...ETag; + + @doc("A description of an encryption key that you create in Azure Key Vault. This key is used to provide an additional level of encryption-at-rest for your datasource definition when you want full assurance that no one, not even Microsoft, can decrypt your data source definition in Azure Cognitive Search. Once you have encrypted your data source definition, it will always remain encrypted. Azure Cognitive Search will ignore attempts to set this property to null. You can change this property as needed if you want to rotate your encryption key; Your datasource definition will be unaffected. Encryption with customer-managed keys is not available for free search services, and is only available for paid services created on or after January 1, 2019.") + encryptionKey?: SearchResourceEncryptionKey; +} + +model SearchResourceEncryptionKey { + @doc("The name of your Azure Key Vault key to be used to encrypt your data at rest.") + @projectedName("json", "keyVaultKeyName") + keyName: string; + + @doc("The version of your Azure Key Vault key to be used to encrypt your data at rest.") + @projectedName("json", "keyVaultKeyVersion") + keyVersion: string; + + @doc("The URI of your Azure Key Vault, also referred to as DNS name, that contains the key to be used to encrypt your data at rest. An example URI might be https://my-keyvault-name.vault.azure.net.") + @projectedName("json", "keyVaultUri") + vaultUri: string; + + @doc("Optional Azure Active Directory credentials used for accessing your Azure Key Vault. Not required if using managed identity instead.") + accessCredentials?: AzureActiveDirectoryApplicationCredentials; + + @doc("An explicit managed identity to use for this encryption key. If not specified and the access credentials property is null, the system-assigned managed identity is used. On update to the resource, if the explicit identity is unspecified, it remains unchanged. If none is specified, the value of this property is cleared.") + identity?: SearchIndexerDataIdentity; +} + +model AzureActiveDirectoryApplicationCredentials { + @doc("An AAD Application ID that was granted the required access permissions to the Azure Key Vault that is to be used when encrypting your data at rest. The Application ID should not be confused with the Object ID for your AAD Application.") + applicationId?: string; + + @doc("The authentication key of the specified AAD application.") + applicationSecret?: string; +} + +enum SearchIndexerDataSourceType { + @doc("Indicates an Azure SQL datasource.") + AzureSql: "azuresql", + + @doc("Indicates a CosmosDB datasource.") + CosmosDb: "cosmosdb", + + @doc("Indicates an Azure Blob datasource.") + AzureBlob: "azureblob", + + @doc("Indicates an Azure Table datasource.") + AzureTable: "azuretable", + + @doc("Indicates a MySql datasource.") + MySql: "mysql", + + @doc("Indicates an ADLS Gen2 datasource.") + AdlsGen2: "adlsgen2", +} + +@doc("Represents credentials that can be used to connect to a datasource.") +model DataSourceCredentials { + @doc("The connection string for the datasource. Set to '' if you do not want the connection string updated.") + connectionString?: string; +} + +@doc("Represents information about the entity (such as Azure SQL table or CosmosDB collection) that will be indexed.") +model SearchIndexerDataContainer { + @doc("The name of the table or view (for Azure SQL data source) or collection (for CosmosDB data source) that will be indexed.") + name: string; + + @doc("A query that is applied to this data container. The syntax and meaning of this parameter is datasource-specific. Not supported by Azure SQL datasources.") + query?: string; +} + +model SearchIndexer { + @doc("The name of the indexer.") + name: string; + + @doc("The description of the indexer.") + description?: string; + + @doc("The name of the datasource from which this indexer reads data.") + dataSourceName: string; + + @doc("The name of the skillset executing with this indexer.") + skillsetName?: string; + + @doc("The name of the index to which this indexer writes data.") + targetIndexName: string; + + @doc("The schedule for this indexer.") + schedule?: IndexingSchedule; + + @doc("Parameters for indexer execution.") + parameters?: IndexingParameters; + + @doc("Defines mappings between fields in the data source and corresponding target fields in the index.") + fieldMappings?: FieldMapping; + + @doc("Output field mappings are applied after enrichment and immediately before indexing.") + outputFieldMappings?: FieldMapping; + + @doc("A value indicating whether the indexer is disabled. Default is false.") + disabled?: boolean = false; + + ...ETag; + + @doc("A description of an encryption key that you create in Azure Key Vault. This key is used to provide an additional level of encryption-at-rest for your indexer definition (as well as indexer execution status) when you want full assurance that no one, not even Microsoft, can decrypt them in Azure Cognitive Search. Once you have encrypted your indexer definition, it will always remain encrypted. Azure Cognitive Search will ignore attempts to set this property to null. You can change this property as needed if you want to rotate your encryption key; Your indexer definition (and indexer execution status) will be unaffected. Encryption with customer-managed keys is not available for free search services, and is only available for paid services created on or after January 1, 2019.") + encryptionKey?: SearchResourceEncryptionKey; + + @doc("Adds caching to an enrichment pipeline to allow for incremental modification steps without having to rebuild the index every time.") + cache?: SearchIndexerCache; +} + +@doc("Response from a get service statistics request. If successful, it includes service level counters and limits.") +model ServiceStatistics { + @doc("Service level resource counters.") + counters?: ServiceCounters; + + @doc("Service level general limits.") + limits?: ServiceLimits; +} + +model ServiceCounters { + @doc("Total number of documents across all indexes in the service.") + documentCount?: ResourceCounter; + + @doc("Total number of indexes.") + indexesCount?: ResourceCounter; + + @doc("Total number of indexers.") + indexersCount?: ResourceCounter; + + @doc("Total number of data sources.") + dataSourcesCount?: ResourceCounter; + + @doc("Total size of used storage in bytes.") + storageSize?: ResourceCounter; + + @doc("Total number of synonym maps.") + synonymMaps?: ResourceCounter; + + @doc("Total number of skillsets.") + skillsetCount?: ResourceCounter; +} + +model ServiceLimits { + @doc("The maximum allowed fields per index.") + maxFieldsPerIndex?: int32; + + @doc("The maximum depth which you can nest sub-fields in an index, including the top-level complex field. For example, a/b/c has a nesting depth of 3.") + maxFieldNestingDepthPerIndex?: int32; + + @doc("The maximum number of fields of type Collection(Edm.ComplexType) allowed in an index.") + maxComplexCollectionFieldsPerIndex?: int32; + + @doc("The maximum number of objects in complex collections allowed per document.") + maxComplexObjectsInCollectionsPerDocument?: int32; +} + +model ResourceCounter { + @doc("The resource usage amount.") + usage: int64; + + @doc("The resource amount quota.") + quota?: int64; +} + +@doc("Represents a schedule for indexer execution.") +model IndexingSchedule { + @doc("The interval of time between indexer executions.") + //@format("duration") + interval: string; + + @doc("The time when an indexer should start running.") + startTime?: utcDateTime; +} + +@doc("Represents parameters for indexer execution.") +model IndexingParameters { + @doc("The number of items that are read from the data source and indexed as a single batch in order to improve performance. The default depends on the data source type.") + batchSize?: int32; + + @doc("The maximum number of items that can fail indexing for indexer execution to still be considered successful. -1 means no limit. Default is 0.") + maxFailedItems?: int32; + + @doc("The maximum number of items in a single batch that can fail indexing for the batch to still be considered successful. -1 means no limit. Default is 0.") + maxFailedItemsPerBatch?: int32; + + configuration?: IndexingParametersConfiguration; +} + +@doc("A dictionary of indexer-specific configuration properties. Each name is the name of a specific property. Each value must be of a primitive type.") +model IndexingParametersConfiguration { + parsingMode?: BlobIndexerParsingMode; + + @doc("Comma-delimited list of filename extensions to ignore when processing from Azure blob storage. For example, you could exclude '.png, .mp4' to skip over those files during indexing.") + excludedFileNameExtensions?: string; + + @doc("Comma-delimited list of filename extensions to select when processing from Azure blob storage. For example, you could focus indexing on specific application files '.docx, .pptx, .msg' to specifically include those file types.") + indexedFileNameExtensions?: string; + + @doc("For Azure blobs, set to false if you want to continue indexing when an unsupported content type is encountered, and you don't know all the content types (file extensions) in advance.") + failOnUnsupportedContentType?: boolean = false; + + @doc("For Azure blobs, set to false if you want to continue indexing if a document fails indexing.") + failOnUnprocessableDocument?: boolean = false; + + @doc("For Azure blobs, set this property to true to still index storage metadata for blob content that is too large to process. Oversized blobs are treated as errors by default. For limits on blob size, see https://docs.microsoft.com/azure/search/search-limits-quotas-capacity.") + indexStorageMetadataOnlyForOversizedDocuments?: boolean = false; + + @doc("For CSV blobs, specifies a comma-delimited list of column headers, useful for mapping source fields to destination fields in an index.") + delimitedTextHeaders?: string; + + @doc("For CSV blobs, specifies the end-of-line single-character delimiter for CSV files where each line starts a new document (for example, \" | \").") + delimitedTextDelimiter?: string; + + @doc("For CSV blobs, indicates that the first (non-blank) line of each blob contains headers.") + firstLineContainsHeaders?: boolean = true; + + @doc("For JSON arrays, given a structured or semi-structured document, you can specify a path to the array using this property.") + documentRoot?: string; + + dataToExtract?: BlobIndexerDataToExtract; + imageAction?: BlobIndexerImageAction; + + @doc("If true, will create a path //document//file_data that is an object representing the original file data downloaded from your blob data source. This allows you to pass the original file data to a custom skill for processing within the enrichment pipeline, or to the Document Extraction skill.") + allowSkillsetToReadFileData?: boolean = false; + + pdfTextRotationAlgorithm?: BlobIndexerPDFTextRotationAlgorithm; + executionEnvironment?: IndexerExecutionEnvironment; + + @doc("Increases the timeout beyond the 5-minute default for Azure SQL database data sources, specified in the format 'hh:mm:ss'.") + queryTimeout?: string = "00:05:00"; +} + +@doc("Represents the parsing mode for indexing from an Azure blob data source.") +enum BlobIndexerParsingMode { + @doc("Set to default for normal file processing.") + Default: "default", + + @doc("Set to text to improve indexing performance on plain text files in blob storage.") + Text: "text", + + @doc("Set to delimitedText when blobs are plain CSV files.") + DelimitedText: "delimitedText", + + @doc("Set to json to extract structured content from JSON files.") + Json: "json", + + @doc("Set to jsonArray to extract individual elements of a JSON array as separate documents in Azure Cognitive Search.") + JsonArray: "jsonArray", + + @doc("Set to jsonLines to extract individual JSON entities, separated by a new line, as separate documents in Azure Cognitive Search.") + JsonLines: "jsonLines", +} + +@doc("Specifies the data to extract from Azure blob storage and tells the indexer which data to extract from image content when \"imageAction\" is set to a value other than \"none\". This applies to embedded image content in a .PDF or other application, or image files such as .jpg and .png, in Azure blobs.") +enum BlobIndexerDataToExtract { + @doc("Indexes just the standard blob properties and user-specified metadata.") + StorageMetadata: "storageMetadata", + + @doc("Extracts metadata provided by the Azure blob storage subsystem and the content-type specific metadata (for example, metadata unique to just .png files are indexed).") + AllMetadata: "allMetadata", + + @doc("Extracts all metadata and textual content from each blob.") + ContentAndMetadata: "contentAndMetadata", +} + +@doc("Determines how to process embedded images and image files in Azure blob storage. Setting the \"imageAction\" configuration to any value other than \"none\" requires that a skillset also be attached to that indexer.") +enum BlobIndexerImageAction { + @doc("Ignores embedded images or image files in the data set. This is the default.") + None: "none", + + @doc("Extracts text from images (for example, the word \"STOP\" from a traffic stop sign), and embeds it into the content field. This action requires that \"dataToExtract\" is set to \"contentAndMetadata\". A normalized image refers to additional processing resulting in uniform image output, sized and rotated to promote consistent rendering when you include images in visual search results. This information is generated for each image when you use this option.") + GenerateNormalizedImages: "generateNormalizedImages", + + @doc("Extracts text from images (for example, the word \"STOP\" from a traffic stop sign), and embeds it into the content field, but treats PDF files differently in that each page will be rendered as an image and normalized accordingly, instead of extracting embedded images. Non-PDF file types will be treated the same as if \"generateNormalizedImages\" was set.") + GenerateNormalizedImagePerPage: "generateNormalizedImagePerPage", +} + +@doc("Determines algorithm for text extraction from PDF files in Azure blob storage.") +enum BlobIndexerPDFTextRotationAlgorithm { + @doc("Leverages normal text extraction. This is the default.") + None: "none", + + @doc("May produce better and more readable text extraction from PDF files that have rotated text within them. Note that there may be a small performance speed impact when this parameter is used. This parameter only applies to PDF files, and only to PDFs with embedded text. If the rotated text appears within an embedded image in the PDF, this parameter does not apply.") + DetectAngles: "detectAngles", +} + +@doc("Specifies the environment in which the indexer should execute.") +enum IndexerExecutionEnvironment { + @doc("Indicates that Azure Cognitive Search can determine where the indexer should execute. This is the default environment when nothing is specified and is the recommended value.") + standard, + + @doc("Indicates that the indexer should run with the environment provisioned specifically for the search service. This should only be specified as the execution environment if the indexer needs to access resources securely over shared private link resources.") + private, +} + +@doc("Defines a mapping between a field in a data source and a target field in an index.") +model FieldMapping { + @doc("The name of the field in the data source.") + sourceFieldName: string; + + @doc("The name of the target field in the index. Same as the source field name by default.") + targetFieldName?: string; + + @doc("A function to apply to each source field value before indexing.") + mappingFunction?: FieldMappingFunction; +} + +@doc("Represents a function that transforms a value from a data source before indexing.") +model FieldMappingFunction { + @doc("The name of the field mapping function.") + name: string; + + @doc("A dictionary of parameter name/value pairs to pass to the function. Each value must be of a primitive type.") + parameters?: Record; +} + +model SearchIndexerCache { + @doc("The connection string to the storage account where the cache data will be persisted.") + storageConnectionString?: string; + + @doc("Specifies whether incremental reprocessing is enabled.") + enableReprocessing?: boolean; +} + +@doc("Represents the current status and execution history of an indexer.") +model SearchIndexerStatus { + @doc("Overall indexer status.") + status: IndexerStatus; + + @doc("The result of the most recent or an in-progress indexer execution.") + lastResult?: IndexerExecutionResult; + + @doc("History of the recent indexer executions, sorted in reverse chronological order.") + executionHistory: IndexerExecutionResult[]; + + @doc("The execution limits for the indexer.") + limits: SearchIndexerLimits; +} + +@doc("Represents the overall indexer status.") +enum IndexerStatus { + @doc("Indicates that the indexer is in an unknown state.") + Unknown: "unknown", + + @doc("Indicates that the indexer experienced an error that cannot be corrected without human intervention.") + Error: "error", + + @doc("Indicates that the indexer is running normally.") + Running: "running", +} + +@doc("Represents the result of an individual indexer execution.") +model IndexerExecutionResult { + @doc("The outcome of this indexer execution.") + status: IndexerExecutionStatus; + + @doc("The outcome of this indexer execution.") + statusDetail?: IndexerExecutionStatusDetail; + + @doc("All of the state that defines and dictates the indexer's current execution.") + currentState?: IndexerCurrentState; + + @doc("The error message indicating the top-level error, if any.") + errorMessage?: string; + + @doc("The start time of this indexer execution.") + startTime?: utcDateTime; + + @doc("The end time of this indexer execution, if the execution has already completed.") + endTime?: utcDateTime; + + @doc("The item-level indexing errors.") + @visibility("read") + errors: SearchIndexerError[]; + + @doc("The item-level indexing warnings.") + @visibility("read") + warnings: SearchIndexerWarning[]; + + @doc("The number of items that were processed during this indexer execution. This includes both successfully processed items and items where indexing was attempted but failed.") + @projectedName("json", "itemsProcessed") + @visibility("read") + itemCount: int32; + + @doc("The number of items that failed to be indexed during this indexer execution.") + @visibility("read") + @projectedName("json", "itemsFailed") + failedItemCount: int32; + + @doc("Change tracking state with which an indexer execution started.") + @visibility("read") + initialTrackingState?: string; + + @doc("Change tracking state with which an indexer execution finished.") + @visibility("read") + finalTrackingState?: string; +} + +@doc("Represents the status of an individual indexer execution.") +enum IndexerExecutionStatus { + @doc("An indexer invocation has failed, but the failure may be transient. Indexer invocations will continue per schedule.") + TransientFailure: "transientFailure", + + @doc("Indexer execution completed successfully.") + Success: "success", + + @doc("Indexer execution is in progress.") + InProgress: "inProgress", + + @doc("Indexer has been reset.") + Reset: "reset", +} + +@doc("Details the status of an individual indexer execution.") +enum IndexerExecutionStatusDetail { + @doc("Indicates that the reset that occurred was for a call to ResetDocs.") + ResetDocs: "resetDocs", +} + +@doc("Represents all of the state that defines and dictates the indexer's current execution.") +model IndexerCurrentState { + @doc("The mode the indexer is running in.") + mode?: IndexingMode; + + @doc("Change tracking state used when indexing starts on all documents in the datasource.") + allDocsInitialChangeTrackingState?: string; + + @doc("Change tracking state value when indexing finishes on all documents in the datasource.") + allDocsFinalChangeTrackingState?: string; + + @doc("Change tracking state used when indexing starts on select, reset documents in the datasource.") + resetDocsInitialChangeTrackingState?: string; + + @doc("Change tracking state value when indexing finishes on select, reset documents in the datasource.") + resetDocsFinalChangeTrackingState?: string; + + @doc("The list of document keys that have been reset. The document key is the document's unique identifier for the data in the search index. The indexer will prioritize selectively re-ingesting these keys.") + resetDocumentKeys?: string[]; + + @doc("The list of datasource document ids that have been reset. The datasource document id is the unique identifier for the data in the datasource. The indexer will prioritize selectively re-ingesting these ids.") + resetDatasourceDocumentIds?: string[]; +} + +@doc("Represents the mode the indexer is executing in.") +enum IndexingMode { + @doc("The indexer is indexing all documents in the datasource.") + IndexingAllDocs: "indexingAllDocs", + + @doc("The indexer is indexing selective, reset documents in the datasource. The documents being indexed are defined on indexer status.") + IndexingResetDocs: "indexingResetDocs", +} + +@doc("Represents an item- or document-level indexing error.") +model SearchIndexerError { + @doc("The key of the item for which indexing failed.") + key?: string; + + @doc("The message describing the error that occurred while processing the item.") + errorMessage: string; + + @doc("The status code indicating why the indexing operation failed. Possible values include: 400 for a malformed input document, 404 for document not found, 409 for a version conflict, 422 when the index is temporarily unavailable, or 503 for when the service is too busy.") + statusCode: int32; + + @doc("The name of the source at which the error originated. For example, this could refer to a particular skill in the attached skillset. This may not be always available.") + name?: string; + + @doc("Additional, verbose details about the error to assist in debugging the indexer. This may not be always available.") + details?: string; + + @doc("A link to a troubleshooting guide for these classes of errors. This may not be always available.") + documentationLink?: string; +} + +@doc("Represents an item-level warning.") +model SearchIndexerWarning { + @doc("The key of the item which generated a warning.") + key?: string; + + @doc("The message describing the warning that occurred while processing the item.") + message: string; + + @doc("The name of the source at which the warning originated. For example, this could refer to a particular skill in the attached skillset. This may not be always available.") + name?: string; + + @doc("Additional, verbose details about the warning to assist in debugging the indexer. This may not be always available.") + details?: string; + + @doc("A link to a troubleshooting guide for these classes of warnings. This may not be always available.") + documentationLink?: string; +} + +model SearchIndexerLimits { + @doc("The maximum duration that the indexer is permitted to run for one execution.") + maxRunTime?: string; + + @doc("The maximum size of a document, in bytes, which will be considered valid for indexing.") + maxDocumentExtractionSize?: int64; + + @doc("The maximum number of characters that will be extracted from a document picked up for indexing.") + maxDocumentContentCharactersToExtract?: int64; +} diff --git a/packages/samples/specs/data-plane/searchservice/skills.models.tsp b/packages/samples/specs/data-plane/searchservice/skills.models.tsp new file mode 100644 index 0000000000..1695dc1a51 --- /dev/null +++ b/packages/samples/specs/data-plane/searchservice/skills.models.tsp @@ -0,0 +1,588 @@ +import "./languages.tsp"; +import "./searchservice.models.tsp"; + +using TypeSpec.OpenAPI; +using TypeSpec.Rest; + +namespace Azure.SearchService; + +@doc("A list of skills.") +model SearchIndexerSkillset { + ...ETag; + + @doc("The name of the skillset.") + name: string; + + @doc("The description of the skillset.") + description?: string; + + @doc("A list of skills in the skillset.") + skills: SearchIndexerSkill[]; + + @doc("Details about cognitive services to be used when running skills.") + @projectedName("json", "cognitiveServices") + cognitiveServicesAccount?: CognitiveServicesAccount; + + @doc("Definition of additional projections to azure blob, table, or files, of enriched data.") + knowledgeStore?: SearchIndexerKnowledgeStore; + + @doc("A description of an encryption key that you create in Azure Key Vault. This key is used to provide an additional level of encryption-at-rest for your skillset definition when you want full assurance that no one, not even Microsoft, can decrypt your skillset definition in Azure Cognitive Search. Once you have encrypted your skillset definition, it will always remain encrypted. Azure Cognitive Search will ignore attempts to set this property to null. You can change this property as needed if you want to rotate your encryption key; Your skillset definition will be unaffected. Encryption with customer-managed keys is not available for free search services, and is only available for paid services created on or after January 1, 2019.") + encryptionKey?: SearchResourceEncryptionKey | null; +} + +@discriminator("@odata.type") +@doc("Base type for skills.") +model SearchIndexerSkill { + @doc("The name of the skill which uniquely identifies it within the skillset. A skill with no name defined will be given a default name of its 1-based index in the skills array, prefixed with the character '#'.") + name: string; + + @doc("The description of the skill which describes the inputs, outputs, and usage of the skill.") + description?: string; + + @doc("Represents the level at which operations take place, such as the document root or document content (for example, /document or /document/content). The default is /document.") + context?: string; + + @doc("Inputs of the skills could be a column in the source data set, or the output of an upstream skill.") + inputs: InputFieldMappingEntry[]; + + @doc("The output of a skill is either a field in a search index, or a value that can be consumed as an input by another skill.") + outputs: OutputFieldMappingEntry[]; +} + +@doc("Input field mapping for a skill.") +model InputFieldMappingEntry { + @doc("The name of the input.") + name: string; + + @doc("The source of the input.") + source?: string; + + @doc("The source context used for selecting recursive inputs.") + sourceContext?: string; + + @doc("The recursive inputs used when creating a complex type.") + inputs?: InputFieldMappingEntry[]; +} + +@doc("Output field mapping for a skill.") +model OutputFieldMappingEntry { + @doc("The name of the output defined by the skill.") + name: string; + + @doc("The target name of the output. It is optional and default to name.") + targetName?: string; +} + +@doc("A skill that enables scenarios that require a Boolean operation to determine the data to assign to an output.") +model ConditionalSkill extends SearchIndexerSkill { + `@odata.type`: "#Microsoft.Skills.Util.ConditionalSkill"; +} + +@doc("A skill that uses text analytics for key phrase extraction.") +model KeyPhraseExtractionSkill extends SearchIndexerSkill { + `@odata.type`: "#Microsoft.Skills.Text.KeyPhraseExtractionSkill"; + + @doc("A value indicating which language code to use. Default is en.") + defaultLanguageCode?: KeyPhraseExtractionSkillLanguage; + + @doc("A number indicating how many key phrases to return. If absent, all identified key phrases will be returned.") + maxKeyPhraseCount?: int32; + + @doc("The version of the model to use when calling the Text Analytics service. It will default to the latest available when not specified. We recommend you do not specify this value unless absolutely necessary.") + modelVersion?: string; +} + +@doc("A skill that uses text analytics for key phrase extraction.") +model OcrSkill extends SearchIndexerSkill { + `@odata.type`: "#Microsoft.Skills.Vision.OcrSkill"; + + @doc("A value indicating which language code to use. Default is en.") + defaultLanguageCode?: OcrSkillLanguage; + + @doc("A value indicating to turn orientation detection on or not. Default is false.") + @projectedName("json", "detectOrientation") + shouldDetectOrientation?: boolean = false; + + @doc("Defines the sequence of characters to use between the lines of text recognized by the OCR skill. The default value is \"space\".") + lineEnding?: LineEnding; // = LineEnding.Space https://github.com/microsoft/typespec/issues/130 +} + +enum LineEnding { + @doc("Lines are separated by a single space character.") + Space: "space", + + @doc("Lines are separated by a carriage return ('\\r') character.") + CarriageReturn: "carriageReturn", + + @doc("Lines are separated by a single line feed ('\\n') character.") + LineFeed: "lineFeed", + + @doc("Lines are separated by a carriage return and a line feed ('\\r\\n') character.") + CarriageReturnLineFeed: "carriageReturnLineFeed", +} + +@doc("A skill that analyzes image files. It extracts a rich set of visual features based on the image content.") +model ImageAnalysisSkill extends SearchIndexerSkill { + `@odata.type`: "#Microsoft.Skills.Vision.ImageAnalysisSkill"; + + @doc("A value indicating which language code to use. Default is en.") + defaultLanguageCode?: ImageAnalysisSkillLanguage; + + @doc("A list of visual features.") + visualFeatures: VisualFeature[]; + + @doc("A string indicating which domain-specific details to return.") + details: ImageDetail[]; +} + +@doc("The strings indicating what visual feature types to return.") +enum VisualFeature { + @doc("Visual features recognized as adult persons.") + Adult: "adult", + + @doc("Visual features recognized as commercial brands.") + Brands: "brands", + + @doc("Categories.") + Categories: "categories", + + @doc("Description.") + Description: "description", + + @doc("Visual features recognized as people faces.") + Faces: "faces", + + @doc("Visual features recognized as objects.") + Objects: "objects", + + @doc("Tags.") + Tags: "tags", +} + +@doc("A string indicating which domain-specific details to return.") +enum ImageDetail { + @doc("Details recognized as celebrities.") + Celebrities: "celebrities", + + @doc("Details recognized as landmarks.") + Landmarks: "landmarks", +} + +@doc("A skill that detects the language of input text and reports a single language code for every document submitted on the request. The language code is paired with a score indicating the confidence of the analysis.") +model LanguageDetectionSkill extends SearchIndexerSkill { + `@odata.type`: "#Microsoft.Skills.Text.LanguageDetectionSkill"; + + @doc("A country code to use as a hint to the language detection model if it cannot disambiguate the language.") + defaultCountryHint?: string; + + @doc("The version of the model to use when calling the Text Analytics service. It will default to the latest available when not specified. We recommend you do not specify this value unless absolutely necessary.") + modelVersion?: string; +} + +@doc("A skill for reshaping the outputs. It creates a complex type to support composite fields (also known as multipart fields).") +model ShaperSkill extends SearchIndexerSkill { + `@odata.type`: "#Microsoft.Skills.Util.ShaperSkill"; +} + +@doc("A skill for merging two or more strings into a single unified string, with an optional user-defined delimiter separating each component part.") +model MergeSkill extends SearchIndexerSkill { + `@odata.type`: "#Microsoft.Skills.Text.MergeSkill"; + + @doc("The tag indicates the start of the merged text. By default, the tag is an empty space.") + insertPreTag?: string = " "; + + @doc("The tag indicates the end of the merged text. By default, the tag is an empty space.") + insertPostTag?: string = " "; +} + +@doc("Text analytics entity recognition.") +model EntityRecognitionSkill extends SearchIndexerSkill { + `@odata.type`: "#Microsoft.Skills.Text.EntityRecognitionSkill"; + + @doc("A list of entity categories that should be extracted.") + categories?: EntityCategory[]; + + @doc("A value indicating which language code to use. Default is en.") + defaultLanguageCode?: EntityRecognitionSkillLanguage; + + @doc("Determines whether or not to include entities which are well known but don't conform to a pre-defined type. If this configuration is not set (default), set to null or set to false, entities which don't conform to one of the pre-defined types will not be surfaced.") + includeTypelessEntities?: boolean; + + @doc("A value between 0 and 1 that be used to only include entities whose confidence score is greater than the value specified. If not set (default), or if explicitly set to null, all entities will be included.") + minimumPrecision?: float64; +} + +@doc("A string indicating what entity categories to return.") +enum EntityCategory { + @doc("Entities describing a physical location.") + Location: "location", + + @doc("Entities describing an organization.") + Organization: "organization", + + @doc("Entities describing a person.") + Person: "person", + + @doc("Entities describing a quantity.") + Quantity: "quantity", + + @doc("Entities describing a date and time.") + Datetime: "datetime", + + @doc("Entities describing a URL.") + Url: "url", + + @doc("Entities describing an email address.") + Email: "email", +} + +@doc("Text analytics positive-negative sentiment analysis, scored as a floating point value in a range of zero to 1.") +model SentimentSkill extends SearchIndexerSkill { + `@odata.type`: "#Microsoft.Skills.Text.SentimentSkill"; + + @doc("A value indicating which language code to use. Default is en.") + defaultLanguageCode?: SentimentSkillLanguage; +} + +@doc("Using the Text Analytics API, evaluates unstructured text and for each record, provides sentiment labels (such as \"negative\", \"neutral\" and \"positive\") based on the highest confidence score found by the service at a sentence and document-level.") +model SentimentSkillV3 extends SearchIndexerSkill { + `@odata.type`: "#Microsoft.Skills.Text.V3.SentimentSkill"; + + @doc("A value indicating which language code to use. Default is en.") + defaultLanguageCode?: string; + + @doc("If set to true, the skill output will include information from Text Analytics for opinion mining, namely targets (nouns or verbs) and their associated assessment (adjective) in the text. Default is false.") + includeOpinionMining?: boolean = false; + + @doc("The version of the model to use when calling the Text Analytics service. It will default to the latest available when not specified. We recommend you do not specify this value unless absolutely necessary.") + modelVersion: string; +} + +@doc("Using the Text Analytics API, extracts linked entities from text.") +model EntityLinkingSkill extends SearchIndexerSkill { + `@odata.type`: "#Microsoft.Skills.Text.V3.EntityLinkingSkill"; + + @doc("A value indicating which language code to use. Default is en.") + defaultLanguageCode?: string; + + @doc("A value between 0 and 1 that be used to only include entities whose confidence score is greater than the value specified. If not set (default), or if explicitly set to null, all entities will be included.") + @minValue(0) + @maxValue(1) + minimumPrecision?: float64; + + @doc("The version of the model to use when calling the Text Analytics service. It will default to the latest available when not specified. We recommend you do not specify this value unless absolutely necessary.") + modelVersion?: string; +} + +@doc("Using the Text Analytics API, extracts entities of different types from text.") +model EntityRecognitionSkillV3 extends SearchIndexerSkill { + `@odata.type`: "#Microsoft.Skills.Text.V3.EntityRecognitionSkill"; + + @doc("A list of entity categories that should be extracted.") + categories?: string[]; + + @doc("A value indicating which language code to use. Default is en.") + defaultLanguageCode?: string; + + @doc("A value between 0 and 1 that be used to only include entities whose confidence score is greater than the value specified. If not set (default), or if explicitly set to null, all entities will be included.") + @minValue(0) + @maxValue(1) + minimumPrecision?: float64; + + @doc("The version of the model to use when calling the Text Analytics service. It will default to the latest available when not specified. We recommend you do not specify this value unless absolutely necessary.") + modelVersion?: string; +} + +@doc("Using the Text Analytics API, extracts personal information from an input text and gives you the option of masking it.") +model PIIDetectionSkill extends SearchIndexerSkill { + `@odata.type`: "#Microsoft.Skills.Text.PIIDetectionSkill"; + + @doc("A value indicating which language code to use. Default is en.") + defaultLanguageCode?: string; + + @doc("A value between 0 and 1 that be used to only include entities whose confidence score is greater than the value specified. If not set (default), or if explicitly set to null, all entities will be included.") + @minValue(0) + @maxValue(1) + minimumPrecision?: float64; + + @doc("A parameter that provides various ways to mask the personal information detected in the input text. Default is 'none'.") + maskingMode?: PIIDetectionSkillMaskingMode; // = PIIDetectionSkillMaskingMode.None + + @doc("The character used to mask the text if the maskingMode parameter is set to replace. Default is '*'.") + @maxLength(1) + maskingCharacter?: string; + + @doc("The version of the model to use when calling the Text Analytics service. It will default to the latest available when not specified. We recommend you do not specify this value unless absolutely necessary.") + modelVersion?: string; + + @doc("A list of PII entity categories that should be extracted and masked.") + piiCategories?: string[]; + + @doc("If specified, will set the PII domain to include only a subset of the entity categories. Possible values include: 'phi', 'none'. Default is 'none'.") + domain?: string; +} + +enum PIIDetectionSkillMaskingMode { + @doc("No masking occurs and the maskedText output will not be returned.") + None: "none", + + @doc("Replaces the detected entities with the character given in the maskingCharacter parameter. The character will be repeated to the length of the detected entity so that the offsets will correctly correspond to both the input text as well as the output maskedText.") + Replace: "replace", +} + +@doc("A skill to split a string into chunks of text.") +model SplitSkill extends SearchIndexerSkill { + `@odata.type`: "#Microsoft.Skills.Text.SplitSkill"; + + @doc("A value indicating which language code to use. Default is en.") + defaultLanguageCode?: SplitSkillLanguage; + + @doc("A value indicating which split mode to perform.") + textSplitMode: TextSplitMode; + + @doc("The desired maximum page length. Default is 10000.") + maximumPageLength?: int32 = 10000; +} + +@doc("A value indicating which split mode to perform.") +model TextSplitMode { + @doc("Split the text into individual pages.") + Pages: "pages"; + + @doc("Split the text into individual sentences.") + Sentences: "sentences"; +} + +@doc("A skill looks for text from a custom, user-defined list of words and phrases.") +model CustomEntityLookupSkill extends SearchIndexerSkill { + `@odata.type`: "#Microsoft.Skills.Text.CustomEntityLookupSkill"; + + @doc("A value indicating which language code to use. Default is en.") + defaultLanguageCode?: CustomEntityLookupSkillLanguage; + + @doc("Path to a JSON or CSV file containing all the target text to match against. This entity definition is read at the beginning of an indexer run. Any updates to this file during an indexer run will not take effect until subsequent runs. This config must be accessible over HTTPS.") + entitiesDefinitionUri?: string; + + @doc("The inline CustomEntity definition.") + inlineEntitiesDefinition?: CustomEntity[]; + + @doc("A global flag for CaseSensitive. If CaseSensitive is not set in CustomEntity, this value will be the default value.") + globalDefaultCaseSensitive?: boolean; + + @doc("A global flag for AccentSensitive. If AccentSensitive is not set in CustomEntity, this value will be the default value.") + globalDefaultAccentSensitive?: boolean; + + @doc("A global flag for FuzzyEditDistance. If FuzzyEditDistance is not set in CustomEntity, this value will be the default value.") + globalDefaultFuzzyEditDistance?: int32; +} + +@doc("An object that contains information about the matches that were found, and related metadata.") +model CustomEntity { + @doc("The top-level entity descriptor. Matches in the skill output will be grouped by this name, and it should represent the \"normalized\" form of the text being found.") + name: string; + + @doc("This field can be used as a passthrough for custom metadata about the matched text(s). The value of this field will appear with every match of its entity in the skill output.") + description?: string; + + @doc("This field can be used as a passthrough for custom metadata about the matched text(s). The value of this field will appear with every match of its entity in the skill output.") + type?: string; + + @doc("This field can be used as a passthrough for custom metadata about the matched text(s). The value of this field will appear with every match of its entity in the skill output.") + subtype?: string; + + @doc("This field can be used as a passthrough for custom metadata about the matched text(s). The value of this field will appear with every match of its entity in the skill output.") + id?: string; + + @doc("Defaults to false. Boolean value denoting whether comparisons with the entity name should be sensitive to character casing. Sample case insensitive matches of \"Microsoft\" could be: microsoft, microSoft, MICROSOFT.") + caseSensitive?: boolean = false; + + @doc("Defaults to false. Boolean value denoting whether comparisons with the entity name should be sensitive to accent.") + accentSensitive?: boolean = false; + + @doc("Defaults to 0. Maximum value of 5. Denotes the acceptable number of divergent characters that would still constitute a match with the entity name. The smallest possible fuzziness for any given match is returned. For instance, if the edit distance is set to 3, \"Windows10\" would still match \"Windows\", \"Windows10\" and \"Windows 7\". When case sensitivity is set to false, case differences do NOT count towards fuzziness tolerance, but otherwise do.") + fuzzyEditDistance?: int32 = 0; + + @doc("Changes the default case sensitivity value for this entity. It be used to change the default value of all aliases caseSensitive values.") + defaultCaseSensitive?: boolean; + + @doc("Changes the default case sensitivity value for this entity. It be used to change the default value of all aliases caseSensitive values.") + defaultAccentSensitive?: boolean; + + @doc("Changes the default fuzzy edit distance value for this entity. It can be used to change the default value of all aliases fuzzyEditDistance values.") + defaultFuzzyEditDistance?: int32; + + @doc("An array of complex objects that can be used to specify alternative spellings or synonyms to the root entity name.") + aliases?: CustomEntityAlias[]; +} + +@doc("A complex object that can be used to specify alternative spellings or synonyms to the root entity name.") +model CustomEntityAlias { + @doc("The text of the alias.") + text: string; + + @doc("Determine if the alias is case sensitive.") + caseSensitive?: boolean; + + @doc("Determine if the alias is accent sensitive.") + accentSensitive?: boolean; + + @doc("Determine the fuzzy edit distance of the alias.") + fuzzyEditDistance?: int32; +} + +@doc("A skill to translate text from one language to another.") +model TextTranslationSkill extends SearchIndexerSkill { + `@odata.type`: "#Microsoft.Skills.Text.TranslationSkill"; + + @doc("The language code to translate documents into for documents that don't specify the to language explicitly. ") + defaultToLanguageCode: TextTranslationSkillLanguage; + + @doc("The language code to translate documents from for documents that don't specify the from language explicitly.") + defaultFromLanguageCode: TextTranslationSkillLanguage; + + @doc("The language code to translate documents from when neither the fromLanguageCode input nor the defaultFromLanguageCode parameter are provided, and the automatic language detection is unsuccessful. Default is en.") + suggestedFrom?: TextTranslationSkillLanguage; +} + +@doc("A skill that extracts content from a file within the enrichment pipeline.") +model DocumentExtractionSkill extends SearchIndexerSkill { + `@odata.type`: "#Microsoft.Skills.Util.DocumentExtractionSkill"; + + @doc("The parsingMode for the skill. Will be set to 'default' if not defined.") + parsingMode?: string; + + @doc("The type of data to be extracted for the skill. Will be set to 'contentAndMetadata' if not defined.") + dataToExtract?: string; + + @doc("A dictionary of configurations for the skill.") + configuration?: Record<{}>; +} + +@doc("A skill that can call a Web API endpoint, allowing you to extend a skillset by having it call your custom code.") +model WebApiSkill extends SearchIndexerSkill { + `@odata.type`: "#Microsoft.Skills.Custom.WebApiSkill"; + + @doc("The url for the Web API.") + uri: string; + + @doc("The method for the http request.") + httpMethod: string; + + @doc("The desired timeout for the request. Default is 30 seconds.") + timeout?: duration; + + @doc("The desired batch size which indicates number of documents.") + batchSize?: int32; + + @doc("If set, the number of parallel calls that can be made to the Web API.") + degreeOfParallelism?: int32; +} + +@doc("The AML skill allows you to extend AI enrichment with a custom Azure Machine Learning (AML) model. Once an AML model is trained and deployed, an AML skill integrates it into AI enrichment.") +model AmlSkill extends SearchIndexerSkill { + `@odata.type`: "#Microsoft.Skills.Custom.AmlSkill"; + + @doc("(Required for no authentication or key authentication) The scoring URI of the AML service to which the JSON payload will be sent. Only the https URI scheme is allowed.") + uri?: string; + + @doc("(Required for key authentication) The key for the AML service.") + key?: string; + + @doc("(Required for token authentication). The Azure Resource Manager resource ID of the AML service. It should be in the format subscriptions/{guid}/resourceGroups/{resource-group-name}/Microsoft.MachineLearningServices/workspaces/{workspace-name}/services/{service_name}.") + resourceId?: string; + + @doc("(Optional) When specified, indicates the timeout for the http client making the API call.") + timeout?: duration; + + @doc("(Optional for token authentication). The region the AML service is deployed in.") + region?: string; + + @doc("(Optional) When specified, indicates the number of calls the indexer will make in parallel to the endpoint you have provided. You can decrease this value if your endpoint is failing under too high of a request load, or raise it if your endpoint is able to accept more requests and you would like an increase in the performance of the indexer. If not set, a default value of 5 is used. The degreeOfParallelism can be set to a maximum of 10 and a minimum of 1.") + degreeOfParallelism?: int32; +} + +@doc("Base type for describing any cognitive service resource attached to a skillset.") +model CognitiveServicesAccount { + @doc("Description of the cognitive service resource attached to a skillset.") + description: string; +} + +@doc("An empty object that represents the default cognitive service resource for a skillset.") +model DefaultCognitiveServicesAccount extends CognitiveServicesAccount { + `@odata.type`: "#Microsoft.Azure.Search.DefaultCognitiveServices"; +} + +@doc("A cognitive service resource provisioned with a key that is attached to a skillset.") +model CognitiveServicesAccountKey extends CognitiveServicesAccount { + `@odata.type`: "#Microsoft.Azure.Search.CognitiveServicesByKey"; + + @doc("The key used to provision the cognitive service resource attached to a skillset.") + key: string; +} + +@doc("Definition of additional projections to azure blob, table, or files, of enriched data.") +model SearchIndexerKnowledgeStore { + @doc("The connection string to the storage account projections will be stored in.") + storageConnectionString: string; + + @doc("A list of additional projections to perform during indexing.") + projections: SearchIndexerKnowledgeStoreProjection[]; +} + +@doc("Container object for various projection selectors.") +model SearchIndexerKnowledgeStoreProjection { + @doc("Projections to Azure Table storage.") + tables?: SearchIndexerKnowledgeStoreTableProjectionSelector; + + @doc("Projections to Azure Blob storage.") + objects?: SearchIndexerKnowledgeStoreObjectProjectionSelector; + + @doc("Projections to Azure File storage.") + files?: SearchIndexerKnowledgeStoreFileProjectionSelector; +} + +@doc("Abstract class to share properties between concrete selectors.") +model SearchIndexerKnowledgeStoreProjectionSelector { + @doc("Name of reference key to different projection.") + referenceKeyName?: string; + + @doc("Name of generated key to store projection under.") + generatedKeyName?: string; + + @doc("Source data to project.") + source?: string; + + @doc("Source context for complex projections.") + sourceContext?: string; + + @doc("Nested inputs for complex projections.") + inputs?: InputFieldMappingEntry[]; +} + +@doc("Description for what data to store in Azure Tables.") +model SearchIndexerKnowledgeStoreTableProjectionSelector + extends SearchIndexerKnowledgeStoreProjectionSelector { + @doc("Name of the Azure table to store projected data in.") + tableName: string; +} + +@doc("Abstract class to share properties between concrete selectors.") +model SearchIndexerKnowledgeStoreBlobProjectionSelector + extends SearchIndexerKnowledgeStoreProjectionSelector { + @doc("Blob container to store projections in.") + storageContainer: string; +} + +@doc("Projection definition for what data to store in Azure Blob.") +model SearchIndexerKnowledgeStoreObjectProjectionSelector + extends SearchIndexerKnowledgeStoreBlobProjectionSelector {} + +@doc("Projection definition for what data to store in Azure Files.") +model SearchIndexerKnowledgeStoreFileProjectionSelector + extends SearchIndexerKnowledgeStoreBlobProjectionSelector {} + +@doc("The names of skills to reset.") +model SkillNames { + @doc("the names of skills to be reset.") + skillNames: string[]; +} diff --git a/packages/samples/specs/data-plane/searchservice/skills.ops.tsp b/packages/samples/specs/data-plane/searchservice/skills.ops.tsp new file mode 100644 index 0000000000..528f25a463 --- /dev/null +++ b/packages/samples/specs/data-plane/searchservice/skills.ops.tsp @@ -0,0 +1,88 @@ +import "@typespec/http"; +import "@typespec/rest"; +import "./common.tsp"; +import "./skills.models.tsp"; + +using TypeSpec.Http; + +namespace Azure.SearchService; + +@tag("Skillsets") +interface Skillsets { + @route("/skillsets") + @doc("List all skillsets in a search service.") + @get + list(...SelectParameter, ...ClientRequestIdParameter, ...ApiVersionParameter): CollectionResult< + SearchIndexerSkillset, + "Skillsets" + > | SearchError; + + @route("/skillsets") + @doc("Creates a new skillset in a search service.") + @post + create( + @doc("The skillset containing one or more skills to create in a search service.") + @body + body: SearchIndexerSkillset, + + ...ClientRequestIdParameter, + ...ApiVersionParameter, + ): SearchCreatedResponse | SearchError; + + @doc("Retrieves a skillset in a search service.") + @route("/skillsets('{skillsetName}')") + @get + get( + @doc("The name of the skillset to retrieve.") + @path + skillsetName: string, + + ...ClientRequestIdParameter, + ...ApiVersionParameter, + ): SearchIndexerSkillset | SearchError; + + @doc("Creates a new skillset in a search service or updates the skillset if it already exists.") + @route("/skillsets('{skillsetName}')") + @put + createOrUpdate( + @doc("The name of the skillset to create or update.") + @path + skillsetName: string, + + @doc("The skillset containing one or more skills to create or update in a search service.") + @body + body: SearchIndexerSkillset, + + ...ClientRequestIdParameter, + ...ApiVersionParameter, + ): SearchIndexerSkillset | SearchError; + + @doc("Deletes a skillset in a search service.") + @route("/skillsets('{skillsetName}')") + @delete + delete( + @doc("The name of the skillset to delete.") + @path + skillsetName: string, + + ...ClientRequestIdParameter, + ...IfMatchParameter, + ...IfNoneMatchParameter, + ...ApiVersionParameter, + ): NoContentResponse | SearchError; + + @doc("Reset an existing skillset in a search service") + @route("/skillsets('{skillsetName}')") + @post + resetSkills( + @doc("The name of the skillset to reset.") + @path + skillsetName: string, + + @body + body: SkillNames, + + ...ClientRequestIdParameter, + ...ApiVersionParameter, + ): NoContentResponse | SearchError; +} diff --git a/packages/samples/specs/data-plane/trait-versioning/main.tsp b/packages/samples/specs/data-plane/trait-versioning/main.tsp new file mode 100644 index 0000000000..d08af0a567 --- /dev/null +++ b/packages/samples/specs/data-plane/trait-versioning/main.tsp @@ -0,0 +1,121 @@ +import "@typespec/http"; +import "@typespec/rest"; +import "@typespec/versioning"; +import "@azure-tools/typespec-azure-core"; + +using TypeSpec.Http; +using TypeSpec.Rest; +using TypeSpec.Versioning; +using Azure.Core; +using Azure.Core.Traits; + +@service({ + title: "Contoso Widget Manager", +}) +@versioned(Contoso.WidgetManager.Versions) +namespace Contoso.WidgetManager; + +@doc("The Contoso Widget Manager service version.") +enum Versions { + @doc("Version 2022-08-31") + @useDependency(Azure.Core.Versions.v1_0_Preview_2) + v2022_08_31: "2022-08-31", + + @doc("Version 2023-02-07") + @useDependency(Azure.Core.Versions.v1_0_Preview_2) + v2023_02_07: "2023-02-07", +} + +// Models //////////////////// + +@doc("A widget.") +@resource("widgets") +model Widget { + @key("widgetName") + @doc("The widget name.") + @visibility("read") + name: string; + + @doc("The ID of the widget's manufacturer.") + manufacturerId: string; + + ...EtagProperty; +} + +@doc("A manufacturer of widgets.") +@resource("manufacturers") +model Manufacturer { + @key("manufacturerId") + @doc("The manufacturer's unique ID.") + @visibility("read") + id: string; + + @doc("The manufacturer's name.") + name: string; + + @doc("The manufacturer's full address.") + address: string; + + ...EtagProperty; +} + +// Operations //////////////////// + +alias ServiceTraits = SupportsRepeatableRequests & + SupportsConditionalRequests & + SupportsClientRequestId; + +alias Operations = Azure.Core.ResourceOperations; + +interface Widgets { + // Operation Status + @doc("Gets status of a Widget operation.") + getWidgetOperationStatus is Operations.GetResourceOperationStatus; + + // Widget Operations + @doc("Creates or updates a Widget asynchronously") + @pollingOperation(Widgets.getWidgetOperationStatus) + createOrUpdateWidget is Operations.LongRunningResourceCreateOrUpdate; + + @doc("Get a Widget") + getWidget is Operations.ResourceRead; + + @doc("Delete a Widget asynchronously.") + @pollingOperation(Widgets.getWidgetOperationStatus) + deleteWidget is Operations.LongRunningResourceDelete; + + @doc("List Widget resources") + listWidgets is Operations.ResourceList< + Widget, + ListQueryParametersTrait + >; +} + +interface Manufacturers { + @doc("Gets status of a Manufacturer operation.") + getManufacturerOperationStatus is Operations.GetResourceOperationStatus; + + @doc("Creates or replaces a Manufacturer") + createOrReplaceManufacturer is Operations.ResourceCreateOrReplace; + + @doc("Get a Manufacturer") + getManufacturer is Operations.ResourceRead; + + @doc("Delete a Manufacturer asynchronously.") + @pollingOperation(Manufacturers.getManufacturerOperationStatus) + deleteManufacturer is Operations.LongRunningResourceDelete; + + @doc("List Manufacturer resources") + listManufacturers is Operations.ResourceList; +} + +// A "global" RPC operation +@route("/service-status") +@doc("Responds with status information about the overall service.") +op getServiceStatus is RpcOperation< + {}, + { + statusString: string; + }, + ServiceTraits +>; diff --git a/packages/samples/specs/data-plane/widget-manager/main.tsp b/packages/samples/specs/data-plane/widget-manager/main.tsp new file mode 100644 index 0000000000..9d1e78dc1c --- /dev/null +++ b/packages/samples/specs/data-plane/widget-manager/main.tsp @@ -0,0 +1,274 @@ +import "@typespec/http"; +import "@typespec/rest"; +import "@typespec/versioning"; +import "@azure-tools/typespec-azure-core"; + +using TypeSpec.Http; +using TypeSpec.Rest; +using TypeSpec.Versioning; +using Azure.Core; +using Azure.Core.Traits; + +@service({ + title: "Contoso Widget Manager", +}) +@versioned(Contoso.WidgetManager.Versions) +namespace Contoso.WidgetManager; + +@doc("The Contoso Widget Manager service version.") +enum Versions { + @doc("Version 2022-08-31") + @useDependency(Azure.Core.Versions.v1_0_Preview_2) + `2022-08-31`, +} + +// Models //////////////////// + +@doc("The color of a widget.") +enum WidgetColor { + @doc("Black") + Black, + + @doc("White") + White, + + @doc("Red") + Red, + + @doc("Green") + Green, + + @doc("Blue") + Blue, +} + +@doc("A widget.") +@resource("widgets") +model Widget { + @key("widgetName") + @doc("The widget name.") + @visibility("read") + name: string; + + @doc("The widget color.") + color: WidgetColor; + + @doc("The ID of the widget's manufacturer.") + manufacturerId: string; + + ...EtagProperty; +} + +@doc("The repair state of a widget.") +@lroStatus +enum WidgetRepairState { + @doc("Widget repairs succeeded.") + Succeeded, + + @doc("Widget repairs failed.") + Failed, + + @doc("Widget repairs were canceled.") + Canceled, + + @doc("Widget was sent to the manufacturer.") + SentToManufacturer, +} + +@doc("A submitted repair request for a widget.") +model WidgetRepairRequest { + @doc("The state of the widget repair request.") + requestState: WidgetRepairState; + + @doc("The date and time when the repair is scheduled to occur.") + scheduledDateTime: utcDateTime; + + @doc("The date and time when the request was created.") + createdDateTime: utcDateTime; + + @doc("The date and time when the request was updated.") + updatedDateTime: utcDateTime; + + @doc("The date and time when the request was completed.") + completedDateTime: utcDateTime; +} + +@doc("The parameters for a widget status request") +model WidgetRepairStatusParams { + @doc("The ID of the widget being repaired.") + @path + widgetId: string; +} + +@doc("A widget's part.") +@resource("parts") +@parentResource(Widget) +model WidgetPart { + @key("widgetPartName") + @doc("The name of the part.") + @visibility("read") + name: string; + + @doc("The ID to use for reordering the part.") + partId: string; + + @doc("The ID of the part's manufacturer.") + manufacturerId: string; + + ...EtagProperty; +} + +@doc("The details of a reorder request for a WidgetPart.") +model WidgetPartReorderRequest { + @doc("Identifies who signed off the reorder request.") + signedOffBy: string; +} + +// An example of a singleton resource +@doc("Provides analytics about the use and maintenance of a Widget.") +@resource("analytics") +@parentResource(Widget) +model WidgetAnalytics { + @key("analyticsId") + @doc("The identifier for the analytics object. There is only one named 'current'.") + @visibility("read") + id: "current"; + + @doc("The number of uses of the widget.") + useCount: int64; + + @doc("The number of times the widget was repaired.") + repairCount: int64; +} + +@doc("A manufacturer of widgets.") +@resource("manufacturers") +model Manufacturer { + @key("manufacturerId") + @doc("The manufacturer's unique ID.") + @visibility("read") + id: string; + + @doc("The manufacturer's name.") + name: string; + + @doc("The manufacturer's full address.") + address: string; + + ...EtagProperty; +} + +// Operations //////////////////// + +alias ServiceTraits = SupportsRepeatableRequests & + SupportsConditionalRequests & + SupportsClientRequestId; + +alias Operations = Azure.Core.ResourceOperations; + +interface Widgets { + // Operation Status + @doc("Gets status of a Widget operation.") + getWidgetOperationStatus is Operations.GetResourceOperationStatus; + + // Widget Operations + @doc("Creates or updates a Widget asynchronously") + @pollingOperation(Widgets.getWidgetOperationStatus) + createOrUpdateWidget is Operations.LongRunningResourceCreateOrUpdate; + + @doc("Get a Widget") + getWidget is Operations.ResourceRead; + + @doc("Delete a Widget asynchronously.") + @pollingOperation(Widgets.getWidgetOperationStatus) + deleteWidget is Operations.LongRunningResourceDelete; + + @doc("List Widget resources") + listWidgets is Operations.ResourceList< + Widget, + ListQueryParametersTrait + >; + + // Widget Analytics + @doc("Get a WidgetAnalytics") + getAnalytics is Operations.ResourceRead; + + @doc("Creates or updates a WidgetAnalytics") + updateAnalytics is Operations.ResourceCreateOrUpdate; + + // Widget Repair Operations + #suppress "@azure-tools/typespec-azure-core/use-standard-operations" "This is a custom operation status endpoint." + @doc("Get the status of a WidgetRepairRequest.") + @route("/widgets/{widgetId}/repairs/{operationId}") + getRepairStatus is Foundations.GetOperationStatus; + + @doc("Schedule a widget for repairs.") + @pollingOperation(Widgets.getWidgetOperationStatus) + scheduleRepairs is Operations.LongRunningResourceAction< + Widget, + WidgetRepairRequest, + WidgetRepairRequest & RequestIdResponseHeader + >; +} + +interface WidgetParts { + @doc("Gets status of a WidgetPart operation.") + getWidgetPartOperationStatus is Operations.GetResourceOperationStatus; + + @doc("Creates a WidgetPart") + createWidgetPart is Operations.ResourceCreateWithServiceProvidedName; + + @doc("Get a WidgetPart") + getWidgetPart is Operations.ResourceRead; + + @doc("Delete a WidgetPart") + deleteWidgetPart is Operations.ResourceDelete; + + @doc("List WidgetPart resources") + listWidgetParts is Operations.ResourceList; + + @doc("Reorder all parts for the widget.") + @pollingOperation(WidgetParts.getWidgetPartOperationStatus) + reorderParts is Operations.LongRunningResourceCollectionAction< + WidgetPart, + WidgetPartReorderRequest, + TypeSpec.Http.AcceptedResponse + >; +} + +interface Manufacturers { + @doc("Gets status of a Manufacturer operation.") + getManufacturerOperationStatus is Operations.GetResourceOperationStatus; + + @doc("Creates or replaces a Manufacturer") + createOrReplaceManufacturer is Operations.ResourceCreateOrReplace; + + @doc("Get a Manufacturer") + getManufacturer is Operations.ResourceRead; + + @doc("Delete a Manufacturer asynchronously.") + @pollingOperation(Manufacturers.getManufacturerOperationStatus) + deleteManufacturer is Operations.LongRunningResourceDelete; + + @doc("List Manufacturer resources") + listManufacturers is Operations.ResourceList; +} + +// A "global" RPC operation +@route("service-status") +@doc("Responds with status information about the overall service.") +op getServiceStatus is RpcOperation< + {}, + { + statusString: string; + }, + ServiceTraits +>; + +model CustomResult { + @lroResult + MyResult: string; + + @lroErrorResult + MyError: string; +} diff --git a/packages/samples/specs/misc/appconfig/api.json b/packages/samples/specs/misc/appconfig/api.json new file mode 100644 index 0000000000..79620db843 --- /dev/null +++ b/packages/samples/specs/misc/appconfig/api.json @@ -0,0 +1,1313 @@ +{ + "swagger": "2.0", + "info": { + "version": "1.0", + "title": "Azure App Configuration" + }, + "schemes": ["https"], + "paths": { + "/keys": { + "get": { + "tags": ["Keys"], + "summary": "Gets a list of keys.", + "operationId": "GetKeys", + "consumes": [], + "produces": [ + "application/vnd.microsoft.appconfig.keyset+json", + "application/json", + "application/problem+json" + ], + "parameters": [ + { + "name": "name", + "in": "query", + "description": "A filter for the name of the returned keys.", + "type": "string" + }, + { + "$ref": "#/parameters/SyncTokens" + }, + { + "$ref": "#/parameters/ApiVersion" + }, + { + "name": "After", + "in": "query", + "description": "Instructs the server to return elements that appear after the element referred to by the specified token.", + "type": "string" + }, + { + "name": "Accept-Datetime", + "in": "header", + "description": "Requests the server to respond with the state of the resource at the specified time.", + "type": "string" + } + ], + "responses": { + "200": { + "description": "Success", + "schema": { + "$ref": "#/definitions/KeyListResult" + }, + "headers": { + "Sync-Token": { + "description": "Enables real-time consistency between requests by providing the returned value in the next request made to the server.", + "type": "string" + } + } + }, + "default": { + "description": "Error response describing why the operation failed", + "schema": { + "$ref": "#/definitions/Error" + } + } + }, + "x-ms-examples": { + "GetKeys": { + "$ref": "./examples/GetKeys.json" + } + }, + "x-ms-pageable": { + "itemName": "items", + "nextLinkName": "@nextLink" + } + }, + "head": { + "tags": ["Keys"], + "summary": "Requests the headers and status of the given resource.", + "operationId": "CheckKeys", + "consumes": [], + "produces": [], + "parameters": [ + { + "name": "name", + "in": "query", + "description": "A filter for the name of the returned keys.", + "type": "string" + }, + { + "$ref": "#/parameters/SyncTokens" + }, + { + "$ref": "#/parameters/ApiVersion" + }, + { + "name": "After", + "in": "query", + "description": "Instructs the server to return elements that appear after the element referred to by the specified token.", + "type": "string" + }, + { + "name": "Accept-Datetime", + "in": "header", + "description": "Requests the server to respond with the state of the resource at the specified time.", + "type": "string" + } + ], + "responses": { + "200": { + "description": "Success", + "headers": { + "Sync-Token": { + "description": "Enables real-time consistency between requests by providing the returned value in the next request made to the server.", + "type": "string" + } + } + }, + "default": { + "description": "Error response describing why the operation failed" + } + }, + "x-ms-examples": { + "CheckKeys": { + "$ref": "./examples/CheckKeys.json" + } + } + } + }, + "/kv": { + "get": { + "tags": ["KeyValues"], + "summary": "Gets a list of key-values.", + "operationId": "GetKeyValues", + "consumes": [], + "produces": [ + "application/vnd.microsoft.appconfig.kvset+json", + "application/json", + "application/problem+json" + ], + "parameters": [ + { + "name": "key", + "in": "query", + "description": "A filter used to match keys.", + "type": "string" + }, + { + "name": "label", + "in": "query", + "description": "A filter used to match labels", + "type": "string" + }, + { + "$ref": "#/parameters/SyncTokens" + }, + { + "$ref": "#/parameters/ApiVersion" + }, + { + "name": "After", + "in": "query", + "description": "Instructs the server to return elements that appear after the element referred to by the specified token.", + "type": "string" + }, + { + "name": "Accept-Datetime", + "in": "header", + "description": "Requests the server to respond with the state of the resource at the specified time.", + "type": "string" + }, + { + "name": "$Select", + "in": "query", + "description": "Used to select what fields are present in the returned resource(s).", + "type": "array", + "items": { + "type": "string", + "enum": [ + "key", + "label", + "content_type", + "value", + "last_modified", + "tags", + "locked", + "etag" + ] + }, + "collectionFormat": "csv" + } + ], + "responses": { + "200": { + "description": "Success", + "schema": { + "$ref": "#/definitions/KeyValueListResult" + }, + "headers": { + "Sync-Token": { + "description": "Enables real-time consistency between requests by providing the returned value in the next request made to the server.", + "type": "string" + } + } + }, + "default": { + "description": "Error response describing why the operation failed", + "schema": { + "$ref": "#/definitions/Error" + } + } + }, + "x-ms-examples": { + "GetKeyValues": { + "$ref": "./examples/GetKeyValues.json" + } + }, + "x-ms-pageable": { + "itemName": "items", + "nextLinkName": "@nextLink" + } + }, + "head": { + "tags": ["KeyValues"], + "summary": "Requests the headers and status of the given resource.", + "operationId": "CheckKeyValues", + "consumes": [], + "produces": [], + "parameters": [ + { + "name": "key", + "in": "query", + "description": "A filter used to match keys.", + "type": "string" + }, + { + "name": "label", + "in": "query", + "description": "A filter used to match labels", + "type": "string" + }, + { + "$ref": "#/parameters/SyncTokens" + }, + { + "$ref": "#/parameters/ApiVersion" + }, + { + "name": "After", + "in": "query", + "description": "Instructs the server to return elements that appear after the element referred to by the specified token.", + "type": "string" + }, + { + "name": "Accept-Datetime", + "in": "header", + "description": "Requests the server to respond with the state of the resource at the specified time.", + "type": "string" + }, + { + "name": "$Select", + "in": "query", + "description": "Used to select what fields are present in the returned resource(s).", + "type": "array", + "items": { + "type": "string", + "enum": [ + "key", + "label", + "content_type", + "value", + "last_modified", + "tags", + "locked", + "etag" + ] + }, + "collectionFormat": "csv" + } + ], + "responses": { + "200": { + "description": "Success", + "headers": { + "Sync-Token": { + "description": "Enables real-time consistency between requests by providing the returned value in the next request made to the server.", + "type": "string" + } + } + }, + "default": { + "description": "Error response describing why the operation failed" + } + }, + "x-ms-examples": { + "CheckKeyValues": { + "$ref": "./examples/CheckKeyValues.json" + } + } + } + }, + "/kv/{key}": { + "get": { + "tags": ["KeyValues"], + "summary": "Gets a single key-value.", + "operationId": "GetKeyValue", + "consumes": [], + "produces": [ + "application/vnd.microsoft.appconfig.kv+json", + "application/json", + "application/problem+json" + ], + "parameters": [ + { + "name": "key", + "in": "path", + "description": "The key of the key-value to retrieve.", + "required": true, + "type": "string" + }, + { + "name": "label", + "in": "query", + "description": "The label of the key-value to retrieve.", + "type": "string" + }, + { + "$ref": "#/parameters/SyncTokens" + }, + { + "$ref": "#/parameters/ApiVersion" + }, + { + "name": "Accept-Datetime", + "in": "header", + "description": "Requests the server to respond with the state of the resource at the specified time.", + "type": "string" + }, + { + "name": "If-Match", + "in": "header", + "description": "Used to perform an operation only if the targeted resource's etag matches the value provided.", + "type": "string" + }, + { + "name": "If-None-Match", + "in": "header", + "description": "Used to perform an operation only if the targeted resource's etag does not match the value provided.", + "type": "string" + }, + { + "name": "$Select", + "in": "query", + "description": "Used to select what fields are present in the returned resource(s).", + "type": "array", + "items": { + "type": "string", + "enum": [ + "key", + "label", + "content_type", + "value", + "last_modified", + "tags", + "locked", + "etag" + ] + }, + "collectionFormat": "csv" + } + ], + "responses": { + "200": { + "description": "Success", + "schema": { + "$ref": "#/definitions/KeyValue" + }, + "headers": { + "Sync-Token": { + "description": "Enables real-time consistency between requests by providing the returned value in the next request made to the server.", + "type": "string" + }, + "ETag": { + "description": "An identifier representing the returned state of the resource.", + "type": "string" + }, + "Last-Modified": { + "description": "A UTC datetime that specifies the last time the resource was modified.", + "type": "string" + } + } + }, + "default": { + "description": "Error response describing why the operation failed", + "schema": { + "$ref": "#/definitions/Error" + } + } + }, + "x-ms-examples": { + "GetKeyValue": { + "$ref": "./examples/GetKeyValue.json" + }, + "GetKeyValue_IfMatch": { + "$ref": "./examples/GetKeyValue_IfMatch.json" + }, + "GetKeyValue_IfNoneMatch": { + "$ref": "./examples/GetKeyValue_IfNoneMatch.json" + } + } + }, + "put": { + "tags": ["KeyValues"], + "summary": "Creates a key-value.", + "operationId": "PutKeyValue", + "consumes": [ + "application/vnd.microsoft.appconfig.kv+json", + "application/vnd.microsoft.appconfig.kvset+json", + "application/json", + "text/json", + "application/*+json", + "application/json-patch+json" + ], + "produces": [ + "application/vnd.microsoft.appconfig.kv+json", + "application/json", + "application/problem+json" + ], + "parameters": [ + { + "name": "key", + "in": "path", + "description": "The key of the key-value to create.", + "required": true, + "type": "string" + }, + { + "name": "label", + "in": "query", + "description": "The label of the key-value to create.", + "type": "string" + }, + { + "name": "entity", + "in": "body", + "description": "The key-value to create.", + "schema": { + "$ref": "#/definitions/KeyValue" + } + }, + { + "$ref": "#/parameters/SyncTokens" + }, + { + "$ref": "#/parameters/ApiVersion" + }, + { + "name": "If-Match", + "in": "header", + "description": "Used to perform an operation only if the targeted resource's etag matches the value provided.", + "type": "string" + }, + { + "name": "If-None-Match", + "in": "header", + "description": "Used to perform an operation only if the targeted resource's etag does not match the value provided.", + "type": "string" + } + ], + "responses": { + "200": { + "description": "Success", + "schema": { + "$ref": "#/definitions/KeyValue" + }, + "headers": { + "Sync-Token": { + "description": "Enables real-time consistency between requests by providing the returned value in the next request made to the server.", + "type": "string" + }, + "ETag": { + "description": "An identifier representing the returned state of the resource.", + "type": "string" + } + } + }, + "default": { + "description": "Error response describing why the operation failed", + "schema": { + "$ref": "#/definitions/Error" + } + } + }, + "x-ms-examples": { + "PutKeyValue": { + "$ref": "./examples/PutKeyValue.json" + }, + "PutKeyValue_IfMatch": { + "$ref": "./examples/PutKeyValue_IfMatch.json" + } + } + }, + "delete": { + "tags": ["KeyValues"], + "summary": "Deletes a key-value.", + "operationId": "DeleteKeyValue", + "consumes": [], + "produces": [ + "application/vnd.microsoft.appconfig.kv+json", + "application/json", + "application/problem+json" + ], + "parameters": [ + { + "name": "key", + "in": "path", + "description": "The key of the key-value to delete.", + "required": true, + "type": "string" + }, + { + "name": "label", + "in": "query", + "description": "The label of the key-value to delete.", + "type": "string" + }, + { + "$ref": "#/parameters/SyncTokens" + }, + { + "$ref": "#/parameters/ApiVersion" + }, + { + "name": "If-Match", + "in": "header", + "description": "Used to perform an operation only if the targeted resource's etag matches the value provided.", + "type": "string" + } + ], + "responses": { + "200": { + "description": "Success", + "schema": { + "$ref": "#/definitions/KeyValue" + }, + "headers": { + "Sync-Token": { + "description": "Enables real-time consistency between requests by providing the returned value in the next request made to the server.", + "type": "string" + }, + "ETag": { + "description": "An identifier representing the returned state of the resource.", + "type": "string" + } + } + }, + "204": { + "description": "Success", + "headers": { + "Sync-Token": { + "description": "Enables real-time consistency between requests by providing the returned value in the next request made to the server.", + "type": "string" + } + } + }, + "default": { + "description": "Error response describing why the operation failed", + "schema": { + "$ref": "#/definitions/Error" + } + } + }, + "x-ms-examples": { + "DeleteKeyValue": { + "$ref": "./examples/DeleteKeyValue.json" + }, + "DeleteKeyValue_IfMatch": { + "$ref": "./examples/DeleteKeyValue_IfMatch.json" + } + } + }, + "head": { + "tags": ["KeyValues"], + "summary": "Requests the headers and status of the given resource.", + "operationId": "CheckKeyValue", + "consumes": [], + "produces": [], + "parameters": [ + { + "name": "key", + "in": "path", + "description": "The key of the key-value to retrieve.", + "required": true, + "type": "string" + }, + { + "name": "label", + "in": "query", + "description": "The label of the key-value to retrieve.", + "type": "string" + }, + { + "$ref": "#/parameters/SyncTokens" + }, + { + "$ref": "#/parameters/ApiVersion" + }, + { + "name": "Accept-Datetime", + "in": "header", + "description": "Requests the server to respond with the state of the resource at the specified time.", + "type": "string" + }, + { + "name": "If-Match", + "in": "header", + "description": "Used to perform an operation only if the targeted resource's etag matches the value provided.", + "type": "string" + }, + { + "name": "If-None-Match", + "in": "header", + "description": "Used to perform an operation only if the targeted resource's etag does not match the value provided.", + "type": "string" + }, + { + "name": "$Select", + "in": "query", + "description": "Used to select what fields are present in the returned resource(s).", + "type": "array", + "items": { + "type": "string", + "enum": [ + "key", + "label", + "content_type", + "value", + "last_modified", + "tags", + "locked", + "etag" + ] + }, + "collectionFormat": "csv" + } + ], + "responses": { + "200": { + "description": "Success", + "headers": { + "Sync-Token": { + "description": "Enables real-time consistency between requests by providing the returned value in the next request made to the server.", + "type": "string" + }, + "ETag": { + "description": "An identifier representing the returned state of the resource.", + "type": "string" + }, + "Last-Modified": { + "description": "A UTC datetime that specifies the last time the resource was modified.", + "type": "string" + } + } + }, + "default": { + "description": "Error response describing why the operation failed" + } + }, + "x-ms-examples": { + "CheckKeyValue": { + "$ref": "./examples/CheckKeyValue.json" + }, + "CheckKeyValue_IfMatch": { + "$ref": "./examples/CheckKeyValue_IfMatch.json" + }, + "CheckKeyValue_IfNoneMatch": { + "$ref": "./examples/CheckKeyValue_IfNoneMatch.json" + } + } + } + }, + "/labels": { + "get": { + "tags": ["Labels"], + "summary": "Gets a list of labels.", + "operationId": "GetLabels", + "consumes": [], + "produces": [ + "application/vnd.microsoft.appconfig.labelset+json", + "application/json", + "application/problem+json" + ], + "parameters": [ + { + "name": "name", + "in": "query", + "description": "A filter for the name of the returned labels.", + "type": "string" + }, + { + "$ref": "#/parameters/SyncTokens" + }, + { + "$ref": "#/parameters/ApiVersion" + }, + { + "name": "After", + "in": "query", + "description": "Instructs the server to return elements that appear after the element referred to by the specified token.", + "type": "string" + }, + { + "name": "Accept-Datetime", + "in": "header", + "description": "Requests the server to respond with the state of the resource at the specified time.", + "type": "string" + }, + { + "name": "$Select", + "in": "query", + "description": "Used to select what fields are present in the returned resource(s).", + "type": "array", + "items": { + "type": "string", + "enum": ["name"] + }, + "collectionFormat": "csv" + } + ], + "responses": { + "200": { + "description": "Success", + "schema": { + "$ref": "#/definitions/LabelListResult" + }, + "headers": { + "Sync-Token": { + "description": "Enables real-time consistency between requests by providing the returned value in the next request made to the server.", + "type": "string" + } + } + }, + "default": { + "description": "Error response describing why the operation failed", + "schema": { + "$ref": "#/definitions/Error" + } + } + }, + "x-ms-examples": { + "GetLabels": { + "$ref": "./examples/GetLabels.json" + } + }, + "x-ms-pageable": { + "itemName": "items", + "nextLinkName": "@nextLink" + } + }, + "head": { + "tags": ["Labels"], + "summary": "Requests the headers and status of the given resource.", + "operationId": "CheckLabels", + "consumes": [], + "produces": [], + "parameters": [ + { + "name": "name", + "in": "query", + "description": "A filter for the name of the returned labels.", + "type": "string" + }, + { + "$ref": "#/parameters/SyncTokens" + }, + { + "$ref": "#/parameters/ApiVersion" + }, + { + "name": "After", + "in": "query", + "description": "Instructs the server to return elements that appear after the element referred to by the specified token.", + "type": "string" + }, + { + "name": "Accept-Datetime", + "in": "header", + "description": "Requests the server to respond with the state of the resource at the specified time.", + "type": "string" + }, + { + "name": "$Select", + "in": "query", + "description": "Used to select what fields are present in the returned resource(s).", + "type": "array", + "items": { + "type": "string", + "enum": ["name"] + }, + "collectionFormat": "csv" + } + ], + "responses": { + "200": { + "description": "Success", + "headers": { + "Sync-Token": { + "description": "Enables real-time consistency between requests by providing the returned value in the next request made to the server.", + "type": "string" + } + } + }, + "default": { + "description": "Error response describing why the operation failed" + } + }, + "x-ms-examples": { + "CheckLabels": { + "$ref": "./examples/CheckLabels.json" + } + } + } + }, + "/locks/{key}": { + "put": { + "tags": ["Locks"], + "summary": "Locks a key-value.", + "operationId": "PutLock", + "consumes": [], + "produces": [ + "application/vnd.microsoft.appconfig.kv+json", + "application/json", + "application/problem+json" + ], + "parameters": [ + { + "name": "key", + "in": "path", + "description": "The key of the key-value to lock.", + "required": true, + "type": "string" + }, + { + "name": "label", + "in": "query", + "description": "The label, if any, of the key-value to lock.", + "type": "string" + }, + { + "$ref": "#/parameters/SyncTokens" + }, + { + "$ref": "#/parameters/ApiVersion" + }, + { + "name": "If-Match", + "in": "header", + "description": "Used to perform an operation only if the targeted resource's etag matches the value provided.", + "type": "string" + }, + { + "name": "If-None-Match", + "in": "header", + "description": "Used to perform an operation only if the targeted resource's etag does not match the value provided.", + "type": "string" + } + ], + "responses": { + "200": { + "description": "Success", + "schema": { + "$ref": "#/definitions/KeyValue" + }, + "headers": { + "Sync-Token": { + "description": "Enables real-time consistency between requests by providing the returned value in the next request made to the server.", + "type": "string" + }, + "ETag": { + "description": "An identifier representing the returned state of the resource.", + "type": "string" + } + } + }, + "default": { + "description": "Error response describing why the operation failed", + "schema": { + "$ref": "#/definitions/Error" + } + } + }, + "x-ms-examples": { + "PutLock": { + "$ref": "./examples/PutLock.json" + }, + "PutLock_IfMatch": { + "$ref": "./examples/PutLock_IfMatch.json" + } + } + }, + "delete": { + "tags": ["Locks"], + "summary": "Unlocks a key-value.", + "operationId": "DeleteLock", + "consumes": [], + "produces": [ + "application/vnd.microsoft.appconfig.kv+json", + "application/json", + "application/problem+json" + ], + "parameters": [ + { + "name": "key", + "in": "path", + "description": "The key of the key-value to unlock.", + "required": true, + "type": "string" + }, + { + "name": "label", + "in": "query", + "description": "The label, if any, of the key-value to unlock.", + "type": "string" + }, + { + "$ref": "#/parameters/SyncTokens" + }, + { + "$ref": "#/parameters/ApiVersion" + }, + { + "name": "If-Match", + "in": "header", + "description": "Used to perform an operation only if the targeted resource's etag matches the value provided.", + "type": "string" + }, + { + "name": "If-None-Match", + "in": "header", + "description": "Used to perform an operation only if the targeted resource's etag does not match the value provided.", + "type": "string" + } + ], + "responses": { + "200": { + "description": "Success", + "schema": { + "$ref": "#/definitions/KeyValue" + }, + "headers": { + "Sync-Token": { + "description": "Enables real-time consistency between requests by providing the returned value in the next request made to the server.", + "type": "string" + }, + "ETag": { + "description": "An identifier representing the returned state of the resource.", + "type": "string" + } + } + }, + "default": { + "description": "Error response describing why the operation failed", + "schema": { + "$ref": "#/definitions/Error" + } + } + }, + "x-ms-examples": { + "DeleteLock": { + "$ref": "./examples/DeleteLock.json" + }, + "DeleteLock_IfMatch": { + "$ref": "./examples/DeleteLock_IfMatch.json" + } + } + } + }, + "/revisions": { + "get": { + "tags": ["Revisions"], + "summary": "Gets a list of key-value revisions.", + "operationId": "GetRevisions", + "consumes": [], + "produces": [ + "application/vnd.microsoft.appconfig.kvset+json", + "application/json", + "application/problem+json" + ], + "parameters": [ + { + "name": "key", + "in": "query", + "description": "A filter used to match keys.", + "type": "string" + }, + { + "name": "label", + "in": "query", + "description": "A filter used to match labels", + "type": "string" + }, + { + "$ref": "#/parameters/SyncTokens" + }, + { + "$ref": "#/parameters/ApiVersion" + }, + { + "name": "After", + "in": "query", + "description": "Instructs the server to return elements that appear after the element referred to by the specified token.", + "type": "string" + }, + { + "name": "Accept-Datetime", + "in": "header", + "description": "Requests the server to respond with the state of the resource at the specified time.", + "type": "string" + }, + { + "name": "$Select", + "in": "query", + "description": "Used to select what fields are present in the returned resource(s).", + "type": "array", + "items": { + "type": "string", + "enum": [ + "key", + "label", + "content_type", + "value", + "last_modified", + "tags", + "locked", + "etag" + ] + }, + "collectionFormat": "csv" + } + ], + "responses": { + "200": { + "description": "Success", + "schema": { + "$ref": "#/definitions/KeyValueListResult" + }, + "headers": { + "Sync-Token": { + "description": "Enables real-time consistency between requests by providing the returned value in the next request made to the server.", + "type": "string" + } + } + }, + "default": { + "description": "Error response describing why the operation failed", + "schema": { + "$ref": "#/definitions/Error" + } + } + }, + "x-ms-examples": { + "GetRevisions": { + "$ref": "./examples/GetRevisions.json" + } + }, + "x-ms-pageable": { + "itemName": "items", + "nextLinkName": "@nextLink" + } + }, + "head": { + "tags": ["Revisions"], + "summary": "Requests the headers and status of the given resource.", + "operationId": "CheckRevisions", + "consumes": [], + "produces": [], + "parameters": [ + { + "name": "key", + "in": "query", + "description": "A filter used to match keys.", + "type": "string" + }, + { + "name": "label", + "in": "query", + "description": "A filter used to match labels", + "type": "string" + }, + { + "$ref": "#/parameters/SyncTokens" + }, + { + "$ref": "#/parameters/ApiVersion" + }, + { + "name": "After", + "in": "query", + "description": "Instructs the server to return elements that appear after the element referred to by the specified token.", + "type": "string" + }, + { + "name": "Accept-Datetime", + "in": "header", + "description": "Requests the server to respond with the state of the resource at the specified time.", + "type": "string" + }, + { + "name": "$Select", + "in": "query", + "description": "Used to select what fields are present in the returned resource(s).", + "type": "array", + "items": { + "type": "string", + "enum": [ + "key", + "label", + "content_type", + "value", + "last_modified", + "tags", + "locked", + "etag" + ] + }, + "collectionFormat": "csv" + } + ], + "responses": { + "200": { + "description": "Success", + "headers": { + "Sync-Token": { + "description": "Enables real-time consistency between requests by providing the returned value in the next request made to the server.", + "type": "string" + } + } + }, + "default": { + "description": "Error response describing why the operation failed" + } + }, + "x-ms-examples": { + "CheckRevisions": { + "$ref": "./examples/CheckRevisions.json" + } + } + } + } + }, + "definitions": { + "Key": { + "type": "object", + "properties": { + "name": { + "type": "string", + "readOnly": true + } + } + }, + "KeyValue": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "label": { + "type": "string" + }, + "content_type": { + "type": "string" + }, + "value": { + "type": "string" + }, + "last_modified": { + "format": "date-time", + "type": "string" + }, + "tags": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "locked": { + "type": "boolean" + }, + "etag": { + "type": "string" + } + } + }, + "Label": { + "type": "object", + "properties": { + "name": { + "type": "string", + "readOnly": true + } + } + }, + "Error": { + "description": "Azure App Configuration error object.", + "properties": { + "type": { + "description": "The type of the error.", + "type": "string" + }, + "title": { + "description": "A brief summary of the error.", + "type": "string" + }, + "name": { + "description": "The name of the parameter that resulted in the error.", + "type": "string" + }, + "detail": { + "description": "A detailed description of the error.", + "type": "string" + }, + "status": { + "description": "The HTTP status code that the error maps to.", + "type": "integer" + } + }, + "readOnly": true + }, + "KeyListResult": { + "description": "The result of a list request.", + "type": "object", + "properties": { + "items": { + "description": "The collection value.", + "type": "array", + "items": { + "$ref": "#/definitions/Key" + } + }, + "@nextLink": { + "description": "The URI that can be used to request the next set of paged results.", + "type": "string" + } + } + }, + "KeyValueListResult": { + "description": "The result of a list request.", + "type": "object", + "properties": { + "items": { + "description": "The collection value.", + "type": "array", + "items": { + "$ref": "#/definitions/KeyValue" + } + }, + "@nextLink": { + "description": "The URI that can be used to request the next set of paged results.", + "type": "string" + } + } + }, + "LabelListResult": { + "description": "The result of a list request.", + "type": "object", + "properties": { + "items": { + "description": "The collection value.", + "type": "array", + "items": { + "$ref": "#/definitions/Label" + } + }, + "@nextLink": { + "description": "The URI that can be used to request the next set of paged results.", + "type": "string" + } + } + } + }, + "parameters": { + "": { + "name": "Sync-Token", + "in": "header", + "description": "Used to guarantee real-time consistency between requests.", + "type": "string" + }, + "ApiVersion": { + "name": "api-version", + "in": "query", + "description": "The API version to be used with the HTTP request.", + "required": true, + "type": "string" + }, + "Endpoint": { + "name": "endpoint", + "in": "path", + "description": "The endpoint of the App Configuration instance to send requests to.", + "required": true, + "type": "string", + "x-ms-skip-url-encoding": true, + "x-ms-parameter-location": "client" + } + }, + "x-ms-parameterized-host": { + "hostTemplate": "{endpoint}", + "useSchemePrefix": false, + "parameters": [ + { + "$ref": "#/parameters/Endpoint" + } + ] + } +} diff --git a/packages/samples/specs/misc/appconfig/keys.tsp b/packages/samples/specs/misc/appconfig/keys.tsp new file mode 100644 index 0000000000..54ce788d4b --- /dev/null +++ b/packages/samples/specs/misc/appconfig/keys.tsp @@ -0,0 +1,37 @@ +using TypeSpec.Http; +using TypeSpec.OpenAPI; + +namespace AppConfig; + +@route("/keys") +namespace KeysResource { + @doc("Gets a list of keys.") + @operationId("GetKeys") + @get + op list( + ...ApiVersion, + ...SyncTokenHeader, + ...AcceptDatetimeHeader, + @query name: string, + @header after: string, + ): { + ...Response<200>; + ...SyncTokenHeader; + @header contentType: "application/vnd.microsoft.appconfig.keyset+json" | "application/json"; + @body body: Page; + } | Error; + + @doc("Requests the headers and status of the given resource.") + @operationId("CheckKeys") + @head + op listHead( + ...ApiVersion, + ...SyncTokenHeader, + ...AcceptDatetimeHeader, + @query name: string, + @header after: string, + ): { + ...Response<200>; + ...SyncTokenHeader; + } | Error; +} diff --git a/packages/samples/specs/misc/appconfig/keyvalues.tsp b/packages/samples/specs/misc/appconfig/keyvalues.tsp new file mode 100644 index 0000000000..a6d4595bae --- /dev/null +++ b/packages/samples/specs/misc/appconfig/keyvalues.tsp @@ -0,0 +1,174 @@ +using TypeSpec.Http; +using TypeSpec.OpenAPI; + +@service({ + title: "App Config Service", +}) +namespace AppConfig; + +@doc("Used for /kv endpoints (key in query)") +model KeyFilters { + @doc("A filter for the name of the returned keys.") + @query + key?: string; + + @doc("A filter used to match labels") + @query + label?: string; +} + +@doc("Used for /kv/{id} endpoints (key in path)") +model KeyWithFilters { + @doc("A filter for the name of the returned keys.") + @path + key: string; + + @doc("A filter used to match labels") + @query + label?: string; +} + +@route("/kv") +namespace KeyValuesResource { + @doc("Gets a list of key-values.") + @operationId("GetKeyValues") + @get + op list( + ...ApiVersion, + ...SyncTokenHeader, + ...AcceptDatetimeHeader, + ...KeyFilters, + + @doc("Instructs the server to return elements that appear after the element referred to by the specified token.") + @query + After: plainDate, + + @doc("Used to select what fields are present in the returned resource(s).") + @query({ + format: "multi", + }) + $Select?: KeyField[], + ): { + ...Response<200>; + ...SyncTokenHeader; + + @header + contentType: "application/vnd.microsoft.appconfig.keyset+json" | "application/json"; + + @body body: Page; + } | Error; + + @doc("Gets a list of key-values.") + @operationId("CheckKeyValues") + @head + op listHead( + ...AcceptDatetimeHeader, + ...KeyFilters, + + @doc("Instructs the server to return elements that appear after the element referred to by the specified token.") + @query + After: plainDate, + + @doc("Used to select what fields are present in the returned resource(s).") + @query({ + format: "multi", + }) + $Select?: KeyField[], + ): { + ...Response<200>; + ...SyncTokenHeader; + } | Error; + + @doc("Gets a single key-value.") + @operationId("GetKeyValue") + @get + op read( + ...ETagHeaders, + ...AcceptDatetimeHeader, + ...KeyWithFilters, + + @doc("Used to select what fields are present in the returned resource(s).") + @query({ + format: "multi", + }) + $Select?: KeyField[], + ): { + ...Response<200>; + ...KeyValueHeaders; + + @header + contentType: "application/vnd.microsoft.appconfig.kv+json" | "application/json"; + + @body body: KeyValue; + } | Error; + + @doc("Requests the headers and status of the given resource.") + @operationId("CheckKeyValue") + @head + op readHead(...ETagHeaders, ...AcceptDatetimeHeader, ...KeyWithFilters): { + ...Response<200>; + ...SyncTokenHeader; + ...LastModifiedHeader; + } | Error; + + @doc("Creates a key-value.") + @operationId("PutKeyValue") + @put + op createOrUpdate( + ...ETagHeaders, + ...KeyWithFilters, + @header contentType: + | "application/vnd.microsoft.appconfig.kv+json" + | "application/vnd.microsoft.appconfig.kvset+json" + | "application/json" + | "text/json" + | "application/*+json" + | "application/json-patch+json", + @body entity: KeyValue, + ): { + ...Response<200>; + ...KeyValueHeaders; + + @header + contentType: "application/vnd.microsoft.appconfig.kv+json" | "application/json"; + + @body body: KeyValue; + } | Error; + + @doc("Updates a key-value pair") + @operationId("UpdateKeyValue") + @post + op createOrUpdate2( + ...ApiVersion, + ...SyncTokenHeader, + ...ETagHeaders, + ...KeyWithFilters, + @header contentType: "application/json-patch+json", + @body jsonPatch: string[], + ): { + ...Response<200>; + ...KeyValueHeaders; + + @header + contentType: "application/vnd.microsoft.appconfig.kv+json" | "application/json"; + + @body body: KeyValue; + } | Error; + + @doc("Deletes a key-value.") + @operationId("DeleteKeyValue") + @delete + op delete(...ApiVersion, ...SyncTokenHeader, ...KeyWithFilters, @header ifMatch: string): { + ...Response<200>; + ...SyncTokenHeader; + ...ETagHeader; + + @header + contentType: "application/vnd.microsoft.appconfig.kv+json" | "application/json"; + + @body body: KeyValue; + } | { + ...Response<204>; + ...SyncTokenHeader; + } | Error; +} diff --git a/packages/samples/specs/misc/appconfig/labels.tsp b/packages/samples/specs/misc/appconfig/labels.tsp new file mode 100644 index 0000000000..60f934c00f --- /dev/null +++ b/packages/samples/specs/misc/appconfig/labels.tsp @@ -0,0 +1,45 @@ +using TypeSpec.Http; +using TypeSpec.OpenAPI; + +namespace AppConfig; + +@route("/labels") +namespace LabelsResource { + @doc("Gets a list of labels.") + @operationId("GetLabels") + @get + op list( + ...ApiVersion, + ...SyncTokenHeader, + ...AcceptDatetimeHeader, + @query name?: string, + @query after?: string, + ): { + ...Response<200>; + ...SyncTokenHeader; + + @header + contentType: "application/vnd.microsoft.appconfig.labelset+json" | "application/json"; + + @body body: Page